1520042146 エクセルマクロVBA ファイル名を区別して特定フォルダに移動したい



詳しくは画像をご確認ください。


あるエクセルファイルの、
BD9セルに、P180303550.jpg(これは仮です)

というようなP+数字+.jpgの組み合わせで、桁数は常にかわらないものがはいっています。


マクロを実行すると、特定の画像フォルダ内から、その番号【1】より上のもの、【2】以下のもの
とわけて特定のフォルダに移動したいのです。(フォルダ内の総画像数は一定ではありません。桁数の合うものだけの移動で十分です)


移動元の画像ファイルは、
C:\Users\naranara19\Desktop\PC移動受け\写真(現在)\jiriki\180303

というように、エクセルファイルのBD9セルのPと、550までの間の数字、180303をもとにしたフォルダに入っています。


移動先ファイルは、

【1】C:\Users\naranara19\Desktop\auc
【2】C:\Users\naranara19\Desktop\auc2

に移したいです。jpgファイルのみ対象です。


なお、FileSystemObject を参照できるようにしています。


お手数ですがよろしくお願いいたします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2018/03/07 07:24:57
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Z1000S No.2

回答回数39ベストアンサー獲得回数27

ポイント500pt

2018/03/05 07:54コード差し替えを行いました。

こんな感じでできませんでしょうか?
フォルダーの有無や境界値となるBD9のセルの値などデータの整合性のチェック処理、およびエラー発生時の処理は入れてありません。必要に応じて追加していただければと思います。


Public Sub movePictures改()

'元データフォルダ
Const SOURCE_FOLDER_MAIN As String = "C:\Users\naranara19\Desktop\PC移動受け\写真(現在)\"
Const SOURCE_FOLDER_SUB As String = "\jiriki"

'移動対象拡張子
Const TARGET_EXTENTION As String = ".jpg"

'移動先フォルダ
Const DEST_FOLDER1 As String = "C:\Users\naranara19\Desktop\auc"
Const DEST_FOLDER2 As String = "C:\Users\naranara19\Desktop\auc2"

'ファイル名桁数
Const FILE_NAME_LENGTH As Long = 10

'親フォルダ名桁数
Const PARENT_FOLDER_NAME_LENGTH As Long = 6
'親フォルダ名開始位置
Const PARENT_FOLDER_NAME_BEGIN_POS As Long = 2

'境界となるファイル名の記載されているシート
Const TARGET_SHEET_NAME As String = "Sheet1"

'境界となるファイル名の記載されているセル
Const TARGET_CELL_ADDRESS As String = "BD9"

Dim fso As New FileSystemObject
Dim f As FILE
Dim sFileName As String
Dim sBoundary As String
Dim sParentFolderName As String
Dim sSourceFolder As String
Dim sSourcePath As String
Dim sDestPath As String

'境界となるファイル名の取得
sBoundary = ThisWorkbook.Worksheets(TARGET_SHEET_NAME).Range(TARGET_CELL_ADDRESS).Value
sBoundary = Left$(sBoundary, FILE_NAME_LENGTH)

'親フォルダ名(可変部)の取得
sParentFolderName = Mid$(sBoundary, PARENT_FOLDER_NAME_BEGIN_POS, PARENT_FOLDER_NAME_LENGTH)

'親フォルダの設定
sSourceFolder = SOURCE_FOLDER_MAIN & sParentFolderName & SOURCE_FOLDER_SUB

For Each f In fso.GetFolder(sSourceFolder).Files
'対象拡張子かの判定
If LCase(Right$(f.Name, Len(TARGET_EXTENTION))) = TARGET_EXTENTION Then
sFileName = Left$(f.Name, FILE_NAME_LENGTH)

If sFileName >= sBoundary Then
'境界値以上
sDestPath = DEST_FOLDER2
Else
'境界値未満
sDestPath = DEST_FOLDER1
End If

sSourcePath = sSourceFolder & "\" & f.Name
sDestPath = sDestPath & "\" & f.Name

