Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


48 / 500 ページ ←次へ | 前へ→

【12359】Re:複数のテキストボックスに入力した値...
回答  hatena  - 13/6/27(木) 10:17 -

引用なし
パスワード
   まず、

 intN = "Me.txt_BOX_'" & N & ".value'"

のコードでエラーになりますね。

"Me.txt_BOX_'" & N & ".value'" は、"Me.txt_BOX_2.value" というような文字列になりますが、それを数値型の変数に代入はできませんので。
コントロールの名称(文字列)でコントロールの値を参照すには、下記のような式になります。

Me.Controls("txt_BOX_1").Value

あるいは、Controls は規定のプロパティなので省略することもできます。

Me("txt_BOX_1").Value

次に、入力チェックするときのイベントは、更新後処理ではなく更新前処理の方がいいです。条件違反のときは、イベントをキャンセルすれば他のコントロールに移動しません。

自分以外のテキストボックスの重複値をチェックするという処理は共通なので、共通で使える関数を作成して、それを書くテキストボックスに関連付けるのがいいでしう。

フォームモジュールに下記の関数を作成します。

Private Function TyoufukuCheck()
  Dim i As Integer
  Dim N As Integer
  Dim V As Integer
  Dim ctl As Control

  For i = 1 To 5
    Me("txt_BOX_" & i).BackColor = vbWhite '背景色を初期化
  Next
  
  Set ctl = Me.ActiveControl '自分自身のコントロール
  If IsNull(ctl.Value) Then Exit Function '未入力なら何もしない
  N = Val(Mid(ctl.Name, 9)) '自分自身の番号
  V = ctl.Value
  For i = 1 To 20
    If i = N Then
    ElseIf V = Me("txt_BOX_" & i).Value Then
      Me("txt_BOX_" & i).BackColor = 8421631 '背景色を赤
      MsgBox "部品コードが重複しています!", vbCritical, "警告"
      ctl.SelStart = 0: ctl.SelLength = 255 '入力文字列を全選択
      DoCmd.CancelEvent       'イベントをキャンセル
      Exit For
    End If
  Next

End Function

フォームのデザインビューで部品コード入力用のテキストボックスをすべて選択した状態で、
プロパティの「更新前処理」欄に下記のように設定します。

=TyoufukuCheck()

これで重複した部品コードを入力した場合は、それを修正するまでテキストボックスから抜け出せません。


なお、部品コードは数値型との前提です。また、数値以外を入力した場合のチェックも追加したほうがいいでしょう。
・ツリー全体表示

【12358】複数のテキストボックスに入力した値の重...
質問  ちゃぴんこくん  - 13/6/27(木) 0:17 -

引用なし
パスワード
   初めまして!
部品問屋のイメージで得意先からの要求に対して出庫処理を登録するDBを作っています。

フォーム上には、部品コードと該当する部品の数量を入力するテキストボックスを各20個配置しています。
入力が終わった後、登録ボタンをクリックして、ループ処理で登録します。
ただ人が入力するため、同じ部品を重複してテキストボックスに入力してしまうことがあるため、登録前にチェックして重複を促して処理を中断するか、各テキストボックスに部品コードを入力した際に、先に入力したテキストボックスの値との重複確認させて改めたいと考えています。

ACCESS 2010
テキストボックス
  ・部品コード入力用:txt_BHN_1〜txt_BHN_20
  ・数量入力用   :txt_SU_1〜txt_SU_20

出来れば部品コードが入力された後にその他の19個のテキストボックスの値と重複チェックを行いその都度修正したいと考えています。
重複していればメッセージを表示して、入力したテキストボックスをクリアし、SetFocusしたいと思います。

当初は各テキストボックスのAfterUpdate処理に、以下のようにループを使ってテキストボックス名もカウントアップしてその他のテキストボックスを確認しようと考えました。

Private Sub txt_BOX_1_AfterUpdate()

  Dim i As Integer
  Dim N As Integer
  Dim intN As Integer

  i = 1
  N = 2

  For i = 1 To 20
  intN = "Me.txt_BOX_'" & N & ".value'"

  If IsNull(intN) = True Or intN = "" Then
  ’チェックするテクストボックスが空白ならば何もしない。

  Else

    If Me.txt_BOX_1.Value = intN Then

    MsgBox "部品コードが重複しています!", vbCritical, "警告"
    txt_BOX_1.SetFocus
    CMD_ADD.Visible = False     ’登録ボタンを非表示にする
    txt_BOX_1.BackColor = 8421631  ' 重複しているテキストボックスの背景を赤に
    Exit Sub
    
    End If
  
  End If

  N = N + 1
  i = i + 1

  Next

End Sub


