Access VBA質問箱 IV

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

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


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

【12232】レコードの検索 12/12/28(金) 11:11 質問[未読]
【12233】Re:レコードの検索 かるびの 12/12/29(土) 1:44 回答[未読]
【12235】Re:レコードの検索 13/1/8(火) 12:36 質問[未読]
【12236】Re:レコードの検索 13/1/8(火) 16:06 質問[未読]
【12237】Re:レコードの検索 かるびの 13/1/9(水) 2:54 回答[未読]
【12239】Re:レコードの検索 13/1/9(水) 11:35 質問[未読]
【12240】Re:レコードの検索 13/1/9(水) 12:59 発言[未読]
【12241】Re:レコードの検索 13/1/9(水) 13:31 質問[未読]
【12242】Re:レコードの検索 かるびの 13/1/10(木) 1:25 回答[未読]
【12243】Re:レコードの検索 13/1/10(木) 9:46 質問[未読]
【12244】Re:レコードの検索 13/1/10(木) 12:52 お礼[未読]

【12232】レコードの検索
質問    - 12/12/28(金) 11:11 -

引用なし
パスワード
   こんにちは
初歩的なことかもしれませんが教えてください

フォームからレコードの検索をしたいのですが、
一レコードごとにコードを持っているのですが、重複しています。
なぜなら会社の決まりで年度初めにもう一度1に戻るからです。

なので検索の方法として年とコードの二つから検索したいです。
フォームにはテキストボックスが二つあり
それぞれ
「指定年度」
「指定コード」というテキストボックスと
コマンド1というボタンがあります

検索をかけたいクエリに新しく
日付コード:year([日付])&[コード]
という新しいフィールドを作り、

Private Sub コマンド1_Click()
If (Not IsNull(Me!指定年度)) And (Not IsNull(Me!指定コード)) Then
With Me.Recordset

.FindFirst [指定年度] & [指定コード] = Me!日付コード


End With
End If

End Sub

というコードを書いたのですがさっぱり動きません
正しいコードを教えていただけませんでしょうか?

【12233】Re:レコードの検索
回答  かるびの  - 12/12/29(土) 1:44 -

引用なし
パスワード
    第1に、FindFirstメソッドの引数の書き方がまずいですね。

>.FindFirst [指定年度] & [指定コード] = Me!日付コード

 まず、Me!に続くのは、フォーム上のコントロールの名前でなければなりません。
 日付コードはクエリのフィールド名であって、コントロール名ではありません。


 次に、.FindFirstメソッドの引数は、文字列でなければなりません。
 上記コードでは、引数に条件式が指定されています。
条件式は、それが評価されると、True又はFalseが返るわけですが、
True又はFalseという値は文字列ではありません。


 さらに、.FindFirstメソッドの引数は、条件式を文字列として指定します。
 文字列とするのだから、ダブルコーテーションで括られている必要があります。
   rs.FindFirst "地区ID = 123"
 
 条件式は、通常、「フィールド名=値」という形をとります。 
 ただ、値のところの書き方は少しやっかいです。
 フィールドが数値型ならば、
例えば「会員ID = 4567」のように何も括りませんが、
テキスト型ならば、例えば「都道府県 = "長野県"」のように
ダブルコーテーションで括り、
日付型ならば、例えば「受注日 = #2012/12/29#」のようにシャープで括ります。

 文字列としてダブルコーテーションで括られたものの中で、
さらにダブルコーテーションで括る必要がある場合、
内側のダブルコーテーションは、ダブルコーテーションの二重使いとします。
   "市町村 = ""栄村"" "

 条件式の値として、コントロールの値を使う場合、
コントロール名を文字列に含ませてはいけません。
コントロール名はダブルコーテーションの外に出す必要があります。
例えば、「誕生日」が日付型のフィールド名、
「txt生年月日」がテキストボックス名だとすると、
    "誕生日=#" & txt生年月日.Value & "# "
とします。
 なお、コントロールのValueプロパティは、
これを省略する書き方する人が大部分ですが、
私は、特に初級者は、省略してはいけないと思います。
省略しないことにより、オブジェクトとプロパティの関係を
より意識することになりますし、
数か月後にコードを見直したとき、「.Value」が付いていれば、
それが変数ではなく、オブジェクトだということが一目でわかります。


 フィールドのデータ型により条件式「フィールド名=値」における値の書き方が
異なるわけですが、問題は、「日付コード」フィールドが何型のフィールドなのかということです。
これは自分で考えてみてください。
ヒントは、&演算子です。


 第2に、FindFirstメソッドを実行しただけでは、
