こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2020-09-15 20:53:45

QNo.9799847

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2020-09-16 22:43:45

ANo.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

投稿日時 - 2020-09-16 08:55:40

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

投稿日時 - 2020-09-15 23:05:48

あなたにオススメの質問