• ベストアンサー

【エクセルVBA】指定した文字列の抽出方法について教えてください。

下記のように、"AAA-1"という文字列を指定しシート1のあるレンジを検索して見つかったらその下のセルのデーターをシート2にコピーしてやり、次に"AAA-2"という文字列を指定して同じように文字列を変えて繰り返し抽出したいのですがこの方法では抽出して欲しくない"AAA-11"や"AAA-12"も抽出されてしまいます。数字の文字数が規定ができれば解決しそうですがいまいちわかりません。アドバイスよろしくお願いいたします。 IDNo = "AAA-1" With Worksheets("Sheet1").Range("A1:P1") Set IDchoice = .Find(What:=IDNo, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False) If Not IDchoice Is Nothing Then FirstAddress = IDchoice.Address Do Sheets("DATA2").Select Cells(IDchoice.Row+1, IDchoice.Column).Copy Sheets("Sheet2").Select Cells(1, 1).PasteSpecial ・ ・

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 そのコードが、途中までですが、少し、コードの上半分と下半分の整合性がおかしいなって思いますが、例えば、以下のようにしたらよいと思います。 ただし、 abcAAA-1a は、OKとしますが、abcAAA-11a は、NGとした場合です。 上半分で、Worksheets("Sheet1") となっていますから、下も、Sheets("DATA2")ではなく、Worksheets("Sheet1")にしました。 Like演算子で、仕分けしました。 If Not IDchoice Is Nothing Then   FirstAddress = IDchoice.Address   Do   If Not IDchoice.Value Like "*" & IDNo & "#*" Then   i = i + 1   Worksheets("Sheet1").Cells(IDchoice.Row + 1, IDchoice.Column).Copy _   Worksheets("Sheet2").Cells(i, 1)   End If   Set IDchoice = .FindNext(IDchoice)   Loop Until IDchoice Is Nothing Or IDchoice.Address = FirstAddress End If '--------------------------------------

tetsufumosan
質問者

お礼

こんにちは、Like "*" & IDNo & "#*" の記述で解決できました。#は英数字一文字ということは自分で調べて分かっていたのですが記述方法がわからずうまく動きませんでした。本当にありがとうございました。また沢山の方に親切に回答いただき感謝しています。質問だけでなく自分の得意分野で回答をしてお礼の還元をしたいと思います。

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

その他の回答 (9)

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

#3 です。連続で本当に申し訳ありません。 お恥ずかしい限りですが、#5 のレスへ返信しておきます。 InStr 関数で切り分けするなら、次のようになります。  lngPos = InStr(1, IDchoice.Value, IDNo) + Len(IDNo)  If IsNumeric(Mid$(IDchoice.Value, lngPos, 1)) Then Len 関数の後の +1 が余計でした。切り分け方法は Wendy02 さんの ものが良いと思いますが、別方法として「こんな方法もあるんだ」 ぐらいで考えていただけると幸いです。 tetsufumosan 様、他回答者の皆様、お騒がせして申し訳ありません。 穴に入ってきますm(__)m

tetsufumosan
質問者

お礼

沢山の方に親切に回答いただき感謝しています。質問だけでなく自分の得意分野で回答をしてお礼の還元をしたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.9

#3 です。 ひとつ下、、は Row や Column を調べてセルを決めるより、単純に OFFSET を使う方がコードがすっきりします。 切り分けの方法は InStr関数 を使うより、Wendy02 さんのものの方 すっきりとして良い方法だと思います。 一応、実行できる形でコード全体をアップしてみます。 Sub Test()      Dim rngSA  As Range   Dim IDchoice As Range   Dim IDNo   As String   Dim firstAddress As String      IDNo = "AAA-1"      '検索範囲   Set rngSA = Worksheets("Sheet1").Range("A1:P1")   '初回検索   Set IDchoice = rngSA.Find( _     What:=IDNo, _     LookIn:=xlValues, _     LookAt:=xlPart, _     MatchByte:=False)      '初回検索の結果、セルが見つからない   If IDchoice Is Nothing Then     MsgBox "該当データはありません", vbInformation     'プログラム終了処理へ飛ばす     GoTo Terminate   End If      '初回検索の結果、セルが見つかったとき   firstAddress = IDchoice.Address   Do     '部分一致で検索されたセルの値をチェック     If Not IDchoice.Value Like "*" & IDNo & "#*" Then       'IDchoice のひとつ下のセルの値を転記       Sheets("Sheet2").Cells(1, 1).Value = _         IDchoice.Offset(1, 0).Value     End If     Set IDchoice = rngSA.FindNext(IDchoice)   Loop Until IDchoice Is Nothing Or IDchoice.Address = firstAddress    Terminate:   Set IDchoice = Nothing   Set rngSA = Nothing End Sub

