Access VBA質問箱 IV

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

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


1842 / 2272 ツリー ←次へ | 前へ→

【5002】レコードの検索について 05/5/11(水) 15:43 質問[未読]
【5003】Re:レコードの検索について 小僧 05/5/11(水) 16:21 回答[未読]
【5004】Re:レコードの検索について 05/5/11(水) 16:33 質問[未読]
【5005】Re:レコードの検索について 小僧 05/5/11(水) 16:41 回答[未読]
【5006】Re:レコードの検索について 05/5/11(水) 16:49 質問[未読]
【5007】Re:レコードの検索について 小僧 05/5/11(水) 17:35 回答[未読]
【5008】Re:レコードの検索について 小僧 05/5/11(水) 17:40 発言[未読]
【5009】ありがとうございました 05/5/11(水) 17:40 お礼[未読]

【5002】レコードの検索について
質問    - 05/5/11(水) 15:43 -

引用なし
パスワード
   下記のプログラムを実行するとエラーがでて困ってます。
参考書を真似て作ってるので何が悪いのか分かりません。
助けてください。

Public Sub 案件検討検索()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Dim name As String     '担当者
Dim jyoutai As String    '案件状態(未完了 終了)
Dim datestart As Date    '設計受付日start
Dim dateend As Date     '設計受付日end
Dim no As Integer      '検索開始カレント行
Dim fld As ADODB.Field
Dim moji As String

Set cn = Application.CurrentProject.Connection
Set rs = New ADODB.Recordset
  rs.Source = "T_003案件検討"
  rs.CursorType = adOpenStatic
  rs.ActiveConnection = cn
  rs.Open "T_003案件検討", cn, adOpenStatic, adLockReadOnly
  rs.MoveFirst

name = ([Forms]![F_003Search]![コンボ5]): no = 0

Do While True
  rs.Find name, no '←ここでエラーになります。
  If rs.EOF = True Then Exit Do
  For Each fld In rs.Fields
    moji = moji & fld & "  "
  Next
  Debug.Print moji
  moji = ""
  no = no + 1
Loop

cn.Close
Set cn = Nothing
End Sub

【5003】Re:レコードの検索について
回答  小僧  - 05/5/11(水) 16:21 -

引用なし
パスワード
   ▼爺 さん:
こんにちは。

T_003案件検討のフィールドにおそらく名前に相当するフィールドが
存在すると思われるのですが…。

仮に「担当者」とすると

>  rs.Find name, no '←ここでエラーになります。
   rs.Find "担当者 = '" & name, & "'", no

こんな感じに変えるとうまくいくと思うのですがいかがでしょうか?

【5004】Re:レコードの検索について
質問   E-MAIL  - 05/5/11(水) 16:33 -

引用なし
パスワード
   早速の回答ありがとうございます。

>T_003案件検討のフィールドにおそらく名前に相当するフィールドが
>存在すると思われるのですが…。

あります。氏名(1)です。すみませんでした。

>   rs.Find "担当者 = '" & name, & "'", no

二つ目の & でコンパイルエラーとなります。どうすればよいですか?

【5005】Re:レコードの検索について
回答  小僧  - 05/5/11(水) 16:41 -

引用なし
パスワード
   ▼爺 さん:
すみません。
おかしな所にカンマが残ってしまいました。

>>   rs.Find "担当者 = '" & name, & "'", no

→   rs.Find "[氏名(1)] = '" & name & "'", no

こちらでいかがでしょう?

【5006】Re:レコードの検索について
質問   E-MAIL  - 05/5/11(水) 16:49 -

引用なし
パスワード
   ありがとうございました。解決です。
ただ、Findメソッドに関して参考書をみても、この様な記述のしかたが
ありませんでした。なぜ、この様な記述でOKとなるのかまた、Findに関
して、詳しく教えていただきたいのですが・・・。
面倒でなければお願いします。

【5007】Re:レコードの検索について
回答  小僧  - 05/5/11(水) 17:35 -