'移動
Call fso.MoveFile(sSourcePath, sDestPath)
End If
Next

Set fso = Nothing

End Sub

他5件のコメントを見る
id:Z1000S

>これはBD9セルに書式設定で
>
>"P"G/標準".jpg"
>
>のような設定にしているのが原因でしょうか。
はい、その通りです。

書式設定で、"P"G/標準".jpg"と指定した場合、
セル上で、「P180303550.jpg」と見えている状態では、実際にセルに入っている値は、「180303550」の場合と、本当に「P180303550.jpg」が入っている場合のどちらもありえます。外観上区別がつきません。

「180303550」が入っていることを前提とするのであれば、以下のような処理でいかがでしょうか?


Public Sub movePictures改2()

'元データフォルダ
Const SOURCE_FOLDER_MAIN As String = "C:\Users\naranara19\Desktop\PC移動受け\写真(現在)\"
Const SOURCE_FOLDER_SUB As String = "\jiriki"

'移動先フォルダ
Const DEST_FOLDER1 As String = "C:\Users\naranara19\Desktop\auc"
Const DEST_FOLDER2 As String = "C:\Users\naranara19\Desktop\auc2"

'ファイル名パターン(UCaseしたものとの比較に使うので、アルファベットは大文字必須)
Const FILE_NAME_PATTERN As String = "P#########.JPG"

'ファイル名プレフィックス長
Const FILE_NAME_PREFIX_LENGTH As Long = 1

'ファイル名長(拡張子を含まない)
Const FILE_NAMNE_LENGTH_WITHOUT_EXTENSION As Long = 10

'親フォルダ名桁数
Const PARENT_FOLDER_NAME_LENGTH As Long = 6

'境界となるファイル名の記載されているシート
Const TARGET_SHEET_NAME As String = "Sheet1"

'境界となるファイル名の記載されているセル
Const TARGET_CELL_ADDRESS As String = "BD9"

Dim fso As New FileSystemObject
Dim f As FILE
Dim lFileNameLength As Long
Dim sFileName As String
Dim sBoundary As String
Dim sParentFolderName As String
Dim sSourceFolder As String
Dim sSourcePath As String
Dim sDestPath As String

'境界となるファイル名の取得(プレフィックス無し、拡張子無し)
sBoundary = ThisWorkbook.Worksheets(TARGET_SHEET_NAME).Range(TARGET_CELL_ADDRESS).Value

'親フォルダ名の取得
sParentFolderName = Left$(sBoundary, PARENT_FOLDER_NAME_LENGTH)

'親フォルダの設定
sSourceFolder = SOURCE_FOLDER_MAIN & sParentFolderName & SOURCE_FOLDER_SUB

For Each f In fso.GetFolder(sSourceFolder).Files
'ファイル名から処理対象ファイルか判定
If UCase(f.Name) Like FILE_NAME_PATTERN Then
sFileName = Mid$(f.Name, FILE_NAME_PREFIX_LENGTH + 1, FILE_NAMNE_LENGTH_WITHOUT_EXTENSION - FILE_NAME_PREFIX_LENGTH)

If sFileName >= sBoundary Then
'境界値以上
sDestPath = DEST_FOLDER2
Else
'境界値未満
sDestPath = DEST_FOLDER1
End If

sSourcePath = sSourceFolder & "\" & f.Name
sDestPath = sDestPath & "\" & f.Name

'移動
Call fso.MoveFile(sSourcePath, sDestPath)
End If
Next

Set fso = Nothing

End Sub


私的な意見を言わせてもらえば、BD9の書式設定はしない方が、後々トラブルに巻き込まれる確率が減るように思います。
見た目と中身が違うのは、混乱の原因になりますので・・・

もしどうしても9桁の数字のみの入力にしたいのであれば、BD9の両脇のセルが空いているようであれば、BC9に「P」、BE9に「.jpg」を予め入力しておくといった方法も考えられます。

