• 締切済み

とあるシートの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

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.3

示されたコードは、 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)
回答No.2

現在の方法では簡単に 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)
回答No.1

 既に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  あまり複雑になると厄介ですが、個人的にはこちらの書き方の方が分かりやすくて好きですね。

関連するQ&A