これだと1個目のテキストボックスに対しては、その他のテキストボックスのチェックは可能なように思いますが、2番目以降のテキストボックスに対してチェックする場合に、自身を含めずにチェックするイメージが湧かず行き詰ってしまいました。

重複チェックといえば、レコードに登録されていないかのチェックの質問が多く
類似した質問を見つけることができず、どうかご教示の程、よろしくお願い申し上げます。
・ツリー全体表示

【12357】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/24(月) 21:57 -

引用なし
パスワード
   >  CurrentDb.Execute _
>  "SELECT bbb.* INTO bbb IN 'C:\Test\C.MDB' " & _
>  "FROM bbb IN 'C:\Test\B.MDB';"

転送先に既にテーブルが存在するときは、エラーになりますので、その場合も実行するには、
エラー処理でテーブルを削除する必要があります。
DROP TABLE では IN句が使えないようなので、OpenDatabase を使用しました。

Public Sub tensou1()
  Dim sSQL As String
  Dim db As DAO.Database
  
On Error GoTo E
  
  Set db = OpenDatabase("C:\Test\C.MDB")
  sSQL = "SELECT bbb.* INTO bbb " & _
  "FROM bbb IN 'C:\Test\B.MDB';"
  db.Execute sSQL
  
ExitSub:
  Exit Sub
E:
  Select Case Err
  Case 3010
    db.Execute "DROP TABLE bbb"
    Resume
  Case Else
    MsgBox Err & ":" & Err.Description
    Resume ExitSub
  End Select
End Sub

OpenDatabase も使っちゃあかん、ということなら、DoCmd.RunSQL を使って、下記のような方法もあります。

Public Sub tensou3()
  Dim sSQL As String
  
  sSQL = "SELECT bbb.* INTO bbb IN 'C:\Test\C.MDB' " & _
  "FROM T_Img IN 'C:\Test\B.MDB';"
  
  DoCmd.SetWarnings False
  DoCmd.RunSQL sSQL
  DoCmd.SetWarnings True
End Sub
・ツリー全体表示

【12356】Re:テーブルの追加による表示の変化
お礼  だいすけ  - 13/6/24(月) 17:48 -

引用なし
パスワード
   ▼hatena さん:

リレーションシップを使ったらきちんと整理できました!
ありがとうございました!!
・ツリー全体表示

【12355】Re:テーブルの追加による表示の変化
回答  hatena  - 13/6/24(月) 17:24 -

引用なし
パスワード
   >テーブル名はデータ1、データ2 です

では、そのテーブルをデザインビューで開いて、
すべてのフィールド名とデータ名を教えて下さい。
また、主キーがどれになっているかも教えて下さい。

同じことを何度も言わなくてすむように一度に回答してくれませんか。


とりあえず件数が増えてしまう原因ですが、2つのテーブルが結合されてないからです。2つのテーブルをキーフィールド同士で結合する必要があります。片方は主キー、片方は外部キーになります。
この説明で分かるならご自分でできるはずです。

分からないなら、上記の点について、答えてください。
・ツリー全体表示

【12354】Re:テーブルの追加による表示の変化
発言  だいすけ  - 13/6/24(月) 15:37 -

引用なし
パスワード
   ▼hatena さん:

テーブル名はデータ1、データ2 です
・ツリー全体表示

【12353】Re:テーブルの追加による表示の変化
回答  hatena  - 13/6/24(月) 14:22 -

引用なし
パスワード
   ▼だいすけ さん:
>>現状の2つのテーブルのテーブル名と含まれるフィールドの名前、データ型。
> フィールド名:データ1/データ2
> テーブル名:営業部署/担当者詳細
> データ型「データ型」とは「集計」のことですか?

この説明では、テーブル名は、営業部署 と 担当者詳細 ですが、

>SELECT [データ1].営業部署, Count([データ1].営業部署) AS 営業部署のカウント
>FROM [データ1], データ2
>GROUP BY [データ1].営業部署

SQLを見ると、テーブル名は、データ1、データ2 のはずですが、
どちらが正しいですか。

とりあえず現在ある2つのテーブルの名前を正確に教えて下さい。
で、そのテーブルをデザインビューで開いて、そこに表示される フィールド名 と データ型を教えて下さい。それと、どのフィールドが主キーかも教えて下さい(鍵マークがついています)。
・ツリー全体表示

【12352】Re:テーブルの追加による表示の変化
発言  だいすけ  - 13/6/24(月) 14:01 -

引用なし
パスワード
   ▼hatena さん:

対応ありがとうございます。
質問にお答えします。

>現状の2つのテーブルのテーブル名と含まれるフィールドの名前、データ型。
 フィールド名:データ1/データ2
 テーブル名:営業部署/担当者詳細
 データ型「データ型」とは「集計」のことですか?

>それぞれのテーブルの主キー設定
>現状のクエリをSQLビューして表示されるSQL文をコピーしてここに貼り付けてください。
SELECT [データ1].営業部署, Count([データ1].営業部署) AS 営業部署のカウント
FROM [データ1], データ2
GROUP BY [データ1].営業部署
・ツリー全体表示

【12351】Re:メインフォームでサブフォームのリン...
お礼  33  - 13/6/24(月) 12:01 -

引用なし
パスワード
   hatena様

ありがとうございました。
ご指導頂いた式で機能しました。
週末、なぜだろうと考えて投稿に踏み切りましたが、
ご相談して良かったです。

ありがとうございます。
・ツリー全体表示

【12350】Re:メインフォームでサブフォームのリン...
回答  hatena  - 13/6/24(月) 11:50 -

引用なし
パスワード
   ▼33 さん:
>サブフォーム単体を開いて操作すると機能します。
>メインフォームでのサブフォーム操作どの様にすれば良いのでしょうか?
>入力式は以下の通りです。
>
>Private Sub S子会社名_DblClick(Cancel As Integer)
>  Dim stDocName As String
>  Dim stLinkCriteria As String
>
>  stDocName = "子会社一覧"
>  
>   stLinkCriteria = "[T子会社名] = Forms![子会社名のサブフォーム]![S子会社名]"

上の1行を下記に書き換えてください。

  stLinkCriteria = "[T子会社名] = '" & Me.[S子会社名] & "'"

T子会社名 フィールドがテキスト型の場合です。数値型なら、下記で。

  stLinkCriteria = "[T子会社名] = " & Me.[S子会社名]
・ツリー全体表示

【12349】Re:テーブルの追加による表示の変化
回答  hatena  - 13/6/24(月) 11:17 -

引用なし
パスワード
   この情報だけでは状況が把握出来ません。
とりあえず下記の情報を提供ください。

現状の2つのテーブルのテーブル名と含まれるフィールドの名前、データ型。
それぞれのテーブルの主キー設定。
現状のクエリをSQLビューして表示されるSQL文をコピーしてここに貼り付けてください。
・ツリー全体表示

【12348】メインフォームでサブフォームのリンク機...
質問  33  - 13/6/24(月) 11:00 -

引用なし
パスワード
   サブフォーム有のフォーム作成中です。
サブフォーム データから他のフォームへリンク機能が可能かの質問です。

メインフォームへ親会社
サブフォームにグループ会社(子会社)一覧を表形式で表示。
サブフォームの子会社名をWクリックした際に、子会社詳細フォームへリンクする式を入力したのですが、メインフォームからでは機能しません。

サブフォーム単体を開いて操作すると機能します。
メインフォームでのサブフォーム操作どの様にすれば良いのでしょうか?
入力式は以下の通りです。

Private Sub S子会社名_DblClick(Cancel As Integer)
  Dim stDocName As String
  Dim stLinkCriteria As String

  stDocName = "子会社一覧"
  
  stLinkCriteria = "[T子会社名] = Forms![子会社名のサブフォーム]![S子会社名]"
  
  DoCmd.OpenForm stDocName, , , stLinkCriteria
  
End Sub
・ツリー全体表示

【12347】テーブルの追加による表示の変化
質問  だいすけ  - 13/6/24(月) 9:09 -

引用なし
パスワード
   おはようございます。初めて投稿させていただきます。
accessはまだ始めたばかりで当たり前のことを聞くかもしれませんが、
よろしくお願いします。

今私がしようとしていることは、2つのテーブルを統合して情報をもってこようとしています。
仮のテーブルの名称として。。。
●フィールド1)テーブル名:営業部署、集計:グループ化
●フィールド2)テーブル名:営業部署、集計:カウント
この時点で、営業部署の担当数を集計しています。
そしてここから更に営業部署の担当者を表示しようと
●フィールド3)テーブル名:担当者詳細、集計:グループ化
を入れると、テーブル2でまとめた集計数が変化して大きな数字になってしまいました。

これは一体なにが問題なのでしょうか?
説明が不足しているのならお答えしますので、皆様のお力を貸してください。
よろしくお願いします。
・ツリー全体表示

【12346】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/23(日) 16:34 -

引用なし
パスワード
   リンクテーブルにしなくても、ソース側もIN句で外部接続すれば、1回のクエリ実行ですみますね。

Public Sub tensou()

  CurrentDb.Execute _
  "SELECT bbb.* INTO bbb IN 'C:\Test\C.MDB' " & _
  "FROM bbb IN 'C:\Test\B.MDB';"


