ご質問です。
複数キー中1つ以上のキーが部分一致する行(複数列で構成)を選択し、フラグを入れたいです。
下記の例で言いますと、Sheet1の1行に、Sheet2の列中の1つ以上が部分一致する場合、1と記入したいと思います。
(Sheet1)
A B C D E B C
1) (条件1チェック) (条件2チェック)(条件3チェック)
2) 犬あ 猿い う鳥 え魚 1 1
3) 豚い 熊え ね兎 蛇ら 1
4) 猫た 龍さ 魚み 羊り 1 1
・・・・500件続くアンケートです。
(Sheet2)
A B C
1) (条件1) (条件2) (条件3)
2) 犬 猿 豚
3) 猫 馬 羊
4) 狐 牛 熊
FindとLoopで作ってみましたが、上記で言うところのSheet1の先頭行しか検索してくれませんでした。どなたか、FindとLoop(またはFor)で教えてくださいますでしょうか。
↓できなかった私の作成物
With WS(2).Range("a2:c5")
Set c = .Find(What:=myKey, LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByColumns, MatchByte:=False)
If Not c Is Nothing Then
fAddress = c.Address
Do
WS(2).Cells(m,1).vakue=1
Set c = .FindNext(c)
If c.Address = fAddress Then Exit Do
Loop
3日悩んで、大変困っております。よろしくお願いします。(OS:WindosXP、Office2003)
No.1ベストアンサー
- 回答日時:
こんなカンジですかね。
sub macro1()
dim h as range
dim c as range
dim s as string
worksheets("Sheet1").range("E:G").clearcontents
’シート1の中に…
with worksheets("Sheet1").range("A:D")
’条件を一つずつ調査する
for each h in worksheets("Sheet2").range("A2:C5")
if h <> "" then
set c = .find(what:=h, lookin:=xlvalues, lookat:=xlpart)
if not c is nothing then
s = c.address
do
’あればフラグを立てる
worksheets("Sheet1").cells(c.row, 4 + h.column) = 1
set c = .findnext(c)
loop until c.address = s
end if
end if
next
end with
end sub
#ちなみに
E2に
=IF(OR((Sheet2!A$1:A$5<>"")*ISNUMBER(FIND(Sheet2!A$1:A$5&"",$A2:$D2))),1,"")
と記入してコントロールキーとシフトキーを押しながらEnterで入力し,右にコピー,下にコピー。
>worksheets("Sheet1").cells(c.row, 4 + h.column) = 1 の発想がなかったので出来なかったとわかりました。また、処理コメントも書いていただいてよくわかりました。すぐのお返事ありがとうございます。大変助かりました。
No.4
- 回答日時:
>Sheet1の先頭行しか検索してくれませんでした
Findメソッドだけでなく、FINDNEXT[が必要なだけでは。
Googleで「エクセル VBA 検索」で照会してコードをさがして、真似したら。
初心者にはFind、Findねxtは使うのが難しいと思う。
しかし、まあそれは本件で使っているのですね。
ーー
質問にロジックの説明が無く、ありふれたケースではないので、判るのに時間がかかる。
実例だけでなく、しっかり文章でも説明のこと。
ーー
ロジックは、検索対象としては行単位で考えるらしい。本件ではその範囲はSheet1の各行1-3列
検索語としては第1回目が、条件1がSheet2の犬。次いで猫の検索をまわさないとならないようだが、質問のコードではそれが見えないが。
犬と猫の検索をVBAで1度でやる方法は無いと思う。IF分ならORを使って、やれそうだがSheet2のA列のように多いとそれも使えない。
だからこれらのループをFor Nextの総なめ法でテスト的にコードを作り、結果が正しくなったら、それからFind法に置き換えたら。
Sheet1の「ある1行」の列の判別ループ
Sheet2の条件の各列の各行のループ
条件が条件1、条件2・・と複数あるループ。
を見据える。
ーー
).vakue=1 はValue
でしょう。
ロジックを私の代わりにご説明していただきありがとうございます。(詳しく書くよう心がけます。)一時的なテキストを生成して検索している他の方のやり方を理解するのに役立ちました。感謝いたします。誤記(vakueではなくvalueです)も訂正いたします。
No.3
- 回答日時:
こんな方法も……
Sub sample()
Dim i, j, k
Dim sTraget As String
Dim sTraget2 As String
Dim sWord As String
With Worksheets("Sheet1")
For i = 2 To .Range("A2").End(xlDown).Row
sTarget = .Cells(i, 1) & .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4) 'A~D列の文字列を結合
For j = 1 To 3 '条件
sTarget2 = sTarget
For k = 1 To 3
sWord = Worksheets("Sheet2").Cells(k + 1, j).Text
'条件と一致する文字列を削除
sTarget2 = Replace(sTarget2, sWord, "")
Next k
'もとの結合文字列より短ければ一致あり
If Len(sTarget) > Len(sTarget2) Then .Cells(i, j + 4) = 1
Next j
Next i
End With
End Sub
>sTarget = .Cells(i, 1) & .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4)
'A~D列の文字列を結合
>'条件と一致する文字列を削除
>sTarget2 = Replace(sTarget2, sWord, "")
と私の中では新境地のコードです。今後のコード学習につながるので助かります。コードもきちんと動きました。ありがとうございます。
No.2
- 回答日時:
もう検索での回答が出ていますので配列に入れて比較する方法の一例です。
Sub test01()
Dim myW, myX, myY
Dim i As Long, j As Long, l As Long, n As Long
Dim ws(1 To 2) As Worksheet
Set ws(1) = Sheets("Sheet1")
Set ws(2) = Sheets("Sheet2")
With ws(1)
myW = .Range(.Range("A2:D2"), .Range("A2:D2").End(xlDown)).Value
End With
With ws(2)
myX = .Range(.Range("A2:C2"), .Range("A2:C2").End(xlDown)).Value
End With
ReDim myY(1 To UBound(myW, 1), 1 To 3)
For i = 1 To 4
For j = 1 To UBound(myW, 1)
For l = 1 To 3
For n = 1 To UBound(myX, 1)
If InStr(myW(j, i), myX(n, l)) > 0 Then
myY(j, l) = 1
Exit For
End If
Next n
Next l
Next j
Next i
ws(1).Range("E2").Resize(UBound(myW, 1), 3).Value = myY
End Sub
>ReDim myY(1 To UBound(myW, 1), 1 To 3)
>If InStr(myW(j, i), myX(n, l)) > 0 Then
という私には初めてのやり方なので勉強になります。コードもすぐ動いて助かりました。学習素材に最適なご回答ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル初心者です 関数の入れ...
-
Microsoft1Officeの互換ソフト...
-
Excel ピボットテーブルで日付...
-
エクセル関数を教えてください
-
【マクロ】その時、その時で変...
-
【マクロ】読取専用のファイル...
-
LOOKUP関数を使えばいいのでし...
-
エクセル 白黒印刷で白線を印刷...
-
【関数】先頭だけにある、半角...
-
【関数】適切な文字数の数字を...
-
Excelのチェックボックスの使い...
-
エクセルでの作業計算方法について
-
Excelのpivotについて質問です
-
WPS OFFICEでの縦書きについて
-
時間によってファイル名が変わ...
-
エクセルのセルに同じ大きさの...
-
Aというブックの1というシート...
-
エクセルの順位別一覧表の自動...
-
西暦や和暦の表示をyyyymmdd表...
-
【マクロ】エクセルにかいてあ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報