2018/03/06 21:45:46
id:naranara19

いろいろとお手数をおかけいたしました!
完璧に動作いたしました。
様々なアドバイスも大変役に立ちまして感謝しております。

これで終了したいと思います。
もしよろしければ、http://q.hatena.ne.jp/1519768163
にもご回答いただけたら大変ありがたいです。
ややこしく見えますが、今回のようなことはなく、たんなる行列の入れ替えです。
よろしければご協力くださいませ。

本当にありがとうございました。

2018/03/07 07:19:54

その他の回答1件)

id:yitengzongxian No.1

回答回数5ベストアンサー獲得回数2

ポイント300pt

BD9セルにP180303550.jpgというようなP+数字+.jpgの組み合わせで桁数は常にかわらないものがはいっているエクセルファイルのシートがアクティベイトになっているとすると,こんな感じでいけるのではないかと思います。(debugしてないので自信ないけど,FileSystemObjectを使うので自己責任でお願いします。)
Sub ファイル名を区別して特定フォルダに移動したい()
Set FS = CreateObject("Scripting.FileSystemObject")
BASE_FILE_NAME = ThisWorkbook.ActiveSheet.Range("BD9")
Select Case IsEmpty(BASE_FILE_NAME)
Case True
Case False
BASE_NUMBER = Val(Mid(BASE_FILE_NAME, 2, 6))
DIR_FROM = "C:\Users\naranara19\Desktop\PC移動受け\写真(現在)\jiriki\" & Format(BASE_NUMBER) & "\"
Select Case FS.FolderExists(DIR_FROM)
Case True
DIR_AUC1 = "C:\Users\naranara19\Desktop\auc\"
Select Case FS.FolderExists(DIR_AUC1)
Case True
Case False
MkDir DIR_AUC1
End Select
DIR_AUC2 = "C:\Users\naranara19\Desktop\auc2\"
Select Case FS.FolderExists(DIR_AUC2)
Case True
MkDir DIR_AUC2
Case False
End Select
For Each F In FS.GetFolder(DIR_FROM).Files
Select Case Mid(F.Name, Len(F.Name) - 3, 4)
Case ".jpg"
Select Case Mid(F.Name, 1, 1)
Case "P"
Select Case Val(Mid(F.Name, 2, 6))
Case Is > BASE_NUMBER
DIR_AUC = DIR_AUC1
Case Else
DIR_AUC = DIR_AUC2
End Select
F.Move DIR_AUC
Case Else
End Select
Case Else
End Select
Next
Case False
End Select
End Select
End Sub

他9件のコメントを見る
id:yitengzongxian

それでは,次のコードをお試しください。
Sub ファイル名を区別して特定フォルダに移動したい()
Set FS = CreateObject("Scripting.FileSystemObject")
Select Case IsEmpty(ThisWorkbook.ActiveSheet.Range("BD9"))
Case True
Case False
BASE_NUMBER = ThisWorkbook.ActiveSheet.Range("BD9")
DIR_FROM = "C:\Users\naranara19\Desktop\PC移動受け\写真(現在)\P" & Format(Int(BASE_NUMBER / 1000)) & ".jpg\jiriki\"
Select Case FS.FolderExists(DIR_FROM)
Case True
DIR_AUC1 = "C:\Users\naranara19\Desktop\auc\"
Select Case FS.FolderExists(DIR_AUC1)
Case True
Case False
MkDir DIR_AUC1
End Select
DIR_AUC2 = "C:\Users\naranara19\Desktop\auc2\"
Select Case FS.FolderExists(DIR_AUC2)
Case True
Case False
MkDir DIR_AUC2
End Select
For Each F In FS.GetFolder(DIR_FROM).Files
Select Case Mid(F.Name, Len(F.Name) - 3, 4)
Case ".jpg"
Select Case Mid(F.Name, 1, 1)
Case "P"
Select Case Val(Mid(F.Name, 2, 9))
Case Is > BASE_NUMBER
DIR_AUC = DIR_AUC1
Case Else
DIR_AUC = DIR_AUC2
End Select
Select Case FS.FileExists(DIR_AUC & F.Name)
Case True
Case False
F.Move DIR_AUC
End Select
Case Else
End Select
Case Else
End Select
Next
Case False
End Select
End Select
End Sub

