Войти

Показать полную графическую версию : [решено] Перебор Xls В папке, с архивированием каждого файла разным паролем


fawor1t
12-07-2017, 12:56
Всем привет, не смог считать значение ячейки в файле xls через bat файл и залез в неведомые дебри vbs .Извините заранее если вопросы получились глупыми или неуместными
Логическая структура у меня получилась такая

цикл перебора всех файлов xls в определенной папке:
для каждого файла:
-открыть ,считать содержимое ячейки (например R4C36) и записать в переменную1
-открыть из папки txt файл с именем переменной1
-записать содержимое txt (1 строку в переменную2 ,2 строку в переменную3)
-запустить архиватор где пароль переменная2 ,имя файла переменная3)

Далее сам код ,помимо ошибок в синтаксисе не смог разобраться вот в таких моментах

1) При переборе через For Each oFile In oFSO.GetFolder(sFolder).Files , oFile является ли переменной которая содержит имя файла ?
2) Если да,то как использовать значение oFile в пути открытии книги? Workbooks.Open "C:\???.xls" '
3) Если нет,то как передать имя найденного файла в текущем цикле в переменную?
4) какой правильный синтаксис указания переменной в пути? & CStr(переменная) верно ли? "U:\ZP\zip\& CStr(переменная) &.zip"
5) Действительно ли этим var oWshShell = new ActiveXObject("WScript.Shell") можно запустить exe файл с параметрами?

Dim sFolder
sFolder = "U:\ZP\xls\"
Set oFSO = CreateObject("Scripting.FileSystemObject")

For Each oFile In oFSO.GetFolder(sFolder).Files
If UCase(oFSO.GetExtensionName(oFile.Name)) = "xls" Then
ProcessFiles oFSO, oFile
End if
Next

Set oFSO = Nothing


Sub ProcessFiles(FSO, File)

dim excel
UserForm_Initialize()
Workbooks.Open "C:\.xls" ' как вставить содержимое ofile в путь к файлу?
Workbooks(1).Worksheets(1).Cells(13, 1).Value = excel

Option Explicit

Dim strFileName

Dim arrContent
Dim pass, mail

strFileName = "& CStr(excel) &.txt"

With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strFileName) Then
With .OpenTextFile(strFileName)
arrContent = Split(.ReadAll(), vbCrLf)

.Close
End With

If UBound(arrContent) >=1 Then
pass = arrContent(0)
mail = arrContent(1)


WScript.Echo anyValueA, anyValueB
Else
WScript.Echo "Not enough lines [" & CStr(UBound(arrContent) + 1) & "] in [" & strFileName & "]"
End If
Else
WScript.Echo "Can't find file [" & strFileName & "]"
End If
End With

WScript.Quit

var oWshShell = new ActiveXObject("WScript.Shell");

oWshShell.Run("\"C:\Program Files\7-Zip\7z.exe" a -tzip -p& CStr(pass) & "U:\ZP\zip\& CStr(mail) &.zip" >> U:\ZP\log\log_zip.txt ); 'удастся ли вставить переменные в этой конструкции?



end sub

Iska
12-07-2017, 14:05
fawor1t, не хватает малости — упаковать в архив примеры файлов .xls и .txt, и приложить его к сообщению. Их содержимое важно для понимания работы кода и его отладки.

1) При переборе через For Each oFile In oFSO.GetFolder(sFolder).Files , oFile является ли переменной которая содержит имя файла ? »
Свойство .Files класса Folder возвращает коллекцию объектов типа File:
Option Explicit

Dim objFSO
Dim objFolder
Dim objFile

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
WScript.Echo TypeName(objFSO)

Set objFolder = objFSO.GetFolder("c:\")
WScript.Echo TypeName(objFolder)

WScript.Echo TypeName(objFolder.Files)

For Each objFile In objFolder.Files
WScript.Echo TypeName(objFile)

Exit For
Next

Set objFSO = Nothing

WScript.Quit 0

C:\Мои проекты\0098>0003.vbs
FileSystemObject
Folder
Files
File
Кроме того, в VB/VBScript/VBA есть две особенности — неявное преобразование типов и использование свойства по умолчанию. У класса File свойством по умолчанию является свойство .Path (можно посмотреть любым браузером объектов: WSH: браузеры объектов автоматизации (OLE/COM/Automation) — Серый форум (http://forum.script-coding.com/viewtopic.php?id=4481)). Посему две выделенные строки в таком коде:
With WScript.CreateObject("Scripting.FileSystemObject")
WScript.Echo .GetFile("C:\Windows\System32\notepad.exe").Path
WScript.Echo .GetFile("C:\Windows\System32\notepad.exe")
End With

дадут один и тот же результат.

Ответ на вопрос — переменная oFile содержит объект типа File.

2) Если да,то как использовать значение oFile в пути открытии книги? Workbooks.Open "C:\???.xls" ' »
Workbooks.Open oFile.Path
но код надо править: следует запоминать ссылку на открытую методом .Open() Рабочую книгу и работать именно с ней, а не играться в игры с Workbooks(1).

4) какой правильный синтаксис указания переменной в пути? & CStr(переменная) верно ли? "U:\ZP\zip\& CStr(переменная) &.zip" »
Смотря что за переменная. Общий принцип:
"U:\ZP\zip\" & Переменная & ".zip"
CStr() нужна только для преобразования значения переменной в строковое представление в случае потребности.

5) Действительно ли этим var oWshShell = new ActiveXObject("WScript.Shell") можно запустить exe файл с параметрами? »
Можно. Но Вы взяли синтаксис из JScript. Это другой язык.

