Есть список фрагментов названий файлов (колонка в Excel), по нему нужно искать файлы .tif в заданном каталоге и выводить на печать найденные. Нашел частичное решение задачи, но на переделку своих мозгов не хватает.
[vba]
Код
Const inputFolder = "C:\temp\", outFolder = "c:\out\" 'должна существовать Const logName = "log.txt" 'по условиям задачи, будет находиться в outFolder Dim folderCount As Long, stbar As Boolean, startTime As Date Dim frags() As String, fragsCount As Long
Sub ledk() Dim x As Range, i As Long 'формируем массив со строками для сравнения Set x = Range("A1").End(xlDown) If x = "" Then x = Range("A1") 'в списке одно значение fragsCount = x.Row ReDim frags(fragsCount) For i = 1 To fragsCount frags(i) = "*" & Cells(i, 1) & "*" Next
Open outFolder & logName For Append As #1 startTime = Time folderCount = 0 stbar = Application.DisplayStatusBar Application.DisplayStatusBar = True
Print #1, "******* начало перемещения файлов " & Date & " " & Time ' запускает процесс с исходной папки processFolder inputFolder Print #1, "******* конец перемещения файлов " & Date & " " & Time & _ ", папок " & folderCount & ", время " & Format(Time - startTime, "hh:mm:ss") Close #1 Application.DisplayStatusBar = stbar Application.StatusBar = False Debug.Print folderCount & Format(Time - startTime, ", hh:mm:ss") End Sub
Private Sub processFolder(fName As String) Dim fso As Object, file As Object, fileName As String, i As Long folderCount = folderCount + 1 Application.StatusBar = folderCount & " " & fName Set fso = CreateObject("scripting.filesystemobject") Set fso = fso.getfolder(fName)
' Для каждого файла в папке ... For Each file In fso.Files fileName = file.Name For i = 1 To fragsCount ' Если значение ячейки содержится в имени файла, то в файл-лог выводится путь к файлу, ' файл перемещается в папку назначения If fileName Like frags(i) Then ' If InStr(1, fileName, x, vbTextCompare) > 0 Then 'оказалось медленнее Print #1, file.Path file.Move outFolder Exit For End If Next Next
' Для каждой подпапки в папке просто вызывается эта же подпрограмма! For Each file In fso.subfolders processFolder file.Path Next
[/vba]
Прошу помощи автоматизировать задачу
Есть список фрагментов названий файлов (колонка в Excel), по нему нужно искать файлы .tif в заданном каталоге и выводить на печать найденные. Нашел частичное решение задачи, но на переделку своих мозгов не хватает.
[vba]
Код
Const inputFolder = "C:\temp\", outFolder = "c:\out\" 'должна существовать Const logName = "log.txt" 'по условиям задачи, будет находиться в outFolder Dim folderCount As Long, stbar As Boolean, startTime As Date Dim frags() As String, fragsCount As Long
Sub ledk() Dim x As Range, i As Long 'формируем массив со строками для сравнения Set x = Range("A1").End(xlDown) If x = "" Then x = Range("A1") 'в списке одно значение fragsCount = x.Row ReDim frags(fragsCount) For i = 1 To fragsCount frags(i) = "*" & Cells(i, 1) & "*" Next
Open outFolder & logName For Append As #1 startTime = Time folderCount = 0 stbar = Application.DisplayStatusBar Application.DisplayStatusBar = True
Print #1, "******* начало перемещения файлов " & Date & " " & Time ' запускает процесс с исходной папки processFolder inputFolder Print #1, "******* конец перемещения файлов " & Date & " " & Time & _ ", папок " & folderCount & ", время " & Format(Time - startTime, "hh:mm:ss") Close #1 Application.DisplayStatusBar = stbar Application.StatusBar = False Debug.Print folderCount & Format(Time - startTime, ", hh:mm:ss") End Sub
Private Sub processFolder(fName As String) Dim fso As Object, file As Object, fileName As String, i As Long folderCount = folderCount + 1 Application.StatusBar = folderCount & " " & fName Set fso = CreateObject("scripting.filesystemobject") Set fso = fso.getfolder(fName)
' Для каждого файла в папке ... For Each file In fso.Files fileName = file.Name For i = 1 To fragsCount ' Если значение ячейки содержится в имени файла, то в файл-лог выводится путь к файлу, ' файл перемещается в папку назначения If fileName Like frags(i) Then ' If InStr(1, fileName, x, vbTextCompare) > 0 Then 'оказалось медленнее Print #1, file.Path file.Move outFolder Exit For End If Next Next
' Для каждой подпапки в папке просто вызывается эта же подпрограмма! For Each file In fso.subfolders processFolder file.Path Next
Спасибо за помощь и потраченное время. выдает только Finish решение найдено [vba]
Код
Option Explicit
Const inputFolder = "C:\temp\" 'корневая папка Const logName = "log.txt" 'будет создан или дополнен в inputFolder Dim folderCount As Long, stbar As Boolean, startTime As Date Dim frags() As String, fragsCount As Long Dim miDoc As Object, ff As Integer
Sub Alexanderr() Dim x As Range, i As Long 'формируем массив со строками для сравнения Set x = Range("A1").End(xlDown) If x = "" Then x = Range("A1") 'в списке одно значение fragsCount = x.Row ReDim frags(fragsCount) For i = 1 To fragsCount frags(i) = "*" & Cells(i, 1) & "*" Next Set miDoc = CreateObject("modi.document") ff = FreeFile Open inputFolder & logName For Append As ff startTime = Time folderCount = 0 stbar = Application.DisplayStatusBar Application.DisplayStatusBar = True
Print #ff, "******* начало печати файлов " & Date & " " & Time ' запускает процесс с исходной папки processFolder inputFolder Print #ff, "******* конец печати файлов " & Date & " " & Time & _ ", папок " & folderCount & ", время " & Format(Time - startTime, "hh:mm:ss") Close #ff Application.DisplayStatusBar = stbar Application.StatusBar = False Debug.Print folderCount & Format(Time - startTime, ", hh:mm:ss") End Sub
Private Sub processFolder(fName As String) Dim fso As Object, file As Object, fileName As String, i As Long folderCount = folderCount + 1 Application.StatusBar = folderCount & " " & fName Set fso = CreateObject("scripting.filesystemobject") Set fso = fso.getfolder(fName)
' Для каждого файла в папке ... For Each file In fso.Files fileName = file.Name For i = 1 To fragsCount ' Если значение ячейки содержится в имени файла, то в файл-лог выводится путь к файлу, ' файл распечатывается If fileName Like frags(i) Then Print #ff, file.Path, On Error Resume Next miDoc.Create file.Path If Err Then Err.Clear Print #ff, "ERROR" Else Print #ff, "OK" miDoc.PrintOut End If Exit For End If Next Next
' Для каждой подпапки в папке просто вызывается эта же подпрограмма! For Each file In fso.subfolders processFolder file.Path Next
End Sub
[/vba]
Хотел добавить, на будущее (вдруг понадобится удалить log.txt) Kill C:\temp\log.txt ругается и выдает "file already Open" Не подскажите?
Спасибо за помощь и потраченное время. выдает только Finish решение найдено [vba]
Код
Option Explicit
Const inputFolder = "C:\temp\" 'корневая папка Const logName = "log.txt" 'будет создан или дополнен в inputFolder Dim folderCount As Long, stbar As Boolean, startTime As Date Dim frags() As String, fragsCount As Long Dim miDoc As Object, ff As Integer
Sub Alexanderr() Dim x As Range, i As Long 'формируем массив со строками для сравнения Set x = Range("A1").End(xlDown) If x = "" Then x = Range("A1") 'в списке одно значение fragsCount = x.Row ReDim frags(fragsCount) For i = 1 To fragsCount frags(i) = "*" & Cells(i, 1) & "*" Next Set miDoc = CreateObject("modi.document") ff = FreeFile Open inputFolder & logName For Append As ff startTime = Time folderCount = 0 stbar = Application.DisplayStatusBar Application.DisplayStatusBar = True
Print #ff, "******* начало печати файлов " & Date & " " & Time ' запускает процесс с исходной папки processFolder inputFolder Print #ff, "******* конец печати файлов " & Date & " " & Time & _ ", папок " & folderCount & ", время " & Format(Time - startTime, "hh:mm:ss") Close #ff Application.DisplayStatusBar = stbar Application.StatusBar = False Debug.Print folderCount & Format(Time - startTime, ", hh:mm:ss") End Sub
Private Sub processFolder(fName As String) Dim fso As Object, file As Object, fileName As String, i As Long folderCount = folderCount + 1 Application.StatusBar = folderCount & " " & fName Set fso = CreateObject("scripting.filesystemobject") Set fso = fso.getfolder(fName)
' Для каждого файла в папке ... For Each file In fso.Files fileName = file.Name For i = 1 To fragsCount ' Если значение ячейки содержится в имени файла, то в файл-лог выводится путь к файлу, ' файл распечатывается If fileName Like frags(i) Then Print #ff, file.Path, On Error Resume Next miDoc.Create file.Path If Err Then Err.Clear Print #ff, "ERROR" Else Print #ff, "OK" miDoc.PrintOut End If Exit For End If Next Next
' Для каждой подпапки в папке просто вызывается эта же подпрограмма! For Each file In fso.subfolders processFolder file.Path Next
End Sub
[/vba]
Хотел добавить, на будущее (вдруг понадобится удалить log.txt) Kill C:\temp\log.txt ругается и выдает "file already Open" Не подскажите?Сашаа
Сообщение отредактировал Сашаа - Понедельник, 07.04.2014, 19:37
ваш алгоритм проверяет только имена (возможно у вас там .tiff, например), в остальном - аналогично. (Поменяйте константу fileExtension = ".*" будет искать только по маске имени с любым расширением).
Цитата
Kill C:\temp\log.txt ругается и выдает "file already Open"
закройте его после всех вызовов записи. [vba]
Код
Close #ff
[/vba]Успехов
Цитата
выдает только Finish
значит, что в папке нет
Цитата
нужно искать файлы .tif
ваш алгоритм проверяет только имена (возможно у вас там .tiff, например), в остальном - аналогично. (Поменяйте константу fileExtension = ".*" будет искать только по маске имени с любым расширением).
Цитата
Kill C:\temp\log.txt ругается и выдает "file already Open"