質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2165閲覧

ファイルの移動をしたい

Naoko_Coco

総合スコア54

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2019/06/21 02:19

ファイルの移動をしたいのですができません。
ファイルを1度開き、項番を取得して、その項番フォルダーにファイルを移動させたいのですができません。
また、1度目のLoopではファイル名が取得できているのですが、2度目のLoopに入るとFileが空になってしまいます。

Private Sub CommandButton2_Click() 'Dim fso As FileSystemObject 'Set fso = New FileSystemObject Set wb = ThisWorkbook File = Dir(wb.Path & "\エントリーシート*.xlsx") Do While File <> "" '開くExcelファイル FilePath = wb.Path & "\エントリーシート\" & File Set wbEntry = Workbooks.Open(FilePath) Set shEntry = wbEntry.Worksheets(1) 'エントリーシートの項番 Entrynum = Format(shEntry.Range("B10"), "000") Workbooks(File).Close savechanges:=False Folder = wb.Path & "\エントリーシート\" & Entrynum If Dir(Folder, vbDirectory) <> "" Then Name FilePath As Folder & File 'Call fso.MoveFile(FilePath, Folder & File) End If File = Dir() Loop End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Dir()をループで使用した場合、前回の状況を利用した動作になります。
そこでファイルを移動しているので、ズレているわけです。
ループ自体をFileSystemObjectを使用したものに置き換えるのが良いかと思います。

投稿2019/06/21 02:28

sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TanakaHiroaki

2019/06/21 02:32

ループ処理中のファイルリネームや移動は難しいですね。 こういった場合、面倒でも条件に合致するファイルを一旦配列に入れてから処理するようにしています。
Naoko_Coco

2019/06/21 02:34

それはどのようにしたら良いのでしょうか? コメントアウトにしているんですが、 Dim fso As FileSystemObject Set fso = New FileSystemObject File = Dir(wb.Path & "\エントリーシート*.xlsx") Do While File <> "" '開くExcelファイル FilePath = wb.Path & "\エントリーシート\" & File Set wbEntry = Workbooks.Open(FilePath) Set shEntry = wbEntry.Worksheets(1) 'エントリーシートの項番 Entrynum = Format(shEntry.Range("B10"), "000") Workbooks(File).Close savechanges:=False Folder = wb.Path & "\エントリーシート\" & Entrynum If Dir(Folder, vbDirectory) <> "" Then fso.MoveFile FilePath, Folder & File End If File = Dir() Loop こちらで試しても移動ができません。 更に、なぜかBookを閉じる際にファイル名が変数Entrynumがプラスされた状態で上書き保存がされてしまっています。
Naoko_Coco

2019/06/21 03:01

とりあえずまんまを書いてみました。 Dim FSO As Object, f As Variant, BaseNames() As String, cnt As Long, i As Long Set FSO = CreateObject("Scripting.FileSystemObject") Set wb = ThisWorkbook FilePath = wb.Path & "\エントリーシート\" ReDim BaseNames(FSO.GetFolder(FilePath).Files.Count) For Each f In FSO.GetFolder(FilePath).Files If LCase(FSO.GetExtensionName(f.Name)) = "xlsx" Then cnt = cnt + 1 BaseNames(cnt) = FSO.GetBaseName(f.Name) End If Next f If cnt = 0 Then MsgBox "xlsxファイルはありません", vbExclamation Else For i = 1 To cnt FilePath = FilePath & "\" & BaseNames(i) Set wbEntry = Workbooks.Open(FilePath) Set shEntry = wbEntry.Worksheets(1) 'エントリーシートの項番 Entrynum = Format(shEntry.Range("B10"), "000") ' Workbooks.Close savechanges:=False Folder = wb.Path & "\エントリーシート\" & Entrynum If Dir(Folder, vbDirectory) <> "" Then 'Name FilePath As Folder & File FSO.MoveFile FilePath, Folder & BaseNames(i) End If Next i End If するとMoveFileのときにファイルが見つかりませんになります。
sazi

2019/06/21 03:09

Dir()は使わないでと言っているんですが。
Naoko_Coco

2019/06/21 03:18

できました~~~~!!
TanakaHiroaki

2019/06/21 03:20

そうですか。学習能力高いですね。
Naoko_Coco

2019/06/21 03:20

できてませんでした。。。
TanakaHiroaki

2019/06/21 03:24

FSO.MoveFile FilePath, Folder & ”\” & BaseNames(i) でどうでしょうか。
Naoko_Coco

2019/06/21 03:33

Debugで見たら拡張子がなかったためできなかったみたいです。
guest

0

素晴らしいですね。
配列を1から使用される場合、先頭に
Option Base 1
をつけておくとなお良いです。

投稿2019/06/21 03:36

TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Naoko_Coco

2019/06/21 03:46

ありがとうございます。 Option Base 1 これはどういった意味なのでしょうか?
TanakaHiroaki

2019/06/21 04:00 編集

VBAの配列はから始まるのが基本なので、1から始まる場合 Option Base 1 が無難です。 言い換えると、BaseNames(0)を使用できないように明示するだけの処理です。
Naoko_Coco

2019/06/21 04:09

そうなんだ!配列は常に0からだと思ってて、明示的にするときはarr(1)とか指定するもんだと思ってました。 なるほどです! ありがとうございます。
TanakaHiroaki

2019/06/21 04:14

Option Base 1有無の違いは、配列の添え字の最小値や最大値を確認すると良くわかると思います。 Debug.Print LBound(BaseNames) '最小値 Debug.Print UBound(BaseNames) '最大値
guest

0

自己解決

saziさんのご意見を元に・・・Dirはフォルダー調べる際に使っちゃってますが。。。

Private Sub CommandButton2_Click() Dim FSO As Object, f As Variant, BaseNames() As String, cnt As Long Set FSO = CreateObject("Scripting.FileSystemObject") Set wb = ThisWorkbook FilePath = wb.Path & "\エントリーシート\" ReDim BaseNames(FSO.GetFolder(FilePath).Files.Count) For Each f In FSO.GetFolder(FilePath).Files If LCase(FSO.GetExtensionName(f.Name)) = "xlsx" Then cnt = cnt + 1 BaseNames(cnt) = FSO.GetBaseName(f.Name) End If Next f If cnt = 0 Then MsgBox "ファイルはありません", vbExclamation Else For i = 1 To cnt File = FilePath & BaseNames(i) Debug.Print BaseNames(i) Set wbEntry = Workbooks.Open(File) Set shEntry = wbEntry.Worksheets(1) 'エントリーシートの項番 Entrynum = Format(shEntry.Range("B10"), "000") ' Workbooks.Close savechanges:=False ActiveWorkbook.Saved = True ActiveWorkbook.Close Folder = wb.Path & "\エントリーシート\" & Entrynum If Dir(Folder, vbDirectory) <> "" Then 'Name FilePath As Folder & File Debug.Print FilePath Debug.Print Folder & "\" & BaseNames(i) FSO.MoveFile File & ".xlsx", Folder & "\" & BaseNames(i) & ".xlsx" End If Next i End If

投稿2019/06/21 03:31

Naoko_Coco

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TanakaHiroaki

2019/06/21 03:37

素晴らしいですね。 配列を1から使用される場合、先頭に Option Base 1 をつけておくとなお良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問