引用なし
パスワード
   ▼爺 さん:
Visual Basicのヘルプはお持ちしょうか?
詳しくはそちらを参照してください。

Find メソッドにも2種類(?)あり、
ADO で使用する Find メソッドとなります。


今回は「T_003案件検討」の「氏名(1)」が変数 name と等しい事が条件となります。
>      氏名(1) = name

1) Find の引数は「"」で括る必要があります。
>     "氏名(1) = name"

2) 氏名(1) を[ ]で括ってフィールドである事を明示的に定義します。
>     "[氏名(1)] = name"

3) name は文字列型なので、「"」か「'」で括る必要があります。
  今回は「"」の括りの中で行うので「'」を使用します。
>     "[氏名(1)] = 'name'"

4) このままですと name は変数扱いにならないため、「"」の外に出します。
>     "[氏名(1)] = '" & name & "'"

うまく説明ができませんが、こんな感じで勘弁して下さい(笑)

【5008】Re:レコードの検索について
発言  小僧  - 05/5/11(水) 17:40 -

引用なし
パスワード
   ▼爺 さん:
お節介だとは思われますが、気づいた点をいくつか上げさせて頂きます。

>Dim name As String

VBAには「name」というプロパティ(ヘルプでNameで検索すると出て来ると思われます)が
存在するため、誤動作を防ぐためにも違う名前の変数にした方が良いと思われます。

>Dim no As Integer
上記と同じ理由で「Yes」「No」の「No」に間違われる可能性があります。

>name = ([Forms]![F_003Search]![コンボ5])
→ name = ([Forms]![F_003Search]![コンボ5].Value)
>moji = moji & fld & "  "
→ moji = moji & fld.Value & "  "

[コンボ5]、fld は省略された形であるので、[コンボ5]、 fld の何を使いたいのかを
明記するのを癖付けすると良いと思います。

>Set rs = New ADODB.Recordset
>rs.Open

「cn」 に対して行っているのと同様に、「rs」に対しても「Close」「Set rs = Nothing」と
オブジェクトの解放を行いましょう。
コードが終了しても自動的にオブジェクトが解放されるないものが存在する為です。
基本的には「Set」に対して「Nothing」で、「Open」に対して「Close」を行うのが良いと
思われます。

>あります。氏名(1)です。すみませんでした。

テーブルやフィールドの名前に記号をつけるのも避けたほうが無難かもしれません。
仮に「担当者」という名前のフィールドですと

>>rs.Find "[担当者] = '" & name & "'", no
>>rs.Find "担当者 = '" & name & "'", no

とどちらでも作動するコードが、氏名(1)ですと

>>rs.Find "[氏名(1)] = '" & name & "'", no
>>rs.Find "氏名(1) = '" & name & "'", no

下の方はエラーとなってしまいます。


「以下は自分だったらたこうする!」というコードです。
Find を用いずに Filter で担当者を抽出しております。

Public Sub 案件検討検索1()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Dim namae As String
Dim moji As String

  Set cn = Application.CurrentProject.Connection
  Set rs = New ADODB.Recordset

  rs.Open "T_003案件検討", cn, adOpenStatic, adLockReadOnly
  
  namae = [Forms]![F_003Search]![コンボ5].Value

  rs.Filter = "[氏名(1)] = '" & namae & "'"
  
  Do Until rs.EOF
  moji = ""
    For Each fld In rs.Fields
      moji = moji & fld.Value & "  "
    Next
    Debug.Print moji
  rs.MoveNext
  Loop
  
  rs.Close
  cn.Close
  Set rs = Nothing
  Set cn = Nothing
End Sub

【5009】ありがとうございました
お礼   E-MAIL  - 05/5/11(水) 17:40 -

引用なし
パスワード
   ありがとうございました。
初心者ですので、今後も沢山質問しますのでよろしくお願いします。

1842 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078230
(SS)C-BOARD v3.8 is Free