全文を見る
すると、全ての回答が全文表示されます。
noname#112806
noname#112806
回答No.8

#1です。 #3への補足を受けて思ったのですが IDNo = "AAA-1" を IDNo = "AAA-1-" とすればいいのではないですか?

tetsufumosan
質問者

お礼

沢山の方に親切に回答いただき感謝しています。質問だけでなく自分の得意分野で回答をしてお礼の還元をしたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
noname#112806
noname#112806
回答No.7

#1です。 #3への補足を受けて思ったのですが IDNo = "AAA-1" を IDNo = "AAA-1-" とすればいいのではないですか?

全文を見る
すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

#3,4 です。 重ねて失礼しました。  If IsNumeric(Mid$(IDchoice.Value, lngPos, 1)) Then は  If Not IsNumeric(Mid$(IDchoice.Value, lngPos, 1)) Then ですね、、、穴があったら入りたい、、、

tetsufumosan
質問者

お礼

親切に何度も回答してくださりありがとうございます。早速試してみましたが"AAA-1"で指定しても"AAA-11"や"AAA-12"も抽出されてしまいます。

全文を見る
すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

#3 です。ごめんなさい。 Nothing してはダメですね。Do ループの中で値の判定処理とすべき でした。#3 はボツです。 Do  lngPos = InStr(1, IDchoice.Value, IDNo) + Len(IDNo) + 1  If IsNumeric(Mid$(IDchoice.Value, lngPos, 1)) Then    (処理)ここに挟む  End If Loop Until (条件句)

全文を見る
すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。KenKen_SP です。 部分一致検索でヒットしたセルの値を調べて、該当しなければ  Set IDchoice = Nothing すれば? 例えば、AAA-1 のあとが数字だったら「該当しない」とする なら、  Set IDchoice = .Find( _    What:=IDNo, _    LookIn:=xlValues, _    LookAt:=xlPart, _    MatchByte:=False)  '追加  lngPos = InStr(1, IDchoice.Value, IDNo) + Len(IDNo) + 1  If IsNumeric(Mid$(IDchoice.Value, lngPos, 1)) Then    Set IDchoice = Nothing  End If  '以下オリジナル  If Not IDchoice Is Nothing Then  (略) InStr 関数と Len 関数 で AAA-1 に続く次の文字が数字かどうか調べ て、数字だったら Nothing してます。こうすると、 AAA-1 はヒットするけれど、AAA-11 はヒット(正確にはヒットしても Nothing する)しなくなると思います。 試してないので、アイディアとして。他には、正規表現を使うとか? IDNo の具体例を数個ご提示いただけると、いろんな方法がレスされる と思います。

tetsufumosan
質問者

補足

回答ありがとうございます。IDNo の具体例としては下記の通りです。 FANAAA-1-1.csv←これを抽出しようと"AAA-1"と設定すると 下のIDNoもヒットしてしまいます。 LOADAAA-11-2.csv SECAAA-12OLD-3.csv

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

>"AAA-1"の前後にもいろいろな文字列がつくので"xlWhole"で"完全に一致"にすると検索にひっかからなくなるのでどうしたらよいものかと スペース・コロン[:]・アンダーバー[_]等の特定の文字列を数字の最後に付加するか、数字部分の桁数を揃えることをお奨めします。 これなら"AAA-1 ","AAA-1:","AAA-1_","AAA- 1","AAA-01"等で一致できますよね。

tetsufumosan
質問者

補足

実はその方法も考えたのですが、あくまで特定の文字列は"AAA-1"のみでその前後は不特定の文字列がつくので都合がよくありません。補足不足で申し訳ありません。

全文を見る
すると、全ての回答が全文表示されます。
noname#112806
noname#112806
回答No.1

実際に試していないので間違っていたらすみません。 >Set IDchoice = .Find(What:=IDNo, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False) この部分で検索していると思うのですが「LookAt:=xlPart」は部分一致なので一部分でも一致していれば抽出されます。 xlPartではなくxlWholeを指定すれば完全に一致する値だけを検索します。

tetsufumosan
質問者

補足

こんにちは、回答ありがとうございます。質問に補足しますと"AAA-1"の前後にもいろいろな文字列がつくので"xlWhole"で"完全に一致"にすると検索にひっかからなくなるのでどうしたらよいものかと頭を悩ませております。

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

