- 締切済み
とあるシートのB列の値かつC列の値と、とあるフォル
とあるシートのB列の値かつC列の値と、とあるフォルダ内にあるファイルの名称が部分一致したときに、そのファイルを移動先のフォルダへと移動させるVBAを教えていただけないでしょうか? 現在、とあるシートのB列の値と、とあるフォルダ内にあるファイルの名称が部分一致した際に、そのファイルを移動先のフォルダへと移動させるVBAは作成することができました(以下参照) しかし、二つの条件(B列の値かつC列の値(AND?))が部分一致したときのやり方が分からなく困っております、VBA初心者のためどうか教えていただけないでしょうか? Sub 分別() '移動元のフォルダの設定 Const xFrm As String = "C:\before\"'移動先のフォルダの設定 Const xTo As String = "C:\after\"'アクティブになっているシートのB列の値とC:\before内のファイルの名称が部分一致した時、そのファイルをC:\afterへと移動する Dim i As Long, xFile As String With ActiveSheet For i = 3 To .Cells(Rows.Count, 1).End(xlUp).Row With .Cells(i, 2) xFile = Dir(xFrm &"*"&.Value &"*") Do While xFile <>""Name xFrm &xFile As xTo &xFile xFile = Dir() Loop End With Next i End With End Sub
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
示されたコードは、 B列の3行目のセルたちの先頭から順に読み その都度、指定のフォルダー内のファイルたちをチェックする というロジックのようです。 >現在の方法では簡単に And で判定することはできなさそうです。 私もそう思います。 むしろ、 指定のフォルダー内のファイルたちから1ファイルずつ取り出し そのファイル名に、 C列の文字列たちの何れかが含まれ、かつ、 D列の文字列たちの何れかが含まれるかをチェックし ヒットしたら移動する。という構造のほうが わかりやすいと思います。 Sub aaa() Const xFrm As String = "C:\before\" Const xTo As String = "C:\after\" Dim xFile As String xFile = Dir(xFrm & "*.*") Do While xFile <> "" If isHit(xFile) = True Then 'Debug.Print xFile Name xFrm & xFile As xTo & xFile End If xFile = Dir() Loop End Sub Function isHit(inText As String) As Boolean Dim RowCnt As Long Dim SW(3) As Boolean Dim JobCnt As Long isHit = False SW(2) = False SW(3) = False For JobCnt = 2 To 3 'B列からC列まで RowCnt = 3 '3行目から Do If Cells(RowCnt, JobCnt).Value = "" Then Exit Do If InStr(inText, Cells(RowCnt, JobCnt).Value) > 0 Then SW(JobCnt) = True Exit Do End If RowCnt = RowCnt + 1 Loop Next JobCnt If ((SW(2) = True) And (SW(3) = True)) Then isHit = True End If End Function
- dell_OK
- ベストアンサー率13% (766/5721)
現在の方法では簡単に And で判定することはできなさそうです。 B列の値を含むファイル名を Dir で取得しているので、その後でそのファイル名がC列の値を含むかどうかの判定を付加するようになると思います。 あるいは、B列C列の順で含まれているのであれば、 まず、これをやめて、 With .Cells(i, 2) ファイルの取得をこんな風にしてみる。 xFile = Dir(xFrm & "*" & .Cells(i, 2).Value & "*" & .Cells(i, 3).Value & "*") 試してないのでできるかどうかわかりません。 他の方法としては、 フォルダ内のファイルがすごく多いのでなければ、すべてのファイルを取得して、そのファイル名がB列およびC列の値を含んでいるか判定した方がわかりやすいかと思います。 Dim xB As String Dim xC As String xB = "*" & .Cells(i, 2).Value & "*" xC = "*" & .Cells(i, 3).Value & "*" If xFile Like xB And xFile Like xC Then
- kon555
- ベストアンサー率51% (1842/3559)
既に1つの条件で分岐させて目的の動作が行えているなら、後は書き方だけの問題ですね。仰るようにAND条件で分岐させればいいと思います。 具体的なやり方は以下のページなどをどうぞ https://www.forguncy.com/blog/20180925_vbaandornot https://akira55.com/andornot/ あとはAND文を使わなくとも、 if (B列とファイルの名称が部分一致) then if (C列とファイルの名称が部分一致) then ファイル移動 endif という書き方でも達成できます。 (参考ページ)https://www.officepro.jp/excelvba/if/index4.html あまり複雑になると厄介ですが、個人的にはこちらの書き方の方が分かりやすくて好きですね。