• ベストアンサー

VBAでの「番号」の検索について

お願いします。エクセルで注文書発行とその受入処理を作成してます。 注文書の明細を作成し、個々にID番号をつけてます。1、2、3・・・・連番です。受入処理で発行日付で注文データを検索しヒットしたものを別シートに縦に表示させ、「先頭」「次」「前」「最終」ってかんじのボタンをつけてデーターがくるくる変わるようにしてあります。この中の番号「1」の注文データを受入処理(受入済とあるセルに入力)し、注文履歴のシートに同じ番号を検索して上書きさせます。ところが、番号「1」なのに「10」のところを上書きします。ほかの番号は異常ないのですが・・・ マクロは '入力したデータをコピー Range("c5:c24").Copy '[T_注文]シートを選択 Sheets("T_注文").Select '最終行番号を取得 z = Range("a1").End(xlDown).Row '[番号]を検索 Set x = Range("a2:a" & z).Find(Range("T_受入処理!c5").Value) '既存データの修正 x.PasteSpecial _ Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=True 'コピーモードを解除 Application.CutCopyMode = False MsgBox "この品目の受入処理を完了しました。", vbOKOnly, "オービットベース:受入処理完了" です。どうしたらよいかおしえてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 > Set x = Range("a2:a" & z).Find(Range("T_受入処理!c5").Value) Set x = Range("a2:a" & z).Find(What:=Range("T_受入処理!c5").Value, _                 LookIn:=xlValues, _                 LookAt:=xlWhole) こんな風に書くのが無難です。 Find メソッドは Excel の検索ダイアログと連動してます。つまり、検索 ダイアログで   「セルの内容が完全に同一であるものを検索する」    をチェックしていない場合、Find メソッドも部分一致(LookIn:= xlPart) での検索になります。 Find メソッドにおいて、1 を検索して 10 までヒットするのは部分一致検索 になっているためでしょうね。 VBA で Find メソッドを使う場合、検索オプション(条件)がユーザーの 設定次第で変わってしまっては困りますよね? それで、   Find は検索オプションを明示して書いてやらないとダメ と言われるのです。   ※ 検索ダイアログでの検索オプションは Find メソッドに適用されます   ※ Find メソッドで設定した検索オプションは、検索ダイアログにも反映     されます この点はヘルプに記載されていますので、ご一読を。 また、Tips として、LookAt オプションは xlWhole 固定にしておくことです。 部分一致検索をしたければ、明示的に   *株式会社 のようにワイルドカードを使って検索語を設定すれば良いだけですから。 そうすることで、ご質問のような意図しない部分一致によるトラブルは ありませんし、また、前方一致、後方一致などを意図的に使い分けること も可能になってきます。   *株式会社   株式会社* 前株と後株の区別です。ご参考までに。

K-19New
質問者

お礼

ありがとうございました。 部分一致検索と、完全一致では記述がかわるのですね。 Find は検索オプションは省略せずにしっかりかきます。 今後ともおねがいします。 参考になりました。

その他の回答 (2)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

ANO.1です。 ごめんなさい。私の方が間違っていました。 >Find(Range(What:="T_受入処理!c5").Value,LookIn:=xlValues,LookAt:=xlWhole) Find(What:=Range("T_受入処理!c5").Value,LookIn:=xlValues,LookAt:=xlWhole) こうでした。 すいません。

K-19New
質問者

お礼

本当にありがとうございます 助かりました。 まだまだ、勉強が足りないですね。がんばります。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Find メソッドヘルプより LookAt 省略可能です。バリアント型 (Variant) の値を使用します。使用できる定数は、XlLookAt クラスの xlWhole または xlPart です。 xlWhole:全体一致 xlPart:部分一致 多分ですけど、部分一致になっているのでは? Findは省略して書くと余り良くないような事を読んだ記憶があります。 Find(Range(What:="T_受入処理!c5").Value,LookIn:=xlValues,LookAt:=xlWhole) としてみては?

K-19New
質問者

お礼

ありがとうございます。 Set x = Range("a2:a" & z).Find(Range(What:="T_受入処理!c5").Value, LookIn:=xlValues, LookAt:=xlWhole) エラーでした。 私のどこかミスなのでしょうね。分かりません。 エラーは 「コンパイルエラー 名前付引数がみつかりません。」 What:= が青く選択されてます。 再度教えてください。

関連するQ&A