Возможно ли с помощью ВБА отсортировать в папке (допустим C:\Фотки) файлы (рисунки с различными названиями и расширениями). Есть папка, в ней порядка 60 000 разных картинок. Можно ли с помощью ВБА создать в этой папке (C:\Фотки) несколько папок, в которые раскидать файлы так, чтобы вес каждой папки не превышал, допустим 2мб? Названия создаваемых папок можно было бы задать произвольно (1, 2, 3 и тд. или что-то типа того)?
Возможно ли с помощью ВБА отсортировать в папке (допустим C:\Фотки) файлы (рисунки с различными названиями и расширениями). Есть папка, в ней порядка 60 000 разных картинок. Можно ли с помощью ВБА создать в этой папке (C:\Фотки) несколько папок, в которые раскидать файлы так, чтобы вес каждой папки не превышал, допустим 2мб? Названия создаваемых папок можно было бы задать произвольно (1, 2, 3 и тд. или что-то типа того)?Roman777
Sub ertert() Dim Fold As String, f As String, tSubFoldr$ With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Select the folder in which the files to be processed" .ButtonName = "Select": .AllowMultiSelect = False If .Show Then Fold = .SelectedItems(1) Else Exit Sub End With
If Right(Fold, 1) <> "\" Then Fold = Fold & "\" f = Dir(Fold, vbNormal) Do While f <> "" tSubFoldr = CStr(Int(FileLen(Fold & f) / 1048576) + 1) 'MsgBox tSubFoldr If PathExists(Fold & tSubFoldr) = False Then MkDir Fold & tSubFoldr Name Fold & f As Fold & tSubFoldr & "\" & f f = Dir() ' следующий файл Loop End Sub
Function PathExists(pname) As Boolean On Error Resume Next PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory End Function
[/vba]
без FSO [vba]
Код
Sub ertert() Dim Fold As String, f As String, tSubFoldr$ With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Select the folder in which the files to be processed" .ButtonName = "Select": .AllowMultiSelect = False If .Show Then Fold = .SelectedItems(1) Else Exit Sub End With
If Right(Fold, 1) <> "\" Then Fold = Fold & "\" f = Dir(Fold, vbNormal) Do While f <> "" tSubFoldr = CStr(Int(FileLen(Fold & f) / 1048576) + 1) 'MsgBox tSubFoldr If PathExists(Fold & tSubFoldr) = False Then MkDir Fold & tSubFoldr Name Fold & f As Fold & tSubFoldr & "\" & f f = Dir() ' следующий файл Loop End Sub
Function PathExists(pname) As Boolean On Error Resume Next PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory End Function
... да, тот код именно сортировал файлы по размеру (тема так и называется!) А вот этот - группирует файлы в папки установленного размера Функция для "рюкзака" взята у Shg [offtop]пока тестировал, зачем-то сгруппировал себе все файлы с картинками :)[/offtop]
... да, тот код именно сортировал файлы по размеру (тема так и называется!) А вот этот - группирует файлы в папки установленного размера Функция для "рюкзака" взята у Shg [offtop]пока тестировал, зачем-то сгруппировал себе все файлы с картинками :)[/offtop]nilem
RAN, nilem, Спасибо большое за ваши ответы. Я ещё посижу, поразбираю Ваши слова и код nilem. Сразу хочу спросить nilem, я что-то не нахожу, где в коде задаётся номинальный вес папки, ато он мне ошибку выдаёт, что файл превышает вес папки (не серчайте, я профан и Ваш код мне кажется невероятно сложным, пока что).
RAN, nilem, Спасибо большое за ваши ответы. Я ещё посижу, поразбираю Ваши слова и код nilem. Сразу хочу спросить nilem, я что-то не нахожу, где в коде задаётся номинальный вес папки, ато он мне ошибку выдаёт, что файл превышает вес папки (не серчайте, я профан и Ваш код мне кажется невероятно сложным, пока что).Roman777
Dim f As String, tSubFoldr$, i& Dim avInp(), FSO As FileSystemObject, fl As File Dim dStk As Double dStk = 2 ' Mb 'dStk = Range("ptrStk").Value2 ' Mb k = 0
[/vba] Насколько я понял, ранее он брал значение, определяющее размер из таблички (таблица на листе Sheet1?) Поэтому я поставил значение 2 переменной. Не понял только, как он понимает что это мегобайты, а не байты, например. Ведь далее в коде осуществляется деление относительно байтов : [vba]
Код
avInp(i, 1) = fl.Size / 1048576 ' Mb
[/vba]
Чего-то я не допонимаю))).
nilem, О! походу чутка разобрался: Sub ertert()
[vba]
Код
Dim f As String, tSubFoldr$, i& Dim avInp(), FSO As FileSystemObject, fl As File Dim dStk As Double dStk = 2 ' Mb 'dStk = Range("ptrStk").Value2 ' Mb k = 0
[/vba] Насколько я понял, ранее он брал значение, определяющее размер из таблички (таблица на листе Sheet1?) Поэтому я поставил значение 2 переменной. Не понял только, как он понимает что это мегобайты, а не байты, например. Ведь далее в коде осуществляется деление относительно байтов : [vba]
правильно говорить "недоперепонял" fl.Size дает размер файла в байтах. Делим его на 1048576 - получаются Мб. А потом сравниваем р-р файла в Мб с заданным р-ром dStk = 2 ' Mb
правильно говорить "недоперепонял" fl.Size дает размер файла в байтах. Делим его на 1048576 - получаются Мб. А потом сравниваем р-р файла в Мб с заданным р-ром dStk = 2 ' Mbnilem
nilem, Добрый день, я всё же решил чуть-чуть разобраться с этим кодом. Не могу понять следующее: [vba]
Код
If .Files.Count = 0 Then MsgBox ".Files.Count Nicht", 48: Exit Sub ReDim avInp(1 To .Files.Count, 1 To 3) For Each fl In .Files i = i + 1 avInp(i, 1) = fl.Size / 1048576 ' Mb 'если р-р какого-либо файла превышает установленный р-р папки If avInp(i, 1) > dStk Then MsgBox "avInp(i, 1) > dStk Nicht", 48: Exit Sub avInp(i, 2) = 1 avInp(i, 3) = fl.Path Next fl
[/vba] Зачем мы переменную задаём как двухмерный массив [vba]
Код
ReDim avInp(1 To .Files.Count, 1 To 3)
[/vba] и зачем существует во втором "измерении" массива переменная 2, равная 1?: [vba]
Код
avInp(i, 2) = 1
[/vba]
nilem, Добрый день, я всё же решил чуть-чуть разобраться с этим кодом. Не могу понять следующее: [vba]
Код
If .Files.Count = 0 Then MsgBox ".Files.Count Nicht", 48: Exit Sub ReDim avInp(1 To .Files.Count, 1 To 3) For Each fl In .Files i = i + 1 avInp(i, 1) = fl.Size / 1048576 ' Mb 'если р-р какого-либо файла превышает установленный р-р папки If avInp(i, 1) > dStk Then MsgBox "avInp(i, 1) > dStk Nicht", 48: Exit Sub avInp(i, 2) = 1 avInp(i, 3) = fl.Path Next fl
[/vba] Зачем мы переменную задаём как двухмерный массив [vba]
Код
ReDim avInp(1 To .Files.Count, 1 To 3)
[/vba] и зачем существует во втором "измерении" массива переменная 2, равная 1?: [vba]