megaloman
12-07-2017, 17:48
fawor1t, ExtIn = "xls" 'Расширение Excel-файла
RangeIn = "C4" 'Адрес клетки, где хранится имя текстового файла с паролем и именем файла для архивации

BoxIn = "Z:\Box_In" ' Папка с Excel-файлами
BoxTxt = "Z:\Box_In" ' Папка с текстовыми файлами в Windows кодировке 1251
BoxFrom = "Z:\Soft_In" ' Папка с файлами, которые надо упаковать
BoxArc = "Z:\Soft_Arc" ' Папка с упакованными файлами

TimeErr = 20 ' Время отображения сообщения об ошибке
Arc = """C:\Program Files\7-Zip\7zG.exe"" a -tzip -p"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WShell = CreateObject("WScript.Shell")

On Error Resume Next
Set InBox = FSO.GetFolder(BoxIn)

If Err.Number <> 0 Then
LL = WShell.Popup("Папка" + vbCrLf + vbCrLf + BoxIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, 0, "Открытие папки", 16)
On Error GoTo 0
Else

Set XL = CreateObject("Excel.Application")
' XL.Visible = True
XL.Visible = False

On Error GoTo 0
Set AllFiles = InBox.Files

For Each File In AllFiles
XlsName = BoxIn + "\" + File.Name
If LCase(FSO.GetExtensionName(XlsName)) = LCase(ExtIn) Then

Set XLbook = XL.Workbooks.Open(XlsName)
TxtName = BoxTxt + "\" + CStr(XL.Range(RangeIn).Value)
XLbook.Close

On Error Resume Next
Set iTxt = FSO.OpenTextFile(TxtName, 1)
If Err.Number <> 0 Then
LL = WShell.Popup(XlsName + vbCrLf + vbCrLf + "Файл" + vbCrLf + TxtName + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, TimeErr, "Открытие файла", 48)
Else
Pass = Trim(iTxt.ReadLine)
If iTxt.AtEndOfLine Then
LL = WShell.Popup(XlsName + vbCrLf + vbCrLf + "В файле" + vbCrLf + TxtName + vbCrLf + vbCrLf + "Не хватает данных", TimeErr, "Ошибка", 48)
Else
ForArcFile = Trim(iTxt.ReadLine)
If FSO.FileExists(BoxFrom + "\" + ForArcFile) Then
LL = WShell.Run(Arc + Pass + " """ + BoxArc + "\" + ForArcFile + ".zip"" """ + BoxFrom + "\" + ForArcFile + """", 1, True)
Else
LL = WShell.Popup(XlsName + vbCrLf + TxtName + vbCrLf + vbCrLf + "Нет файла" + vbCrLf + BoxFrom + "\" + ForArcFile, TimeErr, "Ошибка", 48)
End If
End If
iTxt.Close
End If
On Error GoTo 0

End If
Next

XL.Quit
End If

Iska
12-07-2017, 18:00
megaloman, повторюсь, лучше использовать возвращаемую ссылку, т.е., не:
XL.Workbooks.Open XlsName

XL.ActiveWorkbook.Close

а:
Set objWorkbook = XL.Workbooks.Open(XlsName)

objWorkbook.Close

fawor1t
13-07-2017, 13:46
Привет всем еще раз,увы вчера не смог зайти на форум ,но в итоге решил задачу сам. Разве что пароли из хранения в файлах перенес в файл эксель . Спасибо за ответы благодаря им познакомлюс с vba поближе)

Dim sFolder
Dim Ofile

Sub Workbook_Open()
sFolder = "С:\01\xls\"

Set oFSO = CreateObject("Scripting.FileSystemObject")

For Each Ofile In oFSO.GetFolder(sFolder).Files
If UCase(oFSO.GetExtensionName(Ofile.Name)) = "XLS" Then
ProcessFiles oFSO, Ofile
End If

Next

Set oFSO = Nothing

End Sub
Sub ProcessFiles(FSO, File)

Dim excel

Workbooks.Open Filename:=Ofile
excel = ActiveCell.Cells(11, 1).Value

ActiveWorkbook.Close

Windows("start.xlsm").Activate
Sheets("Пароли").Select
a = Range("A1:B10").Find(excel).Row
b = Range("A1:B10").Find(excel).Column


pass = Sheets("Пароли").Cells(a, b + 1).Value
mail = Sheets("Пароли").Cells(a, b + 2).Value

FolderName = "С:\01\zip\"
PathZipProgram = "C:\Program Files\7-Zip\"
smail = FolderName + mail + ".zip"

ShellStr = PathZipProgram & "7z.exe a -tzip -p" & pass & "" & " " & smail & " " & Ofile & ""

Shell ShellStr




End Sub




© OSzone.net 2001-2012