Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Перебор Xls В папке, с архивированием каждого файла разным паролем (http://forum.oszone.net/showthread.php?t=328284)

fawor1t 12-07-2017 12:56 2750863

Перебор Xls В папке, с архивированием каждого файла разным паролем
 
Всем привет, не смог считать значение ячейки в файле 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 2750892

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

Цитата:

Цитата fawor1t
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) — Серый форум). Посему две выделенные строки в таком коде:
Код:

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.

Цитата:

Цитата fawor1t
2) Если да,то как использовать значение oFile в пути открытии книги? Workbooks.Open "C:\???.xls" ' »

Код:

Workbooks.Open oFile.Path
но код надо править: следует запоминать ссылку на открытую методом .Open() Рабочую книгу и работать именно с ней, а не играться в игры с Workbooks(1).

Цитата:

Цитата fawor1t
4) какой правильный синтаксис указания переменной в пути? & CStr(переменная) верно ли? "U:\ZP\zip\& CStr(переменная) &.zip" »

Смотря что за переменная. Общий принцип:
Код:

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

Цитата:

Цитата fawor1t
5) Действительно ли этим var oWshShell = new ActiveXObject("WScript.Shell") можно запустить exe файл с параметрами? »

Можно. Но Вы взяли синтаксис из JScript. Это другой язык.

megaloman 12-07-2017 17:48 2750947

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 2750952

megaloman, повторюсь, лучше использовать возвращаемую ссылку, т.е., не:
Код:

XL.Workbooks.Open XlsName

XL.ActiveWorkbook.Close

а:
Код:

Set objWorkbook = XL.Workbooks.Open(XlsName)

objWorkbook.Close


fawor1t 13-07-2017 13:46 2751102

Привет всем еще раз,увы вчера не смог зайти на форум ,но в итоге решил задачу сам. Разве что пароли из хранения в файлах перенес в файл эксель . Спасибо за ответы благодаря им познакомлюс с 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



Время: 08:09.

Время: 08:09.
© OSzone.net 2001-