その結果はフォームには表示されません。
 FindFirstメソッドは、見つかったレコードを
レコードセットにおけるカレントレコードにするだけです。
 FindFirstメソッドの結果をフォームに反映させるためには、
フォームのカレントレコードが
レコードセットのカレントレコードとなるようにする、
つまり、フォームとレコードセットを同期させる
という操作が必要になります。
 これについては、BookMarkプロパティを調べてみてください。


 第3に、蛇足ですが、年とコードから検索したいという場合、
普通は、日付コードのようなフィールドを設けることはしません。
普通は、FindFirstメソッドの引数たる条件式に複数の条件式を入れ込みます。
   rs.FindFirst "都道府県 = ""長野県"" AND 受注日 = #2012/12/29# "

【12235】Re:レコードの検索
質問    - 13/1/8(火) 12:36 -

引用なし
パスワード
   ▼かるびの さん:

ご回答ありがとうございます。
なかなか理解するのに時間がかかり、返信が遅くなって申し訳ありません。
ですが、まだ理解できてないようです

Private Sub コマンド1_Click()
Dim myRec As DAO.Recordset

Set myRec = Forms!フォームA.RecordsetClone
myRec.FindFirst "日付 =#" & 指定年度.Value & "# " And "コード =" & 指定コード.Value & ""


If myRec.NoMatch Then
MsgBox ("ない")
Else
Forms!フォームA.Bookmark = myRec.Bookmark
End If
End Sub

と書いたのですが、myRec.FindFirst〜のところで
実行時エラー424オブジェクトが必要です
と出ました。

まだまだ理解できてないようです
ご指摘お願いします

【12236】Re:レコードの検索
質問    - 13/1/8(火) 16:06 -

引用なし
パスワード
   ▼かるびの さん:

Dim myRec As DAO.Recordset

Set myRec = Forms!フォームA.RecordsetClone
myRec.FindFirst "日付 =#" & Me!指定年度.Value & "# " And "コード =" & Me!指定コード.Value & ""

If myRec.NoMatch Then
MsgBox ("ない")
Else
Forms!フォームA.Bookmark = myRec.Bookmark
End If

End sub

と書き換えましたら前よりはましになりました
エラーが"型が一致しません" になりました(全然ましではないか)

かるびのさんのご指摘に
FindFirstメソッドの引数は、条件式を文字列として指定します
とありましたが、私のコードでは
条件式が文字列として指定されていないということでしょうか

【12237】Re:レコードの検索
回答  かるびの E-MAIL  - 13/1/9(水) 2:54 -

引用なし
パスワード
   >myRec.FindFirst "日付 =#" & Me!指定年度.Value & "# " And "コード =" & Me!指定コード.Value & ""

 まず、FindFirstメソッドの引数として目指すべき文字列は、例えば、
   "日付 = #2012/01/08# AND コード = 123"
という文字列です。

 「AND」の周囲によく注意してみてください。


 次に、「指定年度」テキストボックスです。
 この命名からすると、日付が入るのではなく、
例えば「2013」のような数値が入力されるように思えるのですが、
どうなのでしょうか。
 もし、「2013」のような数値が入力されるならば、例えば
   "Year(日付)=2013 AND コード=123"
のようにする必要があります。 

 
 最後に、蛇足ですが、
FindFirstメソッドの引数は、いったん変数に代入し、
変数を引数に指定した方がデバッグが楽です。

>Dim myRec As DAO.Recordset
Dim strJoken as String    

>Set myRec = Forms!フォームA.RecordsetClone
strJoken = "コード =" & 指定コード.Value
Debug.Print strJoken
myRec.FindFirst strJoken

 「Debug.Print strJoken」というコードにより、
変数strJokenに格納された文字列がイミディエイト・ウィンドウに表示される
ので、デバッグがより楽になります。
 きちんと動くことが確認できたら、
「Debug.Print strJoken」のコードは、消すか、コメントにします。

【12239】Re:レコードの検索
質問    - 13/1/9(水) 11:35 -

引用なし
パスワード
   ▼かるびの さん:
こんにちは、ご回答ありがとうございます

Dim myRec As DAO.Recordset
Dim strJoken As String

Set myRec = Forms!フォームA.RecordsetClone
strJoken = "日付 =#" & Me!指定年度.Value & "# And コード =" & Me!指定コード.Value & ""

Debug.Print strJoken
myRec.FindFirst strJoken

If myRec.NoMatch Then
MsgBox ("ない")
Else
Forms!フォームA.Bookmark = myRec.Bookmark
End If
End Sub

としました。すると3077演算子がありません、と出ました。