2018/03/06 20:11:57
id:naranara19

ありがとうございます。エラーは出ないのですが、なぜか移動されませんでした。
長くなりましたので、これで終わりといたしますね。
長々とご親切にしていただき、本当にありがとうございました。

2018/03/07 07:24:15
id:Z1000S No.2

回答回数39ベストアンサー獲得回数27ここでベストアンサー

ポイント500pt

2018/03/05 07:54コード差し替えを行いました。

こんな感じでできませんでしょうか?
フォルダーの有無や境界値となるBD9のセルの値などデータの整合性のチェック処理、およびエラー発生時の処理は入れてありません。必要に応じて追加していただければと思います。


Public Sub movePictures改()

'元データフォルダ
Const SOURCE_FOLDER_MAIN As String = "C:\Users\naranara19\Desktop\PC移動受け\写真(現在)\"
Const SOURCE_FOLDER_SUB As String = "\jiriki"

'移動対象拡張子
Const TARGET_EXTENTION As String = ".jpg"

'移動先フォルダ
Const DEST_FOLDER1 As String = "C:\Users\naranara19\Desktop\auc"
Const DEST_FOLDER2 As String = "C:\Users\naranara19\Desktop\auc2"

'ファイル名桁数
Const FILE_NAME_LENGTH As Long = 10

'親フォルダ名桁数
Const PARENT_FOLDER_NAME_LENGTH As Long = 6
'親フォルダ名開始位置
Const PARENT_FOLDER_NAME_BEGIN_POS As Long = 2

'境界となるファイル名の記載されているシート
Const TARGET_SHEET_NAME As String = "Sheet1"

'境界となるファイル名の記載されているセル
Const TARGET_CELL_ADDRESS As String = "BD9"

Dim fso As New FileSystemObject
Dim f As FILE
Dim sFileName As String
Dim sBoundary As String
Dim sParentFolderName As String
Dim sSourceFolder As String
Dim sSourcePath As String
Dim sDestPath As String

'境界となるファイル名の取得
sBoundary = ThisWorkbook.Worksheets(TARGET_SHEET_NAME).Range(TARGET_CELL_ADDRESS).Value
sBoundary = Left$(sBoundary, FILE_NAME_LENGTH)

'親フォルダ名(可変部)の取得
sParentFolderName = Mid$(sBoundary, PARENT_FOLDER_NAME_BEGIN_POS, PARENT_FOLDER_NAME_LENGTH)

'親フォルダの設定
sSourceFolder = SOURCE_FOLDER_MAIN & sParentFolderName & SOURCE_FOLDER_SUB

For Each f In fso.GetFolder(sSourceFolder).Files
'対象拡張子かの判定
If LCase(Right$(f.Name, Len(TARGET_EXTENTION))) = TARGET_EXTENTION Then
sFileName = Left$(f.Name, FILE_NAME_LENGTH)

If sFileName >= sBoundary Then
'境界値以上
sDestPath = DEST_FOLDER2
Else
'境界値未満
sDestPath = DEST_FOLDER1
End If

sSourcePath = sSourceFolder & "\" & f.Name
sDestPath = sDestPath & "\" & f.Name

'移動
Call fso.MoveFile(sSourcePath, sDestPath)
End If
Next

Set fso = Nothing

End Sub

他5件のコメントを見る
id:Z1000S

>これはBD9セルに書式設定で
>
>"P"G/標準".jpg"
>
>のような設定にしているのが原因でしょうか。
はい、その通りです。

書式設定で、"P"G/標準".jpg"と指定した場合、
セル上で、「P180303550.jpg」と見えている状態では、実際にセルに入っている値は、「180303550」の場合と、本当に「P180303550.jpg」が入っている場合のどちらもありえます。外観上区別がつきません。

