1つのフォルダに100個くらいのファイルがあって、2G以内のファイルをひとまとりにしてそれぞれに新規フォルダに移動し、最終的にそれぞれのフォルダを指定して圧縮するVBAを書きたいですが、VBA初心者でまず、ファイルの仕分け処理で頭の中が混乱してきました。
可変の2次元配列にファイルを格納してから、フォルダに移動したほうがいいですかね?
先輩たちのご指導を宜しくお願いします。
VBA
1 Sub GetFileCount() 2 Dim col, gol_col As Collection 3 Set col = New Collection 4 'Set gol_col = New Collection 5 Dim savePath As String 6 savePath = Range("B2").Value 7 8 Dim dicList As Object 9 Set dicList = CreateObject("Scripting.Dictionary") 10 Dim gl_dicList As Object 11 Set gl_dicList = CreateObject("Scripting.Dictionary") 12 Dim gl_cnt As Integer 13 14 Dim MAXSize, MAX2GSize As Currency 15 MAXSize = 2147483648# 'ファイルサイズ2G最大値 16 'Debug.Print (MAXSize) 17 18 'ファイル数を知りたいフォルダのパス 19 Dim folderPath As String 20 folderPath = Range("B1").Value 21 22 'ファイルシステムオブジェクト 23 Dim FSO As Object 24 Set FSO = CreateObject("Scripting.FileSystemObject") 25 26 Dim fl As Folder 27 Set fl = FSO.GetFolder(folderPath) ' フォルダを取得 28 Dim s, addfiname As String 29 Dim f As file 30 Dim a As Long 31 Dim bSize As Currency 32 Dim count As Integer 33 Dim a_sFolder As String 34 a_sFolder = "ファイルパス" & "\" & Format(Date, "yyyymmdd") 35 36 For Each f In fl.files ' フォルダ内のファイルを取得 37 s = f.Path ' パスを取得 38 'Debug.Print (s) ' D:\TipsFolder\Tips.txt など 39 Dim iSize 40 41 '// アクティブブックのファイルサイズを取得 42 'iSize = FileLen(s) 43 iSize = FSO.GetFile(s).Size 44 bSize = CCur(bSize) + CCur(iSize) 45 If (CCur(bSize) <= MAXSize) Then 46 47 'If Dir(a_sFolder, vbDirectory) = "" Then 48 'MkDir a_sFolder 49 'End If 50 'Call FSO.MoveFile(s, a_sFolder & "\") 51 count = count + 1 52 addfiname = addfiname & FSO.GetFile(s).Name & " " 53 addfiname = addfiname & s & " " 54 'col.Add s 55 dicList.Add "key" & CStr(count), s 56 Debug.Print (dicList.Item("key" & CStr(count))) 57 Else 58 gl_dicList.Add CStr(gl_cnt), dicList 59 MsgBox gl_dicList(CStr(gl_cnt))("key1") 60 'Debug.Print CStr(gl_cnt) 61 'Debug.Print gl_dicList(CStr(gl_cnt)) 62 gl_cnt = gl_cnt + 1 63 dicList.RemoveAll 64 'col = New Collection 65 count = count + 1 66 bSize = 0 67 bSize = CCur(bSize) + CCur(iSize) 68 If (CCur(bSize) <= MAXSize) Then 69 70 'If Dir(a_sFolder, vbDirectory) = "" Then 71 'MkDir a_sFolder 72 'End If 73 'Call FSO.MoveFile(s, a_sFolder & "\") 74 addfiname = addfiname & FSO.GetFile(s).Name & " " 75 addfiname = addfiname & s & " " 76 'col.Add s 77 dicList.Add "key" & CStr(count), s 78 Debug.Print (dicList.Item("key" & CStr(count))) 79 End If 80 81 '圧縮処理 82 'a_sFolder = a_sFolder & "_" & count 83 84 'savePath = savePath & "\" & count & ".zip" 85 'Debug.Print (savePath) 86 'CompressArchive_cmd a_sFolder, savePath, count 87 'Call FSO.MoveFile(a_sFolder & "*", "移動先パス") 88 'CompressArchive col, savePath 89 'FileArchive str 90 'End 91 End If 92 'Debug.Print (str) 93 'Debug.Print (bSize) 94 95 'dicList.Add s, iSize 96 'bSize = bSize + iSize 97 'Debug.Print "---bSize = " & bSize 98 'If (CLng(bSize) <= MAXSize) Then 99 'count = count + 1 100 'End If 101 Next 102 103 'ループ用の変数 104 'Dim i, j As Integer 105 'Dim keys 106 'Dim items 107 108 'keys = dicList.keys 109 'items = dicList.items 110 'j = 0 111 'For i = 0 To dicList.count - 1 112 'bSize = bSize + items(i) 113 'If (CLng(bSize) <= MAXSize) Then 114 115 'Else 116 'bSize = bSize - items(i) 117 'j = i - 1 118 'End If 119 'Debug.Print "ファイル名:" & keys(i) & "、ファイルサイズ:" & items(i) 120 'Next i 121 122 ' 後始末 123 Set FSO = Nothing 124 125 'ファイル数を格納する変数 126 'Dim j As Long 127 'j = fso.GetFolder(folderPath).files.count 128 'Debug.Print "ファイルCount = " & j 129End Sub
100個ファイルのファイル名は関係なく、サイズのみ取得して、合計サイズが2Gだったら「yyyyddmm」フォルダ(任意)に移動し、次のファイルからまた合計が2Gだったら「yyyyddmm_1」フォルダ(任意)に移動していって、全ファイルを2Gサイズのまとまりをフォルダ分けして移動したいです。
フォルダ分けでなくても、2次元配列の1行目に2G単位の全ファイル名(例えば1個目~9個目ファイルが2G)が格納され、2行目にも(10個目~18個目ファイルが2G)ファイル名が格納されてもいいです。
宜しくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/05 03:37
2021/01/05 07:34