• ベストアンサー

VBAで表データの検索

アクティブセルの2列隣のデータを”Sheet2”から検索し、情報が見つかったセルの隣の列のデータをアクティブセルに返すために、下記のようなプログラムを組んでます。 ****************************************************** Set myRange=Worksheets("Sheet2").Range("A1:B256") B=ActiveCell.Offset(0,2) Set c=myRange.Find(B) ActiveCell.Value=C.Offset(0,1) ****************************************************** ほとんどうまくいくんですが、一部、期待と異なったデータが帰ってきます。例は以下のとおりです。   (1)検索値「#1」を検索すると、「#19」に該当するデータが帰ってくる   (2)検索値「#2」を検索すると、「#29」に該当するデータが帰ってくる   (3)検索値「#3」を検索すると、「#39」に該当するデータが帰ってくる   (4)検索値「#4」を検索すると、「#49」に該当するデータが帰ってくる   (5)検索値「#5」を検索すると、「#59」に該当するデータが帰ってくる   (6)検索値「#6」を検索すると、「#69」に該当するデータが帰ってくる   (7)検索値「#7」を検索すると、「#79」に該当するデータが帰ってくる   (8)検索値「N」を検索すると、アクティブセルの内容が消去される   (9)検索値「M」を検索すると、「14mm」に該当するデータが帰ってくる   (10)検索値「K」を検索すると、アクティブセルの内容が消去される。 なお、”Sheet2”には、#80、#79、#78・・・・と降順にデータが並んでおり、その後ろにA,B,C・・・とアルファベットが正順に並んでます。 何か、よい解決法はないでしょうか?

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

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

例えば、「#1」で検索したときに「#19」の前2文字の「#1」と一致しているとみなして処理されていると思われます。 検索が完全一致でよければ、  Set c = myRange.Find(What:=B, Lookat:=xlWhole) のような指定方法で行えばよろしいかと… なお、検索値がテーブルに無い場合を考慮すると、みつからない場合を  If c Is Nothing Then などで、チェックしておいたほうが良いと思われます。

Y-SAKATA
質問者

お礼

アドバイスいただいたとおりの指定方法を使ったら、解決しました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

Range.Findメソッドの引数LookAtで、完全一致を指定すればどうなるでしょうか。 検索( Find、FindNext ) http://www.optimizm.jp/006/excelvba_find.shtml

Y-SAKATA
質問者

お礼