イミディエイトウインドウ便利ですね
日付はちゃんと日付 =#2012/04/01# と出ていて、コード=の後が空白になっているので、どうやらこちらが間違ってるようです

なかなか難しいです

> 次に、「指定年度」テキストボックスです。
> この命名からすると、日付が入るのではなく、
>例えば「2013」のような数値が入力されるように思えるのですが、
>どうなのでしょうか。
> もし、「2013」のような数値が入力されるならば、例えば
>   "Year(日付)=2013 AND コード=123"
>のようにする必要があります。 

これは確かにそうなんですが、そこまでやるとややこしいので、まずフィールドに入っている値そのままで、後で直そうと思っていました。

【12240】Re:レコードの検索
発言    - 13/1/9(水) 12:59 -

引用なし
パスワード
   ▼かるびの さん:
何度も何度も申し訳ありません
先ほどのコードは間違ってませんでした
私がテキストボックスに値を入れてないので空白になっていただけでした
ただ、値がないとエラーが出るようなので、作り直しています。
今直しています。お騒がせして申し訳ありませんでした。

【12241】Re:レコードの検索
質問    - 13/1/9(水) 13:31 -

引用なし
パスワード
   先ほどはお騒がせしてすみませんでした。
あれからいろいろ直して下記のようにしたら
とりあえずエラーはでなくなりました。

Dim myRec As DAO.Recordset
Dim strJoken As String
If IsNull(Me!指定コード.Value) Then
MsgBox "コードを指定して下さい"
Exit Sub
Else

Set myRec = Forms!フォームA.RecordsetClone
strJoken = Year(日付) = Me!指定年度.Value And コード = " & Me!指定コード.Value"
Debug.Print strJoken
myRec.FindFirst strJoken

If myRec.NoMatch Then
MsgBox ("ない")
Else
Forms!フォームA.Bookmark = myRec.Bookmark
End If
End If
End Sub

ですが、実際に走らせると実在する年度とコードが存在するにもかかわらず
ない とメッセージが出て終わってしまいます。
年度を年度、コードをコードと認識してないのでしょうか

【12242】Re:レコードの検索
回答  かるびの  - 13/1/10(木) 1:25 -

引用なし
パスワード
   >strJoken = Year(日付) = Me!指定年度.Value And コード = " & Me!指定コード.Value"

 本当にこのコードですか。
 もし、このコードのままであれば、この行でエラーになるはずです。

 また、strJokenに格納された値はどうなっていますか。
 目指すべき文字列となっていますか。
 そのためのイミディエイト・ウィンドウですよ。


 コードを1行ずつ実行させて、strJokenに然るべき値が格納されているかなど
チェックしつつ、確認してみましょう。

【12243】Re:レコードの検索
質問    - 13/1/10(木) 9:46 -

引用なし
パスワード
   ▼かるびの さん:
ご回答ありがとうございます。
長々とお付き合いいただき申し訳ないです

>strJoken = Year(日付) = Me!指定年度.Value And コード = " & Me!指定コード.Value"
>
> 本当にこのコードですか。
> もし、このコードのままであれば、この行でエラーになるはずです。

本当にそのコードなのです。
strJokenに格納された値はFalseになっています
最初にTrueかFalseが帰るとのことなので
値がヒットしないという意味なのかなとつまり
ないというメッセージと同じ意味だと思ってスルーしてました。
もしかしてエラーというのはこのことですか?

【12244】Re:レコードの検索
お礼    - 13/1/10(木) 12:52 -

引用なし
パスワード
   かるびの様

おかげさまで、下記コードでうまくいきました
Private Sub コマンド1_Click()

Dim myRec As DAO.Recordset
Dim strJoken As String
If IsNull(Me!指定コード.Value) Then
MsgBox "コードを指定下さい"
Exit Sub
Else

Set myRec = Forms!フォームA.RecordsetClone
strJoken = "Year(日付) =" & Me!指定年度.Value & "" & " And " & "コード =" & Me!指定コード.Value & ""
'Debug.Print strJoken
myRec.FindFirst strJoken
'Debug.Print myRec("コード")

If myRec.NoMatch Then
MsgBox ("ない")
Else
Forms!フォームA.Bookmark = myRec.Bookmark
End If
End If
End Sub

ネットで調べてみたのですが、最初にイミディエイトウインドウに出ていたFalseは、私の書いたコードが比較式と判断されて、当然=ではないからFALSEと出ていたのですね。で、式自体はエラーではないと。
長々と訳の分からないことを書いて申し訳ありませんでした。
また何かありましたら、この掲示板にお邪魔すると思いますが
よろしくお願いします。

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