関連するQ&A

  • EXCEL VBAでの 文字列検索

    セル内の文字列を部分一致で検索したいのですが、 下記の構文だと、検索対象シートを選択しなくてはならないため、 PGの動きが堅くなってしまいます。何かいい方法をご存知の方、 教えてください。 Selection.Find(What:=key, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate Cells.FindNext(After:=ActiveCell).Activate

  • エクセル 特定文字列のある列の削除と保存

    こんにちは いつもお世話になっています。 エクセル2010です 1行目に文字列が入力されています。 (1)1行目に特定文字列を含む列を削除するマクロ。 (2)1行目に特定文字列を含む列だけを残して、他はすべて削除するマクロ を教えてください。 2つ質問するのが不適当ならどちらか一方でも構いません。 指定したい文字列は複数ありますので「文字列A、文字列B、・・・」等で追記できる形だと助かります。フォーマットが決まっているので指定文字列を頻繁に変えることはありません。 特定行を削除するマクロはネット上でヒットしたんですが、列は見つかりませんでした。 マクロ記録で、文字列検索、列削除をしましたが、連携のさせ方がわかりません。 よろしくお願いします。 Sub Macro1() ' ' Macro1 Macro ' ' Rows("1:1").Select Selection.Find(What:="あ", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate Selection.FindNext(After:=ActiveCell).Activate Columns("A:A").Select Selection.Delete Shift:=xlToLeft End Sub

  • エクセルで検索と貼り付けのマクロを組みたい

    エクセルで次のようなマクロを組みたいのですがうまくいきません。 ・C5からBB6の範囲において、Aという文字が入っているセルを検索し、その4行下1列右にコピーしておいたものを値だけ貼り付ける。 検索範囲を指定したいのは同じシート内に他にもAという文字が入っているセルがあるからです。このマクロを実行すると何故かC5からBB6の範囲以外のセルを選択し、貼り付けてしまいます。どこがいけないのでしょうか。ぜひ、教えてください。お願いします。 Range("C5:BB6").Select Cells.Find(What:="A", After:=ActiveCell, LookIn:=xlValues,LookAt:= _ xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _False, MatchByte:=False, SearchFormat:=False).select Selection.Offset(4, 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _:=False, Transpose:=False

  • vbaで指定文字を含まない列を削除するとき

    vbaで指定文字を含まない列を削除したいです。 指定文字を含む列を削除するプログラムはできましたが、これを指定文字を含まない列を削除に変更したいです。 途中まで作ったこのプログラムを生かして、どう変更すれば含まないにできますか? 教えて頂けると助かります。 Private Sub CommandButton1_Click() Sheets("シート1").Select Do While (True) Rows("5:5").Select Set myselect = Selection.Find(What:="あああ", LookAt:=xlPart) If myselect Is Nothing Then Exit Do Columns(myselect.Column).Select Selection.Delete Shift:=xlUp Loop End Sub

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

    エクセルマクロVBAについて、こんなこと出来ますか? ■A列からAS列の1行目にヘッダー情報をもつデータベース ■A列に担当者名 ■A列にオートフィルタをかけて各担当ごとにデータを抽出したものを別シートに貼り付けて自動印刷したい ■担当者は都度変わるので、Criteria1:="xxx"というようには直接書けない(担当名を自動で抽出したい) ■担当者の数も都度変わる ■補足 一行のデータを特定の雛形に転記する必要があるので別シートに出したいです ちなみに、アナログで記録したコードは以下です。 Sub test1() Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="山田" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="斉藤" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="田中" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 End Sub これ、担当者の抽出を自動でなんとかなりませんか?

  • Excel VBE 検索結果がない時の対処方法

    いつもお世話になっております。 Excelで簡単な文字当てゲーム的なものを作っています 文字列(100個程度)の中から、ある文字列を探し出して、そのセルの文字色を塗り替えるというマクロを組んでいます。 検索部分は下記のように記述してあります。 検索文字列がある時にはうまく動作しますが 検索文字列がない時にはエラーになります。 検索文字列がない時の対処方法を教えて下さい。 よろしくお願いします。 kaitou = Range("g2").Value Range("G2").Select Selection.Copy Columns("B:B").Select Selection.Find(What:=kaitou, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate

  • ExcelのVBAでの抽出

    初心者です。よろしくお願いいたします。 sheet1の"A2"~"C6"に簡単な表を作りました。 A列に人の名前が入力されています。 そこで、A列の名前が"花子"のデータだけを抽出 してSheet2へコピーしたいのです。 そこで試行錯誤の上、下のような記述をしました。 Sub 抽出() Application.ScreenUpdating = False Sheets("sheet2").Activate Sheets("sheet2").Columns("A:C").Clear With Sheets("Sheet1") .Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:="花子", CopyToRange:=Sheets("sheet1").Range("A2"), Unique:=False End With Application.ScreenUpdating = True End Sub しかし、うまくいきません(TT) エラー:400 とかでるんですけど なにがいけなんでしょうか・・。 他にもAdvancedFilterを使うさいに気をつけること がありましたらご指導ください。 (項目行の中のセルが統合されていたりすると うまくいかない・・・とかあるんでしょうか。) よろしくご指導ください。お願いいたします。

  • excel 文字抽出マクロの編集についてですが・・・

    マクロで指定した文字を含むデータを抽出するマクロを 作っていたのですが、うまく作動しません。 どこが悪いか教えてください。 Sub 指定した文字データの抽出() Dim strMoji As String strMoji = InputBox("検索文字を入力してください") strMoji = "*" & strMoji & "*" Sheets("Sheet2").Activate Cells.Clear With Sheets("Sheet1") .Range("A2").AutoFilter Filde:=3, criterial:=strMoji .Range("A2").CurrentRegion.Copy _ Destination:=Sheets("Sheet2").Range("A2") .Range("A2").AutoFilter End With Sheets("Sheet2").Columns("A:D").AutoFit End Sub

  • VBAエラー:オブジェクト変数またはWithブロック変数が設定されていません。

    Book1.xlsのSheet1~Sheet8を選択し、それらのシート内から、ABCDEFGという文字検索をさせたいのですが、実行させると「実行時エラー'91':オブジェクト変数またはWithブロック変数が設定されていません。」というエラーとなってしまいます。 マクロの記録で作成したマクロを元にしているので、コードがおかしいとは思えないのですが・・・ どなたか、解決策を、ご教授下さいませ。 よろしくお願い致します。 ------------------ Sub TEST() Workbooks("Book1.xls").Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet7", "Sheet8")).Select Cells.Find _ (What:="ABCDEFG", _ After:=ActiveCell, _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ MatchByte:=False, _ SearchFormat:=False).Activate End Sub

  • エクセルで列抽出できる関数かマクロを探しています。

    エクセルで列抽出できる関数かマクロを探しています。 マクロ初心者です。 表の形は、 A1  B1  C1  D1  E1 容量 0.1 5.5 11 22 形式 NF30 NF63 NF125 NF250 カバー TCS … と、電気部品のモータ容量と定格電流で抽出したいのです。 行で抽出するととても見づらく、列で一気に見れるように (制御器選定スケールの様に)したいのです。 スケールだけで形式は選定できるのですが、カバーも選定するために 毎回カタログで確認するのは仕事の効率が良くなく 表を作成しようと思いたったのですが・・・ いろいろ探してみたのですが、今のところ見つからず 今試しているのが、表を一度コピーして列行を入れ替えて 別シートにコピーしたものを作成してからオートフィルタをかけて 抽出したデータを別シートにもう一度列行を入れ替えて貼り付けする 方法しか考え出せていません。 質問なんですが、 上記のように列抽出できる関数やマクロがあるのか? それとも一度行抽出に変えて最後に列に戻すやり方の方が良いのか? 又、そのやり方を初心者なりに作成してみたのですが 1回目は出来ても、容量が変わるとエラーが出てきて出来ません。 Sub Macro1() Range("A31").Select ActiveCell.FormulaR1C1 = "=Sheet1!R5C2" Range("J31").Select ActiveCell.FormulaR1C1 = "=Sheet1!R6C2" Range("J32").Select ActiveWindow.SmallScroll Down:=-9 Range("A1:X24").Select Range("A1:X24").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Range("A30:X31"), Unique:=False ActiveWindow.SmallScroll Down:=-12 Selection.Copy Sheets("Sheet1").Select Range("F1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Sheets("Sheet3").Select Application.CutCopyMode = False ActiveSheet.ShowAllData End Sub たぶん、行列の入れ替えが上手くいかないのかなとは素人ながらに考えて 色んなサイトで調べてみていじってみるのですが、なかなか上手くいきません。 皆様、宜しくお願いいたします。

このQ&Aのポイント
  • プリンターとルーターの接続についてお困りですか?長期間使用しないと接続が切れてしまう問題を解決しましょう。
  • Windows10環境で無線LANを使用してプリンターと接続しています。しかし、長期間使用しないと接続が切れてしまい、再接続が必要になります。
  • 「DCP-J968N-B」を使用していて、IP電話回線を利用しています。長期間使用しないとルーターとの接続が切れるトラブルが発生しており、どうにか改善したいです。
回答を見る

専門家に質問してみよう