アドバイスいただいたように、引数LookAtで完全一致”xlWhole”をしていしたら解決しました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • VBAについて

    VBAで本を見ながら以下の構文を記述してステップインで実行してみました。 Sub 同じ条件でデータ検索() Dim myRange As Range, srcRange As Range, _ myAddress As String, i As Integer Set srcRange = Range("F2:F10") Set myRange = srcRange.Find(What:=Range("C13").Value, _ LookIn:=xlValues) If Not myRange Is Nothing Then myAddress = myRange.Address i = 16 Do Cells(i, "C").Value = myRange.Offset(, -4).Value Set myRange = srcRange.FindNext(After:=myRange) i = i + 1 Loop Until myRange.Address = myAddress Else MsgBox "該当者がいません" End If End Sub これはテストの中間・期末の合計数により評価を「A」「B」「C」と分けている表の中からC13に入力した「A」「B」「C」いずれかに該当する人を表示します。VBEを起動させながらステップインして実行してみると、「A」「B」「C」いずれもきちんと検索して結果を表示してくれました。そこでボタンを作成して登録してみたところ、「A」はきちんと検索結果をだすのに「B」、「C」は”該当者なし”とでてしまう。(該当者がいるのに)ステップインで実行してもう一度見てみるとボタンに登録するまえは「A」「B」「C」きちんと格納されているのが確認できたのに登録後は「A」以外は格納されていないのです。なぜこのような状態になるのでしょうか?何がいけないのかさっぱりわかりません。VBAはまだ初めて2週間くらいでちんぷんかんぷんな状態ではあります。初心者にもわかるよう教えていただけたらありがたいです。よろしくお願いします

  • エクセル マクロ VBA について

    以下はセルB2.C2.D2.E2.F2をアクティブセルから右方向へ入力しています。ここでの入力とは"=" + "セルB2" というものです。一つずつ入力している為マクロが長くなります。短くシンプルなものにしたいです。ご教示お願いします。 ActiveCell.FormulaR1C1 = "=R2C2" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C3" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C4" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C5" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C6"

  • ExcelvbaのFindNext複数項目繰り返し

    Excelvba2013で、同じ検索条件で続けて検索取得していくのに、ネットで調べながらFindNextを使ってやっています。 "テーブル"シートのA列に検索したい分類項目が記載されていて、その隣のB列にデータがあります。分類項目は変動するため数は不明です。 そして、"データ"シートのC3,D3,E3・・・と分類項目が載っています。 C3の下のC4,C5,C6・・・に分類項目のC3のデータを入れていき、D3の下のD4,D5,D6・・・にD4のデータ、以降E列、F列と続いていきます。 とりあえず、現在、"データ"シートのC3の項目に対するデータは取得できています。以降、C3の項目のデータが満たされたらD3、E3・・・と"テーブル"シートのA列の分類項目をすべて満たすまで繰り返したいのですが、繰り返し処理のやり方がうまくできず、次の分類項目に進めずにいます。 以下のコードをどのように変えたらよいでしょうか? すいません、いつもお手数をおかけしています。 Sub 同じ条件でデータ検索繰り返し2() Dim myRange As Range, srcRange As Range, myAddress As String, i As Integer, p As Integer Application.ScreenUpdating = False p = 3 Set srcRange = Worksheets("テーブル").Range("A:A") 'テーブルのA列を格納 Set myRange = srcRange.Find(What:=Worksheets("データ").Cells(3, p).Value, LookIn:=xlValues, _ LookAt:=xlWhole) If Not myRange Is Nothing Then myAddress = myRange.Address i = 4 Do Cells(i, p).Value = myRange.Offset(, 1).Value Set myRange = srcRange.FindNext(After:=myRange) i = i + 1 Loop Until myRange.Address = myAddress End If If myRange.Address = myAddress Then Do p = p + 1 Cells(i, p).Value = myRange.Offset(, 1).Value Set myRange = srcRange.FindNext(After:=myRange) i = i + 1 Loop Until myRange.Address = myAddress Else End If End Sub

  • エクセルでデータを検索する際に・・・・

    検索したい文字がSheet1にB列にあります。 検索元のデータは Sheet2に5行目より1データにつき横200列ほど項目があるデータが 5000千ほどあります。 検索したい文字は 検索元のデータの3列目(C列)に存在しています。 これを、Sheet1の検索したい文字の横C列から 該当データの1列目より返していきたいのですが VLOOKUPの数式ではテキストで返り、セルに数式が残ってしまうため、 ここを検索元のデータと全く同じ(フォントや数式を含む)データを 抽出し貼付けて返したいのです。 VBAなどでこの検索処理を出来ないでしょうか? 教えてください、よろしくお願いいたしますm(__)m

  • VBAで違うファイルを検索

    Range("b1") = Cells.Find(What:=Range("a1")).Offset(0, 1) 上記のような式を使用すると、同シート内のA1に記載されている文字を検索し、 その隣のセルの内容を表示することができました。 今回求めたいのは、「A.xls」ファイルの「A1」セルに入力したコードと同じものを、 「B.xls」ファイルのC列の中で検索し、3つ隣のF列(同行)の内容を、 「A.xls」ファイルのA2に表示させるようにしたいです。 違うファイルから検索するにはどうしたらよいのでしょうか? どなたかご教示お願いします。

  • VBAを使ってエクセル上の表の集計を出したいのですが。

    初心者ゆえ稚拙な質問をお許しください。 A B C D E    C=引出額 1 * * * * 5    D=預入額 2 * * 1 * 4    E=合計額 3 * * * 1 5 エクセルでデーターを随時入力していくための上記のような表を多数のシートに作成したのですが、各シートに関数を入れていると容量的に重たくなってしまうので、VBAを使って下記のようにマクロを組んでみたのですが、引出額もしくは預入額に間違った値を入力した際削除すると、ひとつ上のレコードの値になってしまいます。 要望を言えば、引出額、預入額のセルに間違った値を入力した際削除しても余計な値が入らなく、該当のセルが空白の時は、その合計額のセルも空白にさせたいのですが、何かいい方法はないでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 6 Then ActiveCell.Offset(columnoffset:=1).Value = ActiveCell.Offset(rowoffset:=-1, columnoffset:=1).Value - ActiveCell.Offset(columnoffset:=-1).Value End If If Target.Column = 7 Then ActiveCell.Value = ActiveCell.Offset(rowoffset:=-1).Value + ActiveCell.Offset(columnoffset:=-1).Value End If End Sub Worksheet_Changeにこだわっているわけではありません。 よろしくお願いします。

  • Excel2013>VBA>sendkeys動ず

    Excel2013のVBAを使って自動更新をしようと思っています。    A  B   C 1  あ  AA  0 2  い  AB  1 3  う  AC  0 4  え  AA  1 5  お  AA  0 上記のようにシート内にデータはあります。B列「AA」C列の「ゼロ」を更新してC列の値を「1」にしようとしたときに、ピボットテーブルを使ってみようと思いました。 ピボットテーブルにてB列の「AA」、C列の「ゼロ」を抽出表示しました。   A  B  C 1 あ  AA  0 5 お  AA  0 思っていたように1行目と5行目が抽出されました。 後はゼロを別の値(仮に「2」とします)に変更するときに、カーソルの移動がうまくいきませんでした。 Range("C1").End(xlDown).Select Do ActiveCell.Offset(0, 0) = "2" ActiveCell.Offset(-1, 0).Select If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop しかし、これではカーソルが「C4」に移動してしまいました。 ピボットテーブルでたたんでしまっても、カーソルは見えないセルに移動するようです。 そこで、下記のように変更しました。 Range("C1").End(xlDown).Select Do ActiveCell.Offset(0, 0) = "2" Application.SendKeys "{UP}" If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop これは、カーソルがまったく動かずに最初の地点にいたままでした。 そこで、次はTABで移動することにしました。 Range("C1").Select Selection.SpecialCells(xlCellTypeVisible).Select Do ActiveCell.Offset(0, 0) = "2" Application.SendKeys "{tab}" If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop これでもカーソルは動きませんでした。 どうにかしてsendkeysの動かし方、もしくは更新でもっとうまいやり方をご存知の方、是非教えてください。よろしくお願いいたします。

  • excel VBAの検索マクロを、OOo CALCで動かしたいのですが

    excel VBAの検索マクロを、OOo CALCで動かしたいのですが、、、 お助けください。VBA素人で、OOo BASICは全くわからない者です。よろしくおねがいします。 シート1を検索データの入力及び検索結果の表示画面として使い、 シート2に検索先のデータが入力されています。 検索先のデータは乱雑に入力されており、探したいデータが複数の列に点在し、 かつ、ひとつのセルにふたつのデータが入っていることもあります。 部分一致検索で、EXCELの検索機能の「次を検索」ボタンと同じ機能を果たすように作ったつもりです。 データが見つかった場合、シート2のデータをシート1にコピーするようになっています。 ソフトウェアのバージョンはcalc2.0と3.0です。 Excelでは動いているのですが、どう変えればcalcで使えるようになりますでしょうか? --------------------------------------------- Sub kensaku() 'sheet1のC4に検索したいデータを入力済 Dim A Set A = Range("sheet1!C4") Dim B As Range 'シート2を選択。 Sheets("sheet2").Select 'A1:S800の範囲をAの値で検索。 Set B = Range("A1:S800").Find(What:=A, _ after:=ActiveCell, SearchDirection:=xlNext, _ LookAt:=xlPart, MatchCase:=False, _ MatchByte:=False, SearchFormat:=False) '分岐 '見つからなかった場合、シート1の関数参照先のセルをクリアしてリセット。 If B Is Nothing Then MsgBox "見つかりません" Sheets("sheet1").Select Range("C2").ClearContents '見つかった場合、処理を続行する。 Else B.Activate 'A列へ移動。場合により空白セルを超える必要があるため10回繰り返す。 Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select 'A列からC列へ移動すると目的のデータが入った列に到達。 Selection.Offset(0, 2).Select 'その値をコピーしてシート1のC2へ貼付(関数の参照先) Selection.Copy Sheets("sheet1").Select Range("C2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False '範囲選択を解除 Application.CutCopyMode = False 'sheet2のアクティブセルを次の検索開始位置(16列右)へ移動 (条件に一致する次のデータを検索するため) Sheets("sheet2").Select Selection.Offset(0, 16).Select 'シート1に戻る Sheets("sheet1").Select End If End Sub

  • エクセル VBAで2つのデータを比較して、一致するものを検索したい

    以下のような事をしたいと思っています。 VBAは今まで使った事が殆どなく困っております。 仕事で作らなければならず、宜しくお願い致します。 エクセルVBAで、既存と新規という2つのシートから 2つの条件(A列とB列の完全一致)で行を検索して 一致したものを探し出します。 一致したら「新規シート」の該当した行の売上列のデータを 「既存シート」の該当月の列へコピーしたいと思っております。 また、「新規シート」には「既存シート」にないデータが 存在するので、一致から漏れた行は「既存シート」へ 新たに追加のデータとしてコピーしたいと思っています。 イメージ↓ 既存シート) 商品名 |製造地|6月(製造月の売上)|7月(製造月の売上) a     |あ   |¥150      | b     |い   |¥200      | (空白)  |(空白)|          | 新規シート) 商品名 |製造地 |7月(製造月の売上)| a     |あ   |¥300      | b     |い   |¥100      | c     |う   |¥250      | 上記の2シートで、商品名と製造地の2つが一致していれば 「新規シート」の7月の列のデータを「既存シート」の 7月の列にコピーし、「既存シート」に存在しない 「新規シート」の商品名”c”の行のデータを「既存シート」へ 新たに商品名”c”の行を作成しコピーしたいと思っています。 出来上がり後の(既存シート) 商品名 |製造地 |6月(製造月の売上)|7月(製造月の売上) a      |あ   |¥150      |¥300 b      |い   |¥200      |¥100 c      |う   |¥0        |¥250

専門家に質問してみよう