「180303550」が入っていることを前提とするのであれば、以下のような処理でいかがでしょうか?


Public Sub movePictures改2()

'元データフォルダ
Const SOURCE_FOLDER_MAIN As String = "C:\Users\naranara19\Desktop\PC移動受け\写真(現在)\"
Const SOURCE_FOLDER_SUB As String = "\jiriki"

'移動先フォルダ
Const DEST_FOLDER1 As String = "C:\Users\naranara19\Desktop\auc"
Const DEST_FOLDER2 As String = "C:\Users\naranara19\Desktop\auc2"

'ファイル名パターン(UCaseしたものとの比較に使うので、アルファベットは大文字必須)
Const FILE_NAME_PATTERN As String = "P#########.JPG"

'ファイル名プレフィックス長
Const FILE_NAME_PREFIX_LENGTH As Long = 1

'ファイル名長(拡張子を含まない)
Const FILE_NAMNE_LENGTH_WITHOUT_EXTENSION As Long = 10

'親フォルダ名桁数
Const PARENT_FOLDER_NAME_LENGTH As Long = 6

'境界となるファイル名の記載されているシート
Const TARGET_SHEET_NAME As String = "Sheet1"

'境界となるファイル名の記載されているセル
Const TARGET_CELL_ADDRESS As String = "BD9"

Dim fso As New FileSystemObject
Dim f As FILE
Dim lFileNameLength As Long
Dim sFileName As String
Dim sBoundary As String
Dim sParentFolderName As String
Dim sSourceFolder As String
Dim sSourcePath As String
Dim sDestPath As String

'境界となるファイル名の取得(プレフィックス無し、拡張子無し)
sBoundary = ThisWorkbook.Worksheets(TARGET_SHEET_NAME).Range(TARGET_CELL_ADDRESS).Value

'親フォルダ名の取得
sParentFolderName = Left$(sBoundary, PARENT_FOLDER_NAME_LENGTH)

'親フォルダの設定
sSourceFolder = SOURCE_FOLDER_MAIN & sParentFolderName & SOURCE_FOLDER_SUB

For Each f In fso.GetFolder(sSourceFolder).Files
'ファイル名から処理対象ファイルか判定
If UCase(f.Name) Like FILE_NAME_PATTERN Then
sFileName = Mid$(f.Name, FILE_NAME_PREFIX_LENGTH + 1, FILE_NAMNE_LENGTH_WITHOUT_EXTENSION - FILE_NAME_PREFIX_LENGTH)

If sFileName >= sBoundary Then
'境界値以上
sDestPath = DEST_FOLDER2
Else
'境界値未満
sDestPath = DEST_FOLDER1
End If

sSourcePath = sSourceFolder & "\" & f.Name
sDestPath = sDestPath & "\" & f.Name

'移動
Call fso.MoveFile(sSourcePath, sDestPath)
End If
Next

Set fso = Nothing

End Sub


私的な意見を言わせてもらえば、BD9の書式設定はしない方が、後々トラブルに巻き込まれる確率が減るように思います。
見た目と中身が違うのは、混乱の原因になりますので・・・

もしどうしても9桁の数字のみの入力にしたいのであれば、BD9の両脇のセルが空いているようであれば、BC9に「P」、BE9に「.jpg」を予め入力しておくといった方法も考えられます。

2018/03/06 21:45:46
id:naranara19

いろいろとお手数をおかけいたしました!
完璧に動作いたしました。
様々なアドバイスも大変役に立ちまして感謝しております。

これで終了したいと思います。
もしよろしければ、http://q.hatena.ne.jp/1519768163
にもご回答いただけたら大変ありがたいです。
ややこしく見えますが、今回のようなことはなく、たんなる行列の入れ替えです。
よろしければご協力くださいませ。

本当にありがとうございました。

2018/03/07 07:19:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません