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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Разбивка строк общего файла на отдельные csv файлы (http://forum.oszone.net/showthread.php?t=336507)

jordan_74 02-09-2018 14:08 2829605

Разбивка строк общего файла на отдельные csv файлы
 
Добрый день всем!! Нужна помощь с написанием макроса.
Имеется 3 папки Шаблон, Реестр и Итог
В папке Реестр лежит исходный файл excel с данными. В папке шаблон лежит файл с именем check формата csv, который планируется использовать в качестве шаблона.
Нужен макрос, который бы открывал исходный файл, копировал данные в файл шаблона.csv и сохранял этот файл шаблона в папку "Итог" с именем сheck1. Каждая строка исходного файла = один файл check. То есть если в исходном файле условно 50 строк, то должно получиться 49 чеков(в последнюю строку исходного файла выводится общая сумма, она не нужна) Имена файлов в папке итог должны быть от check1 до условно check49

Данные для копирования:
E2(исх) в B3(шаблон);
E2(исх) в F2(шаблон);
F2(исх) в D3,D4,H3(шаблон)


В файле шаблона check ячейка L3 должна рассчитываться по формуле (F2(исх)*18)/118

F2, E2 это ячейки первой строки с данными, т.к выше только заголовки столбцов. То есть когда цикл пробегает по следующей строчке, будет уже не F2, E2 а F3, E3 и т.д

Надеюсь понятно объяснил) С VBA знаком крайне поверхностно. Нашел на форуме лишь решение по копированию файлов.

Sub DirCopy()
Dim OldPath$, NewPath$, Shablon$, OnlyName$
OldPath = "C:\proba\zvit\"
NewPath = "C:\proba\Temp\"
Shablon = "*.*"
OnlyName = Dir(OldPath & Shablon, vbReadOnly + vbHidden + vbSystem)
Do Until OnlyName = ""
FileCopy OldPath & OnlyName, NewPath & OnlyName
OnlyName = Dir
Loop
End Sub

Iska 02-09-2018 17:25 2829623

Цитата:

Цитата jordan_74
Надеюсь понятно объяснил) »

Не совсем. Первым делом от Вас требовалось создать образцы всех этих файлов:
Цитата:

Цитата jordan_74
Имеется 3 папки Шаблон, Реестр и Итог
В папке Реестр лежит исходный файл excel с данными. В папке шаблон лежит файл с именем check формата csv, который планируется использовать в качестве шаблона.

То есть если в исходном файле условно 50 строк, то должно получиться 49 чеков(в последнюю строку исходного файла выводится общая сумма, она не нужна) Имена файлов в папке итог должны быть от check1 до условно check49»

упаковать их в архив и приложить к сообщению.

jordan_74 03-09-2018 10:22 2829687

Вложений: 1
Iska,

Архив с примерами файлов приложил

Iska 03-09-2018 15:53 2829724

Цитата:

Цитата jordan_74
Архив с примерами файлов приложил »

jordan_74, простите, я не вижу ни единого образца результирующего файла в каталоге Итог.

jordan_74 03-09-2018 16:12 2829727

Iska,

Прошу прощения
http://forum.oszone.net/attachment.p...1&d=1535984169

Iska 03-09-2018 16:18 2829728

Цитата:

Цитата jordan_74

Цитата:

Страница не найдена. Если вы уверены, что использовали правильную ссылку, свяжитесь с администрацией

jordan_74 03-09-2018 17:17 2829738

Вложений: 1
Iska,http://forum.oszone.net/attachment.p...1&d=1535984169

Iska 03-09-2018 22:29 2829774

jordan_74, в примере Вашего файла присутствует явное округление — 152,5 вместо 152,5423729. Что Вы можете пояснить по этому поводу?

Макрос VBA:
Скрытый текст
Код:

Option Explicit

Sub Sample()
    Dim strTemplateFile As String
    Dim strSourceFile As String
    Dim strDestFolder As String
   
   
    Dim objFSO As Object
   
    Dim objTemplateFile As Workbook
    Dim objSourceFile As Workbook
   
    Dim i As Long
    Dim strDestFile As String
   
    Dim anyValue As Variant
   
   
    strTemplateFile = "C:\Мои проекты\0191\Архив\Архив\Шаблон\check.csv"
    strSourceFile = "C:\Мои проекты\0191\Архив\Архив\Реестр\26.08.2018_38490,25.xlsx"
    strDestFolder = "C:\Мои проекты\0191\Архив\Архив\Итог"
   
    Set objFSO = CreateObject("Scripting.FileSystemObject")
   
    If objFSO.FileExists(strTemplateFile) Then
        If objFSO.FileExists(strSourceFile) Then
            If objFSO.FolderExists(strDestFolder) Then
                Application.DisplayStatusBar = True
                Application.ScreenUpdating = False
               
                Application.Workbooks.OpenText Filename:=strTemplateFile, Local:=True
                Set objTemplateFile = Application.Workbooks.Item(objFSO.GetFileName(strTemplateFile))
               
                Set objSourceFile = Application.Workbooks.Open(strSourceFile, False, True)
               
                For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
                    With objTemplateFile.Worksheets.Item(1)
                        anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
                       
                        .Range("B3").Value = anyValue
                        .Range("F2").Value = anyValue
                       
                        anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value
                       
                        .Range("D3").Value = anyValue
                        .Range("D4").Value = anyValue
                        .Range("H3").Value = anyValue
                       
                        .Range("L3").Value = (anyValue * 18) / 118
                    End With
                   
                    strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & CStr(i) & "." & objFSO.GetExtensionName(strTemplateFile))
                   
                    Application.StatusBar = "Creating [" & strDestFile & "]…"
                   
                    If objFSO.FileExists(strDestFile) Then
                        objFSO.DeleteFile strDestFile, True
                    End If
                   
                    objTemplateFile.SaveAs Filename:=strDestFile, FileFormat:=xlCSV, Local:=True
                Next
               
                objSourceFile.Close False
                objTemplateFile.Close False
               
                Application.ScreenUpdating = True
                Application.StatusBar = False
            Else
                MsgBox "Can't find destination folder [" & strDestFolder & "].", vbExclamation + vbOKOnly, "Can't find destination folder"
            End If
        Else
            MsgBox "Can't find source file [" & strSourceFile & "].", vbExclamation + vbOKOnly, "Can't find source file"
        End If
    Else
        MsgBox "Can't find template file [" & strTemplateFile & "].", vbExclamation + vbOKOnly, "Can't find template file"
    End If