End Sub
・ツリー全体表示

【12345】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/23(日) 16:19 -

引用なし
パスワード
   ▼jakosan さん:
>>>B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です
>という条件に反するので申し訳ないですがNGです。
>それとこの方法だとたまにハングアップすることがあります。

OpenCurrentDatabase ではダメということですか。

なら、
リンクテーブルを作成して、それをテーブル作成クエリで外部MDBにテーブルを作成する、
ではどうですか。


Public Sub tensou()

  DoCmd.TransferDatabase acLink, "Microsoft Access", _
  "C:\Test\B.MDB", acTable, "bbb", "bbb"

  CurrentDb.Execute _
  "SELECT bbb.* INTO bbb IN 'C:\Test\C.Accdb' FROM bbb;"

  DoCmd.DeleteObject acTable, "bbb"


End Sub

すでにテーブルが存在するときなどのエラー処理は適宜追加してください。
・ツリー全体表示

【12344】Re:別ファイルのテーブルを別ファイルに...
質問  jakosan  - 13/6/22(土) 10:20 -

引用なし
パスワード
   ▼hatena さん:
>  appAccess.OpenCurrentDatabase "C:\Test\C.MDB"
>  …
>  "C:\Test\B.MDB", acTable, "bbb", "bbb"
というコードは
>>B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です
という条件に反するので申し訳ないですがNGです。
それとこの方法だとたまにハングアップすることがあります。
ほかにいい方法ってないでしょうか。
・ツリー全体表示

【12343】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/21(金) 23:04 -

引用なし
パスワード
   ▼jakosan さん:
>A.mdbというファイルのモジュールにtensou()という関数を書いたファイルを開いている状態で、B.mdbにあるbbbというテーブルをC.mdbに転送するVBAコートはつくれないでしょうか。
>B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です

B.mdbとC.mdbは、C:\Test にあるとして、

Public Sub tensou()
  Dim appAccess As Access.Application
  
  Set appAccess = CreateObject("Access.Application")
  appAccess.OpenCurrentDatabase "C:\Test\C.MDB"
  appAccess.DoCmd.TransferDatabase acImport, "Microsoft Access", _
  "C:\Test\B.MDB", acTable, "bbb", "bbb"
  
  appAccess.Quit
  Set appAccess = Nothing

End Sub
・ツリー全体表示

【12342】別ファイルのテーブルを別ファイルに転送
質問  jakosan  - 13/6/21(金) 21:21 -

引用なし
パスワード
   A.mdbというファイルのモジュールにtensou()という関数を書いたファイルを開いている状態で、B.mdbにあるbbbというテーブルをC.mdbに転送するVBAコートはつくれないでしょうか。
B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です。
APIを使うなどの高度なテクニックを使うのでもいいです。
A.mdbにB.mdbのbbbテーブルへのリンクテーブルをつくって、それをC.mdbに転送するコードをつくったら、C.mdbにB.mdbのbbbテーブルへのリンクテーブルが作られて失敗しました。
その失敗事例は過去ログにのっていましたが成功事例は見つかりませんでした。
いい方法はないとあきらめるべきでしょうか。
・ツリー全体表示

【12339】Re:パラメータが少なすぎます。1を指定...
お礼  まくりや  - 13/6/19(水) 10:28 -

引用なし
パスワード
   回答いただいた方、ありがとうございました。
できました。
・ツリー全体表示

【12338】Re:パラメータが少なすぎます。1を指定...
回答  hatena  - 13/6/18(火) 16:00 -

引用なし
パスワード
   ▼まくりや さん:
>クエリをそのままクリックするときちんとでるのに
>
>Dim db As DAO.Database
>Dim rsa As DAO.Recordset
>Set db = CurrentDb()
>Set rsa = db.OpenRecordset("クエリ名")
>MsgBox (rsa!項目)
>rsa.Close: Set rsa = Nothing
>db.Close: Set db = Nothing
>
>VBAで書くと、上記題名がでます。
>パラメータをフォームからとってくるクエリです。

パラメータクエリをDAOで実行するには、Parameters の設定が必要です。

クエリのパラメータが「Forms!フォーム1!テキスト1」として、下記のようにしてください。

Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim rsa As DAO.Recordset
Set db = CurrentDb()
Set qd = db.QueryDefs("クエリ名")
qd.Parameters("Forms!フォーム1!テキスト1") = Forms!フォーム1!テキスト1
Set rsa = qd.OpenRecordset
MsgBox (rsa!項目)
rsa.Close: Set rsa = Nothing
db.Close: Set db = Nothing
・ツリー全体表示

48 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1078281
(SS)C-BOARD v3.8 is Free