End Sub



На WSH:
Скрытый текст
Код:

Option Explicit

Const xlCSV = 6
Const xlWindows = 2


Dim strTemplateFile
Dim strSourceFile
Dim strDestFolder


Dim objFSO
Dim objExcel

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


strTemplateFile = "C:\Мои проекты\0191\Архив\Архив\Шаблон\check.csv"
strSourceFile  = "C:\Мои проекты\0191\Архив\Архив\Реестр\26.08.2018_38490,25.xlsx"
strDestFolder  = "C:\Мои проекты\0191\Архив\Архив\Итог"

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

If objFSO.FileExists(strTemplateFile) Then
        If objFSO.FileExists(strSourceFile) Then
                If objFSO.FolderExists(strDestFolder) Then
                        Set objExcel = WScript.CreateObject("Excel.Application")
                       
                        objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
                        Set objTemplateFile = objExcel.Workbooks.Item(1)
                       
                        Set objSourceFile = objExcel.Workbooks.Open(strSourceFile, False, True)
                       
                        For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
                                With objTemplateFile.Worksheets.Item(1)
                                        anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
                                       
                                        .Range("B3").Value = anyValue
                                        .Range("F2").Value = anyValue
                                       
                                        anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value
                                       
                                        .Range("D3").Value = anyValue
                                        .Range("D4").Value = anyValue
                                        .Range("H3").Value = anyValue
                                       
                                        .Range("L3").Value = (anyValue * 18) / 118
                                End With
                               
                                strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & CStr(i) & "." & objFSO.GetExtensionName(strTemplateFile))
                               
                                If objFSO.FileExists(strDestFile) Then
                                        objFSO.DeleteFile strDestFile, True
                                End If
                               
                                objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
                        Next
                       
                        objSourceFile.Close False
                        objTemplateFile.Close False
                       
                        objExcel.Quit
                Else
                        WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
                        WScript.Quit 3
                End If
        Else
                WScript.Echo "Can't find source file [" & strSourceFile & "]."
                WScript.Quit 2
        End If
Else
        WScript.Echo "Can't find template file [" & strTemplateFile & "]."
        WScript.Quit 1
End If

WScript.Quit 0


jordan_74 04-09-2018 05:12 2829784

Iska,так и есть, один знак после запятой, таков формат данных в ячейке

jordan_74 04-09-2018 10:15 2829819

Все работает как надо.
Цитата:

Цитата Iska
strSourceFile = "C:\Мои проекты\0191\Архив\Архив\Реестр\26.08.2018_38490,25.xlsx" »

Единственный момент, можно ли сделать без привязки к конкретному файлу реестра? Таких реестров может быть до 10 штук в день.
Тогда возникнет путаница с нумерацией чеков.... Возможно к имени чека помимо нумерации нужно добавлять имя файла реестра, что то типа check_26.08.2018_38490,25_001

Iska 04-09-2018 16:24 2829877

Цитата:

Цитата jordan_74
Iska,так и есть, один знак после запятой, таков формат данных в ячейке »

jordan_74, не может такого быть, мы говорим о содержимом ячейки, а не о формате. Мы можем округлять до какого-либо знака после запятой, если требуется. Надо?

Цитата:

Цитата jordan_74
Единственный момент, можно ли сделать без привязки к конкретному файлу реестра? Таких реестров может быть до 10 штук в день.
Тогда возникнет путаница с нумерацией чеков.... Возможно к имени чека помимо нумерации нужно добавлять имя файла реестра, что то типа check_26.08.2018_38490,25_001 »

Мы можем сделать так: будет жёсткая привязка к местоположению шаблона (strTemplateFile), будет жёсткая привязка к метоположению выходных файлов (strDestFolder), а путь к исходному файлу (strSourceFile) мы будем указывать параметром скрипта WSH — тогда Вы сможете просто перетаскивать любой исходный файл реестра на скрипт WSH в Проводнике. Такое Вас устроит, делаем?

Iska 04-09-2018 18:29 2829908

jordan_74, примерно так (на WSH):
Скрытый текст
Код:

Option Explicit

Const xlCSV = 6
Const xlWindows = 2


Dim strTemplateFile
Dim strSourceFile
Dim strDestFolder


Dim objFSO
Dim objExcel

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


strTemplateFile = "C:\Мои проекты\0191\Архив\Архив\Шаблон\check.csv"
strDestFolder  = "C:\Мои проекты\0191\Архив\Архив\Итог"

If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FileExists(strTemplateFile) Then
                If objFSO.FileExists(strSourceFile) Then
                        If objFSO.FolderExists(strDestFolder) Then
                                Set objExcel = WScript.CreateObject("Excel.Application")
                               
                                objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
                                Set objTemplateFile = objExcel.Workbooks.Item(1)
                               
                                Set objSourceFile = objExcel.Workbooks.Open(strSourceFile, False, True)
                               
                                For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
                                        With objTemplateFile.Worksheets.Item(1)
                                                anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
                                               
                                                .Range("B3").Value = anyValue
                                                .Range("F2").Value = anyValue
                                               
                                                anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value
                                               
                                                .Range("D3").Value = anyValue
                                                .Range("D4").Value = anyValue
                                                .Range("H3").Value = anyValue
                                               
                                                .Range("L3").Value = Round((anyValue * 18) / 118, 1)
                                        End With
                                       
                                        strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(strSourceFile) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))
                                       
                                        If objFSO.FileExists(strDestFile) Then
                                                objFSO.DeleteFile strDestFile, True
                                        End If
                                       
                                        objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
                                Next
                               
                                objSourceFile.Close False
                                objTemplateFile.Close False
                               
                                objExcel.Quit
                                Set objExcel = Nothing
                        Else
                                WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
                                WScript.Quit 4
                        End If
                Else
                        WScript.Echo "Can't find source file [" & strSourceFile & "]."
                        WScript.Quit 3
                End If
        Else
                WScript.Echo "Can't find template file [" & strTemplateFile & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


пробуйте. Путь к файлу шаблона и целевой папке задаётся жёстко в скрипте, путь к исходному файлу указывается аргументом скрипта (также можно просто перетянуть исходный файл на скрипт в Проводнике).

P.S. И что с округлением — делаем, не делаем? Делаем!

jordan_74 04-09-2018 18:50 2829911

Цитата:

Цитата Iska
P.S. И что с округлением — делаем, не делаем? »

Округление до одного знака после запятой, да

Iska 04-09-2018 19:17 2829918

Цитата:

Цитата jordan_74
Округление до одного знака после запятой, да »

Добавил в предыдущий код, пробуйте.

P.S. Забыл самое главное — одноимённые файлы, уже существующие в целевом каталоге, будут молча перезаписаны (точнее — удалены, а на их место будут записаны новые файлы).

jordan_74 04-09-2018 19:57 2829923

Вложений: 1
Iska,
Скопировал код, сохранил в формате .js но при запуске возникла ошибка, может я что то криво сделал

Скрытый текст
Option Explicit

Const xlCSV = 6
Const xlWindows = 2


Dim strTemplateFile
Dim strSourceFile
Dim strDestFolder


Dim objFSO
Dim objExcel

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


strTemplateFile = "C:\РЕЕСТР ЧЕКОВ\Шаблон\check.csv"
strDestFolder = "C:\РЕЕСТР ЧЕКОВ\Итог"

If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)

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

If objFSO.FileExists(strTemplateFile) Then
If objFSO.FileExists(strSourceFile) Then
If objFSO.FolderExists(strDestFolder) Then
Set objExcel = WScript.CreateObject("Excel.Application")

objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
Set objTemplateFile = objExcel.Workbooks.Item(1)

Set objSourceFile = objExcel.Workbooks.Open(strSourceFile, False, True)

For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
With objTemplateFile.Worksheets.Item(1)
anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value

.Range("B3").Value = anyValue
.Range("F2").Value = anyValue

anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value

.Range("D3").Value = anyValue
.Range("D4").Value = anyValue
.Range("H3").Value = anyValue

.Range("L3").Value = Round((anyValue * 18) / 118, 1)
End With

strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(strSourceFile) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))

If objFSO.FileExists(strDestFile) Then
objFSO.DeleteFile strDestFile, True
End If

objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
Next

objSourceFile.Close False
objTemplateFile.Close False

objExcel.Quit
Set objExcel = Nothing
Else
WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
WScript.Quit 4
End If
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 3
End If
Else
WScript.Echo "Can't find template file [" & strTemplateFile & "]."
WScript.Quit 2
End If

Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If

WScript.Quit 0

Iska 04-09-2018 20:37 2829933

Цитата:

Цитата jordan_74
сохранил в формате .js но при запуске возникла ошибка, может я что то криво сделал »

Поправьте пути на свои, сохраните файл с расширением .vbs, а затем попробуйте перетащить на него файл реестра.

jordan_74 04-09-2018 20:43 2829934

Вложений: 1
Iska,
Сохранил в формате .vbs
Отработало как надо. Вопрос, нужно именно перетаскивать файл реестра на скрипт, или все таки можно сделать обычным двойным кликом?

Iska 04-09-2018 21:27 2829944

Цитата:

Цитата jordan_74
или все таки можно сделать обычным двойным кликом? »

Так было ж «обычным двойным кликом» чуть выше. Вы захотели, чтобы можно было работать с разными исходными файлами. Как скрипт будет узнавать, с каким именно исходным файлом ему следует работать?!

jordan_74 05-09-2018 06:51 2829988

Цитата:

Цитата Iska
Как скрипт будет узнавать, с каким именно исходным файлом ему следует работать?! »

Я не знаю) с VBA я ещё как то знаком, а вот с wsh совершенно нет.

Тем не менее огромное спасибо Iska, вы очень помогли и облегчили работу многим людям. У меня финальная просьба, т.к я с wsh вообще не знаком, могли бы прокомментировать блоки кода, чтобы понять что делается на разных этапах..!?

Iska 05-09-2018 07:11 2829991

Цитата:

Цитата jordan_74
У меня финальная просьба, т.к я с wsh вообще не знаком, могли бы прокомментировать блоки кода, чтобы понять что делается на разных этапах..!? »

Постараюсь сделать вечером.

Iska 05-09-2018 23:57 2830132

Цитата:

Цитата jordan_74
Я не знаю) »

У нас примерно три варианта для задания пути к исходному файлу, которое должно постоянно меняться:

1. Тупо указать в коде. Это был наш первый вариант (и наихудший).

2. Указать аргументом скрипта. Это наш второй вариант (и наиболее предпочтительный). Вы, например, можете просто перетаскивать исходный файл реестра на скрипт, я — могу быстро и удобно, посредством всего нескольких нажатий клавиш, указывать путь к исходному файлу реестра в командной строке Far Manager'а:
Скрытый текст

кто-то напишет пакетный файл, в котором будут перебираться только заданные файлы реестра:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив1\1.xlsx" "C:\Мои проекты\0191\Архив1\2.xlsx" "C:\Мои проекты\0191\Архив2\bla-bla-bla.xlsx") do (
        echo [%%~i]
        cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0


или все подряд файлы реестра в каталоге, наподобие:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
        echo [%%~i]
        cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0


И всё это будет работать.

3. Хранить путь в каком-либо заранее предопределённом и обговоренном месте. Например, использовать какой-нибудь файл конфигурации с предопределённым именем и местоположением, в котором указывать путь к исходному файлу (откуда он будет считываться скриптом). Или какой-нибудь предопределённый параметр в реестре. Столь же неудобно и малоосмысленно, как и прямое указание пути непосредственно в коде.

Цитата:

Цитата jordan_74
с VBA я ещё как то знаком, а вот с wsh совершенно нет. »

Они весьма похожи.

Цитата:

Цитата jordan_74
прокомментировать блоки кода »

Примерно так:
Скрытый текст
Код:

Option Explicit

' Константы из библиотеки Microsoft Excel
'
' В процедурах VBA под Microsoft Excel они предопределены, поскольку там
' подключены в ссылках соответствующие библиотеки,
' а для VBScript/JScript таковой механизм отсутствует (но не в целом для WSH
' — в пакетах заданий .wsf можно указывать ссылки на библиотеки), и константы приходится
' описывать непосредственно в коде «ручками»
Const xlCSV = 6
Const xlWindows = 2

Dim strTemplateFile
Dim strSourceFile
Dim strDestFolder


Dim objFSO
Dim objExcel

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


' Путь к файлу шаблона
strTemplateFile = "C:\Мои проекты\0191\Архив\Архив\Шаблон\check.csv"
' Путь к целевому каталогу
strDestFolder  = "C:\Мои проекты\0191\Архив\Архив\Итог"

' Если число переданных скрипту аргументов равно единице…
If WScript.Arguments.Count = 1 Then
        ' …зададим переменной значение первого аргумента
        strSourceFile = WScript.Arguments.Item(0)
       
        ' Создаём экземпляр объекта класса "Scripting.FileSystemObject"
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        ' Если файл шаблона существует…
        If objFSO.FileExists(strTemplateFile) Then
                ' Если файл, указанный первым аргументом скрипта, существует…
                If objFSO.FileExists(strSourceFile) Then
                        ' Если целевой каталог существует…
                        If objFSO.FolderExists(strDestFolder) Then
                                ' Создаём экземпляр объекта класса "Excel.Application"
                                Set objExcel = WScript.CreateObject("Excel.Application")
                               
                                ' Открываем файл шаблона как текст в виде Рабочей книги
                                objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
                                ' Создаём ссылку на эту объект открытой Рабочую книгу — в данный момент она у нас всегда будет одна
                                Set objTemplateFile = objExcel.Workbooks.Item(1)
                               
                                ' Открываем исходный файл реестра и сохраняем ссылку на объект Рабочей книги
                                Set objSourceFile = objExcel.Workbooks.Open(strSourceFile, False, True)
                               
                                ' Пробегаемся циклом от 1 до (число строк использованного диапазона Рабочей книги
                                ' исходного файла реестра за вычетом двух строк — заголовка и суммы)
                                For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
                                        With objTemplateFile.Worksheets.Item(1)
                                                ' Получили значение из ячейки (i + 1, 5) исходного файла реестра
                                                anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
                                               
                                                ' Задали это полученное значение двум диапазонам Рабочей книги файла шаблона
                                                ' — нашего будущего целевого файла
                                                .Range("B3").Value = anyValue
                                                .Range("F2").Value = anyValue
                                               
                                                ' Получили значение из ячейки (i + 1, 6) исходного файла реестра
                                                anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value
                                               
                                                ' Задали это полученное значение трём диапазонам Рабочей книги файла шаблона
                                                ' — нашего будущего целевого файла
                                                .Range("D3").Value = anyValue
                                                .Range("D4").Value = anyValue
                                                .Range("H3").Value = anyValue
                                               
                                                ' Посчитали и задали значение ещё одному диапазону Рабочей книги файла шаблона
                                                ' — нашего будущего целевого файла
                                                .Range("L3").Value = Round((anyValue * 18) / 118, 1)
                                        End With
                                       
                                        ' Создали полное имя для нашего будущего целевого файла
                                        strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(strSourceFile) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))
                                       
                                        ' Если целевой файл уже существует в целевом каталоге…
                                        If objFSO.FileExists(strDestFile) Then
                                                ' …удаляем его
                                                objFSO.DeleteFile strDestFile, True
                                        End If
                                       
                                        ' Сохраняем открытую Рабочую книгу шаблона под именем нашего целевого файла
                                        ' в формате CSV
                                        objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
                                Next
                               
                                ' Закрываем открытые Рабочие книги
                                objSourceFile.Close False
                                objTemplateFile.Close False
                               
                                ' Завершаем работу приложения Microsoft Excel и очищаем ссылку на экземпляр объекта
                                objExcel.Quit
                                Set objExcel = Nothing
                        Else
                                WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
                                WScript.Quit 4
                        End If
                Else
                        WScript.Echo "Can't find source file [" & strSourceFile & "]."
                        WScript.Quit 3
                End If
        Else
                WScript.Echo "Can't find template file [" & strTemplateFile & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


jordan_74 10-09-2018 18:05 2830773

Iska,
Вечер добрый!!!! А можно пакетным файлом запускать скрипт, чтобы он все файлы реестра обрабатывал, которые лежат в папке "Реестр" ?

Пробовал этот код, не получилось)
Скрытый текст

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0

Iska 10-09-2018 19:06 2830780

jordan_74, а пути:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
        echo [%%~i]
        cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0

Вы поменяли на свои? Какой код у Вас получился? Что сообщает пакетный файл при работе? Что сообщает скрипт?

jordan_74 10-09-2018 20:14 2830792

Iska, у меня вот такой код с моими путями.
Скрипт назвал checkCut.vbs

Скрытый текст

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\РЕЕСТР ЧЕКОВ\реестр\*.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\РЕЕСТР ЧЕКОВ\checkCut.vbs" "%%~i"
)

endlocal
exit /b 0

Iska 10-09-2018 20:41 2830798

jordan_74, и…? Если открыть командную строку и запустить в ней этот пакетный файл, что происходит?

jordan_74 10-09-2018 21:43 2830815

Iska,
Я батник двойным кликом запускаю.
Ошибка вот такая же cscript.exe //nologo "C:\РЕЕСТР ЧЕКОВ\checkCut.vbs" "%%~i"

Iska 10-09-2018 22:19 2830819

Цитата:

Цитата jordan_74
Я батник двойным кликом запускаю. »

Не запускайте двойным кликом. Откройте окно консоли командной строки (Win-R, cmd.exe, Enter), впишите путь к пакетному файлу (путь, естественно, должен быть Ваш):
Скрытый текст

нажмите Enter, покажите, что получилось.

jordan_74 11-09-2018 07:05 2830841

Iska,
Так все работает да! Спасибо! А я спросил потому, что хочется как в лучших домах, "нажал кнопочку" и готово, чтобы как можно меньше кликов делать) Я думал, что можно запустить батник, и уже он запускает в работу скрипт, который отработает все файлы реестров в папке.

Iska 11-09-2018 20:58 2830935

jordan_74, не должно быть никакой разницы между запуском в командной строке или обычным двойным щелчком. Разве что Вы какие-то коррективы вносили в насройки исполнения пакетных файлов.

Давайте попробуем так — закомментировать @echo off и добавить в конец паузу:
Код:

rem @echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
        echo [%%~i]
        cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

pause

endlocal
exit /b 0

Попробуйте запустить на исполнение двойным щелчком, покажите получившийся скриншот (только не выкладывайте на Радикал, пожалуйста), посмотрим.

jordan_74 12-09-2018 17:20 2831041

Вложений: 1
Iska,
Вот что получилось

Iska 12-09-2018 17:26 2831042

jordan_74, замечательно. Убирайте комментарий с первой строки и паузу в конце.

Пакетный файл требуется сохранять в кодировке OEM/866. У Вас это не так, посему и не находится ни единого файла.

А меня ещё здесь шпыняют, нахрена зачем, дескать, писать абсолютно никому не нужные портянки кода с проверкой существования аргументов, каталогов, файлов и прочие хреновины. Ну, вот, не написал — и здрастье-пожалуйста.

jordan_74 12-09-2018 18:13 2831051

Iska,
:lol: мне остается посмеяться только над самим собой
Все работает, обычная невнимательность с моей стороны была причиной всему.
Ещё раз огромное спасибо!!!!!!

Iska 12-09-2018 18:26 2831052

jordan_74, ничего страшного, бывает. А вот мне следовало бы зараз догадаться о причинах :(.

jordan_74 20-09-2018 12:11 2832209

Iska,
Добрый день! Я прошу прощения, понадобилось всё таки сделать кол-во знаком после запятой не 1 а 2
Много перерабатывать, где корректировки внести подскажите пожалуйста?

Iska 20-09-2018 12:27 2832214

Цитата:

Цитата jordan_74
понадобилось всё таки сделать кол-во знаком после запятой не 1 а 2 »

Код:

.Range("L3").Value = Round((anyValue * 18) / 118, 2)

jordan_74 20-09-2018 12:32 2832217

Iska,
Да я уже поправил, спасибо. И теперь встал наверно главный вопрос.
Нужно чтобы скрипт отрабатывал, при этом батник запускающий скрипт и скрипт лежали где то в другом месте, не на компе пользователя
Передавать параметры.
Все для того, чтобы при переносе на другой комп, не приходилось постоянно менять пути в скрипте и батнике.

Iska 20-09-2018 12:48 2832221

jordan_74, поясните более подробно, что Вы имеете в виду.

jordan_74 20-09-2018 12:55 2832223

Iska,
Скрипт, шаблон и батник, который запускает скрипт будут лежать где то в сети.

Пользователь на своём компе будет запускать батник, который активирует(запускает) батник - который запускает в работу скрипт. )) я прошу прощения за такую тавтологию.

У пользователя будет 2 папки - Реестр и Итог, и тот самый батник.

Как это можно осуществить? ) Я полагаю это можно сделать как то с помощью передачи параметров.
В качестве параметров видимо должны быть пути к папке с файлом(ами) реестра, и к папке Итог

Iska 20-09-2018 20:03 2832267

Отнюдь. У нас три составляющих:
  • путь к файлу шаблона;
  • путь к целевому каталогу;
  • путь к исходным файлам.
В нашем коде мы жёстко указывали путь к файлу шаблона и путь к целевому каталогу. Путь к исходным файлам задавался параметром.

Ваши предложения?

jordan_74 25-09-2018 11:57 2832808

Iska,

Откровенно говоря предложений пока нет.

Можно попытаться использовать команду "psexec" для запуска батника(а затем и скрипта по сети)

//что то в духе

@echo off
psexec \\IP или имя компа\Documents and Settings\User\kill.cmd
exit

jordan_74 30-10-2018 20:33 2838486

Приветствую уважаемые форумчане!!!!!
Очень нужна помощь!!! нужно реализовать возможность запуска программы с любого компьютера в сети. Тоесть без привязки к конкретным путям.

Скрытый текст

Option Explicit

Const xlCSV = 6
Const xlWindows = 2


Dim strTemplateFile
Dim strSourceFile
Dim strDestFolder


Dim objFSO
Dim objExcel

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


strTemplateFile = "C:\РЕЕСТР ЧЕКОВ\Шаблон\check.csv"
strDestFolder = "C:\РЕЕСТР ЧЕКОВ\Итог"

If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)

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

If objFSO.FileExists(strTemplateFile) Then
If objFSO.FileExists(strSourceFile) Then
If objFSO.FolderExists(strDestFolder) Then
Set objExcel = WScript.CreateObject("Excel.Application")

objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
Set objTemplateFile = objExcel.Workbooks.Item(1)

Set objSourceFile = objExcel.Workbooks.Open(strSourceFile, False, True)

For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
With objTemplateFile.Worksheets.Item(1)
anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value

.Range("B3").Value = anyValue
.Range("F2").Value = anyValue

anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value

.Range("D3").Value = anyValue
.Range("D4").Value = anyValue
.Range("H3").Value = anyValue

.Range("L3").Value = Round((anyValue * 18) / 118, 1)
End With

strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(strSourceFile) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))

If objFSO.FileExists(strDestFile) Then
objFSO.DeleteFile strDestFile, True
End If

objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
Next

objSourceFile.Close False
objTemplateFile.Close False

objExcel.Quit
Set objExcel = Nothing
Else
WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
WScript.Quit 4
End If
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 3
End If
Else
WScript.Echo "Can't find template file [" & strTemplateFile & "]."
WScript.Quit 2
End If

Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If

WScript.Quit 0

Iska 30-10-2018 20:46 2838494

jordan_74, я могу лишь повторить свой вопрос — как Вы это видите?

jordan_74 30-10-2018 21:09 2838499

Iska, Файл скрипта и шаблон чека находятся в отдельных папка в сети.
У пользователя папка с файлом реестра и папка с целевыми файлами чеков, а также исполнительный файл, который запускает процесс преобразования.

Пользователь запускает условно батник, который запускает в работу скрипт, лежащий в сети. Скрипт обрабатывает файл реестра и складывает готовые файлы чека в итоговую папку.

Как конкретно это реализовать откровенно говоря не знаю (

Iska 30-10-2018 21:55 2838507

Цитата:

Цитата jordan_74
и папка с целевыми файлами чеков »

Путь к ней будет одинаков для любых пользователей на любых машинах? Или же мы будем её располагать относительно:
Цитата:

Цитата jordan_74
папка с файлом реестра »

?

jordan_74 30-10-2018 22:07 2838513

Цитата:

Цитата Iska
Путь к ней будет одинаков для любых пользователей на любых машинах? Или же мы будем её располагать относительно: »

Нужно располагать относительно, как и папку с файлом реестра

Iska 30-10-2018 22:22 2838517

Цитата:

Цитата jordan_74
Нужно располагать относительно »

И как именно?

Например, каталог с файлами реестра располагается в «C:\Мои проекты\0191\Архив\Архив\Реестр». Тогда скрипт будет предполагать наличие каталога для целевых файлов рядом с каталогом с файлами реестра, т.е, относительно каталога с файлами реестра — как «..\Итог», что в данном конкретном случае отобразится на каталог «C:\Мои проекты\0191\Архив\Архив\Итог».

Или же: «C:\Моя папка\Мой Реестр» и, соответственно — «C:\Моя папка\Итог».

Скрипт даже может сам создавать каталог для целевых файлов, буде таковое потребно.

Цитата:

Цитата jordan_74
как и папку с файлом реестра »

А это как?!

jordan_74 30-10-2018 22:27 2838519

Цитата:

Цитата Iska
Скрипт даже может сам создавать каталог для целевых файлов, буде таковое потребно. »

Здесь полностью согласен.

Я имел ввиду что каталог с целевыми файлами предполагает наличие рядом каталога с файлами реестра, именно так

Iska 30-10-2018 22:59 2838529

Попробуйте так:
Скрытый текст
Код:

Option Explicit

Const xlCSV = 6
Const xlWindows = 2


Dim strSourceFolder

Dim strTemplateFile

Dim strRelativeDestFolder
Dim strDestFolder

Dim objFSO
Dim objExcel

Dim objFile

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


strTemplateFile      = "\\Server01\Share01\Шаблон\check.csv"
strRelativeDestFolder = "..\Итог"

If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FileExists(strTemplateFile) Then
                If objFSO.FolderExists(strSourceFolder) Then
                        strDestFolder = objFSO.GetAbsolutePathName(objFSO.BuildPath(strSourceFolder, strRelativeDestFolder))
                       
                        If Not objFSO.FolderExists(strDestFolder) Then
                                objFSO.CreateFolder strDestFolder
                        End If
                       
                        Set objExcel = Nothing
                       
                        For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                                Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                                        Case "xls", "xlsx"
                                                If objExcel Is Nothing Then
                                                        Set objExcel = WScript.CreateObject("Excel.Application")
                                                End If
                                               
                                                objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
                                                Set objTemplateFile = objExcel.Workbooks.Item(1)
                                               
                                                Set objSourceFile = objExcel.Workbooks.Open(objFile.Path, False, True)
                                               
                                                For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
                                                        With objTemplateFile.Worksheets.Item(1)
                                                                anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
                                                               
                                                                .Range("B3").Value = anyValue
                                                                .Range("F2").Value = anyValue
                                                               
                                                                anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value
                                                               
                                                                .Range("D3").Value = anyValue
                                                                .Range("D4").Value = anyValue
                                                                .Range("H3").Value = anyValue
                                                               
                                                                .Range("L3").Value = Round((anyValue * 18) / 118, 2)
                                                        End With
                                                       
                                                        strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(objFile.Name) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))
                                                       
                                                        If objFSO.FileExists(strDestFile) Then
                                                                objFSO.DeleteFile strDestFile, True
                                                        End If
                                                       
                                                        objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
                                                Next
                                               
                                                objSourceFile.Close False
                                                objTemplateFile.Close False
                                End Select
                        Next
                       
                        If Not objExcel Is Nothing Then
                                objExcel.Quit
                                Set objExcel = Nothing
                        End If
                Else
                        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                        WScript.Quit 3
                End If
        Else
                WScript.Echo "Can't find template file [" & strTemplateFile & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
        WScript.Quit 1
End If

WScript.Quit 0


Теперь пусть перетаскивают на скрипт (или на ярлык на скрипт) исходную папку с файлами реестра. Ваш путь к файлу с шаблоном чека укажите в переменной strTemplateFile. Целевой каталог, если таковой не существует, будет создан.

jordan_74 31-10-2018 07:32 2838574

Iska,
Работает! Спасибо!
Хотел вот ещё что уточнить, сейчас скрипт округляет сумму до двух знаков после запятой.
Используется функция round. Но я так понял, что это обычное бухгалтерское округление тоесть Round(2,5) = 2
У меня если сумма будет 2,569 то округление должно происходить в большую сторону, тоесть 2, 57

Читал про функцию MRound, но не уверен, что тут она подойдёт

jordan_74 31-10-2018 09:25 2838586

Вот пример:

Public Function MatRound#(v#, n&)
'v - округляемое число;
'n - разряд, до которого выполняется округление:
' ...
' -2 - до сотен;
' -1 - до десятков;
' 0 - до единиц (до целых);
' 1 - до десятых;
' 2 - до сотых;
' ...
MatRound = Format(v * 10 ^ n, "0") / 10 ^ n
End Function

Iska 31-10-2018 18:21 2838710

Цитата:

Цитата jordan_74
Но я так понял, что это обычное бухгалтерское округление тоесть Round(2,5) = 2 »

Да, это т.н. банковское округление, или округление к ближайшему чётному:
Цитата:

The Round function performs round to even, which is different from round to larger. The return value is the number closest to the value of expression, with the appropriate number of decimal places. If expression is exactly halfway between two possible rounded values, the function returns the possible rounded value whose rightmost digit is an even number. (In a round to larger function, a number that is halfway between two possible rounded values is always rounded to the larger number.)

Round to even is a statistically more accurate rounding algorithm than round to larger.

jordan_74 31-10-2018 21:12 2838760

Iska, А можно сделать обычное округление, когда после запятой стоит 5 и выше, округлять в большую сторону, а если меньше 5 то в меньшую?

Iska 31-10-2018 21:35 2838767

Попробуйте так (не проверялось):
Код:

.Range("L3").Value = Fix((anyValue * 18 / 118 + 0.005) * 100) / 100

jordan_74 07-11-2018 11:24 2839662

Вложений: 1
Iska, Добрый день!
не могу проверить к сожалению, повторяется одна и та же ошибка.
http://forum.oszone.net/attachment.p...1&d=1541579064

Запускаю с рабочего стола, перетаскивая папку с файлами реестра на ярлык скрипта. Сам скрипт и файл шаблона в папке на диске C:

Код вот такой:
Скрытый текст

Option Explicit

Const xlCSV = 6
Const xlWindows = 2


Dim strSourceFolder

Dim strTemplateFile

Dim strRelativeDestFolder
Dim strDestFolder

Dim objFSO
Dim objExcel

Dim objFile

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


strTemplateFile = "C:\Реестр\Шаблон\check.csv"
strRelativeDestFolder = "..\Итог"

If WScript.Arguments.Count = 1 Then
strSourceFolder = WScript.Arguments.Item(0)

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

If objFSO.FileExists(strTemplateFile) Then
If objFSO.FolderExists(strSourceFolder) Then
strDestFolder = objFSO.GetAbsolutePathName(objFSO.BuildPath(strSourceFolder, strRelativeDestFolder))

If Not objFSO.FolderExists(strDestFolder) Then
objFSO.CreateFolder strDestFolder
End If

Set objExcel = Nothing

For Each objFile In objFSO.GetFolder(strSourceFolder).Files
Select Case LCase(objFSO.GetExtensionName(objFile.Name))
Case "xls", "xlsx"
If objExcel Is Nothing Then
Set objExcel = WScript.CreateObject("Excel.Application")
End If

objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
Set objTemplateFile = objExcel.Workbooks.Item(1)

Set objSourceFile = objExcel.Workbooks.Open(objFile.Path, False, True)

For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
With objTemplateFile.Worksheets.Item(1)
anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value

.Range("B3").Value = anyValue
.Range("F2").Value = anyValue

anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value

.Range("D3").Value = anyValue
.Range("D4").Value = anyValue
.Range("H3").Value = anyValue

.Range("L3").Value = Fix((anyValue * 18 / 118 + 0.005) * 100) / 100
End With

strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(objFile.Name) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))

If objFSO.FileExists(strDestFile) Then
objFSO.DeleteFile strDestFile, True
End If

objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
Next

objSourceFile.Close False
objTemplateFile.Close False
End Select
Next

If Not objExcel Is Nothing Then
objExcel.Quit
Set objExcel = Nothing
End If
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 3
End If
Else
WScript.Echo "Can't find template file [" & strTemplateFile & "]."
WScript.Quit 2
End If

Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
WScript.Quit 1
End If

WScript.Quit 0

Iska 07-11-2018 12:24 2839676

Проверьте кодировку, в которой сохранён файл скрипта. Она должна быть ANSI/1251.

jordan_74 07-11-2018 12:52 2839679

Цитата:

Цитата Iska
Проверьте кодировку, в которой сохранён файл скрипта. Она должна быть ANSI/1251. »

Сработало! Хотя до этого никаких манипуляций с кодировкой не делал, и отрабатывало

[q=Iska] у меня огромная просьба встроить в скрипт логирование. Видел варианты, в которых создается лог в случае ошибки. Мне полагается тут нечему ломаться. Нашел вот такой вариант:
Скрытый текст

Const ForAppending = 8
Dim strLogFile, strDate

strDate = Date
strLogFile = "Logs\Find_Primary_" & Year(strDate) & Month(strDate) & Day(strDate) & ".log"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLogFile = objFSO.OpenTextFile(strLogFile, ForAppending, True)


objLogfile.WriteLine "Testing my new log file"
objLogFile.Close


Есть вариант как создается за бугром у ребят) https://community.spiceworks.com/scr...-to-a-vbscript

Iska 07-11-2018 13:22 2839687

jordan_74, это всё замечательно. Но какой в этом смысл в данном-то случае?

jordan_74 07-11-2018 13:49 2839694

Iska,
Способ контроля.Например

Кол-во обработанных строк должно равняться кол-ву созданных чеков;
Сумма по реестру должна равняться сумме всех сумм в чеках данного реестра )

Чтобы если что то потерялось, мы могли понимать сколько было изначально чеков.
Ну и чтобы итоговая сумма совпадала, или расхождения были минимальные.

Iska 07-11-2018 14:09 2839698

Цитата:

Цитата jordan_74
Кол-во обработанных строк должно равняться кол-ву созданных чеков; »

Что тут можно контролировать, если по другому и быть не может:
Код:

For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
        …
        objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
Next

?! Не вижу в этом никакого смысла.

Цитата:

Цитата jordan_74
Сумма по реестру должна равняться сумме всех сумм в чеках данного реестра ) »

Честно сказать, мне это ни о чём не говорит :).

Цитата:

Цитата jordan_74
Чтобы если что то потерялось, »

Количество строк (за вычетом двух) всегда будет совпадать с количеством сгенерированных файлов.

Цитата:

Цитата jordan_74
Ну и чтобы итоговая сумма совпадала, или расхождения были минимальные. »

Поясните подробнее.

jordan_74 07-11-2018 15:02 2839702

Цитата:

Цитата Iska
Что тут можно контролировать, если по другому и быть не может:
Код:
For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2

objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
Next
?! Не вижу в этом никакого смысла. »

Это для информации, которая должна быть понятна простому бухгалтеру. Столько то строк реестра отработано-получилось столько то чеков.

Цитата:

Цитата Iska
Сумма по реестру должна равняться сумме всех сумм в чеках данного реестра ) »
Честно сказать, мне это ни о чём не говорит . »

В файле реестра мы откидываем 2 строки; название столбцов и итоговую сумму по реестру. В каждой "рабочей" строке есть поле сумма, значение которого и копируется в шаблон чека.
Допустим в реестре 40 рабочих строк и общая сумма будет 1600, то при складывании сумм(ячейка H3) в 40 созданных чеках, должно быть тоже 1600 =)

Цитата:

Цитата Iska
Цитата jordan_74:
Ну и чтобы итоговая сумма совпадала, или расхождения были минимальные. » »

Это тоже самое, что я описал выше

Iska 08-11-2018 05:55 2839790

Цитата:

Цитата jordan_74
Это для информации, которая должна быть понятна простому бухгалтеру. Столько то строк реестра отработано-получилось столько то чеков. »

Ну, добавьте выделенное:
Код:

                                                        objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
                                                Next
                                               
                                                WScript.Echo "Total rows processed: " & CStr(objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2)
                                               
                                                objSourceFile.Close False

Цитата:

Цитата jordan_74
Допустим в реестре 40 рабочих строк и общая сумма будет 1600, то при складывании сумм(ячейка H3) в 40 созданных чеках, должно быть тоже 1600 »

Естественно. И в этом случае по другому быть тоже не может. Не может оно никак «потеряться». И расхождений тут быть не может. Никаких — ни минимальных, ни максимальных.

jordan_74 08-11-2018 13:39 2839870

Цитата:

Цитата Iska
WScript.Echo "Total rows processed: " & CStr(objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2) »

Я так полагаю эта строчка выдает сообщение сколько строк обработано по каждому из реестров?

Можно ли сделать, чтобы данные записывались в лог файл в формате txt* ?

Iska 08-11-2018 14:17 2839877

Цитата:

Цитата jordan_74
Я так полагаю эта строчка выдает сообщение сколько строк обработано по каждому из реестров? »

Да.

Цитата:

Цитата jordan_74
Можно ли сделать, чтобы данные записывались в лог файл в формате txt* ? »

Можно. Но позже.

jordan_74 08-11-2018 18:56 2839920

Iska,
хорошо

jordan_74 22-11-2018 08:50 2842020

Iska, День добрый! С логированием разобрался, с горем пополам.
Хочу сделать проверку, в ситуации когда папка с файлами реестра пуста, чтобы выводилось сообщение об этом.

Просьба подсказать где ошибка.. у меня выводится сообщение что реестров нет (папка пуста) при любых случаях, даже если файлы там есть.

Скрытый текст

Option Explicit

Const xlCSV = 6
Const xlWindows = 2

Dim Log 'Лог-файл


Dim strSourceFolder
Dim strSourceFile

Dim strTemplateFile

Dim strRelativeDestFolder
Dim strDestFolder

Dim strLogDestFolder 'Папка, в которой будут создаваться лог-файлы

Dim objFSO
Dim objExcel

Dim objFolder
Dim colFiles

Dim objFile

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim strLogDestFile

Dim SumSourceFile 'Сумма по реестру
Dim SumDestFile 'Сумма по чекам
Dim SumTotal 'Общая сумма

Dim CountSourceFiles 'Для подсчета файлов реестра
CountSourceFiles = 0

Dim anyValue

'Здесь указать полный адрес папки с файлами реестра:
strSourceFolder = "C:\Реестр\Реестр"


strTemplateFile = "C:\Реестр\Шаблон\check.csv"
strRelativeDestFolder = "..\Итог"
strLogDestFolder = "C:\Касса"

'If WScript.Arguments.Count = 1 Then
' strSourceFolder = WScript.Arguments.Item(0)

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

If objFSO.FileExists(strTemplateFile) Then
If objFSO.FolderExists(strSourceFolder) Then
If objFSO.FileExists(objSourceFile) Then

strDestFolder = objFSO.GetAbsolutePathName(objFSO.BuildPath(strSourceFolder, strRelativeDestFolder))
If Not objFSO.FolderExists(strDestFolder) Then
objFSO.CreateFolder strDestFolder
End If

'Создание папки Касса:
If Not objFSO.FolderExists(strLogDestFolder) Then
objFSO.CreateFolder strLogDestFolder
End If

Set objExcel = Nothing

For Each objFile In objFSO.GetFolder(strSourceFolder).Files

'Подсчет количества файлов реестра:
CountSourceFiles = CountSourceFiles + 1

Select Case LCase(objFSO.GetExtensionName(objFile.Name))
Case "xls", "xlsx"
If objExcel Is Nothing Then
Set objExcel = WScript.CreateObject("Excel.Application")
End If

objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
Set objTemplateFile = objExcel.Workbooks.Item(1)

Set objSourceFile = objExcel.Workbooks.Open(objFile.Path, False, True)

For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
With objTemplateFile.Worksheets.Item(1)
anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value

.Range("B3").Value = anyValue
.Range("F2").Value = anyValue

anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value

.Range("D3").Value = anyValue
.Range("D4").Value = anyValue
.Range("H3").Value = anyValue

.Range("L3").Value = Fix((anyValue * 18 / 118 + 0.005) * 100) / 100

'Подсчет общей суммы:
SumTotal = SumTotal + anyValue

'Подсчет суммы по реестру:
SumSourceFile = SumSourceFile + anyValue

'Подсчет суммы по чекам:
SumDestFile = SumDestFile + .Range("H3").Value

End With

strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(objFile.Name) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))

If objFSO.FileExists(strDestFile) Then
objFSO.DeleteFile strDestFile, True
End If

objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True

Next

'В strLogDestFile записывается где будет создан лог-файл и как он будет называться:
strLogDestFile = objFSO.BuildPath(strLogDestFolder, Day(now) & "_" & Month(now) & "_" & Year(now) & ".txt")

'Открытие лог-файла или создание, если его нет:
Set Log = objFSO.OpenTextFile(strLogDestFile, 8, True)
'Запись данных в лог-файл:
Log.Write FormatDateTime(now, 0) 'В лог записывается дата и время обработки файлов
Log.Write ". Обработан файл " & objFSO.GetBaseName(objFile.Name) & "." & objFSO.GetExtensionName(objFile.Name)
Log.Write ". Строк обработано: " & CStr(objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2)
Log.Write ". Чеков создано: " & CStr(objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2)
Log.Write ". Сумма по реестру: " & SumSourceFile
Log.Write ". Сумма по чекам: " & SumDestFile
'Сравнение сумм по реестру и чекам - если они равны, то это записывается в лог
If SumSourceFile = SumDestFile Then
Log.Write ". Суммы равны."
End If
Log.WriteBlankLines(1)
Log.Close

'Обнуление сумм, чтобы для каждого файла реестра и его чеков считалась своя отдельная сумма
SumSourceFile = 0
SumDestFile = 0

objSourceFile.Close False
objTemplateFile.Close False
End Select
Next

If Not objExcel Is Nothing Then
objExcel.Quit
Set objExcel = Nothing
End If

' Очищение папки Реестр
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetFolder(strSourceFolder)
Set colFiles = objFolder.Files

For Each objFolder in colFiles
objFolder.Delete

next

'Выводит окно о завершении обработки файлов:
WScript.Echo "Чеки сформированы успешно. Обработано " & CountSourceFiles & " реестра на сумму " & SumTotal & "."

Else
WScript.Echo "Нет файла реестра [" & strSourceFile & "]."
WScript.Quit 3
End if
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 2
End If

Set objFSO = Nothing

Else
WScript.Echo "Can't find template file [" & strTemplateFile & "]."
WScript.Quit 1
End If


'Else
' WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
' WScript.Quit 1
'End If

WScript.Quit 0



Время: 17:35.

Время: 17:35.
© OSzone.net 2001-