CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Аватара пользователя
megaloman

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение megaloman »

Ka3hak,

Изменил последний вариант Вашей таблицы, придумал немного другой файл с данными.

Смысл этого извращения мне до сих пор непонятен

[spoiler]Это скрипт[/spoiler]

[spoiler]

Код: Выделить всё

FileIn = "Z:\Soft_In\Мой Пример.cfg"
FileOut = "Z:\Soft_In\Мой Пример.xls"
Con = Array("B", "C")                   'В этих столбцах записываются заголовки блоков
Dan = Array("D", "E", "G", "H")         'В этих столбцах записываются данные
Str1 = 5                                'В этой строке первое данное
NoNull = "E"                            'В этом столбце обязательно должны быть данные
Form = Array("F")                       'В этих столбцах формулы. В первой строке с данными они должны быть
Beg = "#"                               'Признак начала секции
Delim = ";"                             'Разделитель данных
Set FSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set fIn = FSO.OpenTextFile(FileIn, 1, False)
If Err.Number <> 0 Then
    MsgBox "File   " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")"
    WScript.Quit 2
End If
On Error GoTo 0
Alls = Split(fIn.ReadAll, vbCrLf)
fIn.Close
With CreateObject("Excel.Application")
	.Visible = True
	.Workbooks.Open FileOut
i = Str1
Do
    If Trim(.Range(NoNull + CStr(i))) = "" Then
        Exit Do
    End If
    i = i + 1
Loop
NCon = UBound(Con)
NDan = UBound(Dan)
LBegin = False
For Each j In Alls
    If Not Trim(j) = "" Then
        If Left(j, 1) = Beg Then
            If LBegin Then
                For Each m In Con
                    .Range(m + CStr(i1) + ":" + m + CStr(i2 - 1)).Merge
                Next
            End If
            LBegin = True
            i1 = i
            i2 = i
            jCon = Split(j, Delim)
            jj = 0
            For Each k In jCon
                If jj <= NCon Then
                    .Range(Con(jj) + CStr(i1)) = Replace(k, Beg, "")
                End If
                jj = jj + 1
            Next
        Else
            If LBegin Then
                jCon = Split(j, Delim)
                jj = 0
                For Each k In jCon
                    If jj <= NDan Then
                        .Range(Dan(jj) + CStr(i2)) = k
                    End If
                    jj = jj + 1
                Next
                For Each k In Form
                    .Range(k + CStr(Str1)).Copy
                    .Range(k + CStr(i)).PasteSpecial -4123
                Next
                i = i + 1
                i2 = i
            End If
        End If
    End If
Next
If LBegin Then
    For Each m In Con
        .Range(m + CStr(i1) + ":" + m + CStr(i2 - 1)).Merge
    Next
End If
	.ActiveWorkbook.Save
	.ActiveWorkbook.Close
	.Quit
End With
[/spoiler]

Это файл с данными

[spoiler]

Код: Выделить всё

#Для тех, кто в танке;куб. градусы
1;огонь;13;4
2;вода;6;7
3;медные трубы;14;6
#Для страуса;зиверты
5;песок;8;5
6;цемент;9;6
7;плитка;10;7
#Ритуальные услуги;кв.литры
9;краска;4;6
10;грунтовка;8;7
11;шпатлевка;13;5
[/spoiler]

Распакуйте архив, пропишите в скрипте свои пути. Посмотрите на Excel-файл до и после скрипта.

Это пример того, что сделать можно что угодно, но не думаю, что практически он полезен - мутная постановка с непонятным смыслом.

Если захотите изменить таблицу, в скрипте есть настройки сверху на уровне входных данных (с комментариями).
Вложения
Вложение Мой Пример.rar больше недоступно
Вложения
Мой Пример.rar
(5.61 КБ) 0 скачиваний
Мой Пример.rar
(5.61 КБ) 0 скачиваний
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение megaloman »

Ka3hak, я вовсе не тонкий знаток правил портала. Знаю, что если пометите тему решенной, это позволит и в дальнейшем создавать там сообщения, относящиеся к этой теме.
Аватара пользователя
Ka3hak

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение Ka3hak »

megaloman, всё Великолепно отрабатывает, повторюсь (готов повторять это вечно). Собственно о доп.вопросиках...

Я прилагаю архив со скриптами и .cfg файлами, которые как производят записи индивидуально, так и один, "Общий".


Вопрос:

Как мне реализовать строку типа:№6(Стяжка) после каждого успешного внесения данных из "Общий"?

Подразумевается выравнивание по левому краю (если возможно), полужирный текст, параметр "Объединить и поместить в центре", и, желательно (если возможно), соответствующий цвет заливки.

СтрОки столбца "A" можно причесть туда же, не принципиально. Иными словами - задать вышеуказанные значения для всей строки, полностью.

Осмелюсь только догадываться, что есть возможность дополнить скрипт, а сами параметры прописать в файле "Общий.cfg", не так ли?

Пример желаемого результата в строке 19 файла "Образец.xls".
Вложения
Вложение megaloman.zip больше недоступно
Вложения
megaloman.zip
(36.25 КБ) 0 скачиваний
megaloman.zip
(36.25 КБ) 0 скачиваний
Аватара пользователя
Ka3hak

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение Ka3hak »

Нагуглил вот такой вариант:

XLApp.ActiveWorkbook.ActiveSheet.Range("A28:F30").Merge(True);

Теперь понять бы как это работает и куда его приткнуть, чтобы было грамотно :\
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение megaloman »

Существенно доработал.

[spoiler]Код:
[/spoiler]

Код: Выделить всё

^ПОЛЫ
^^Стяжка
#Устройство армированных стяжек толщиной 20мм\м2\Устройство монолитных ж/б и бетонных конструкций
раствор или бетон\м3\1,3\5
сетка сварная\м2\1,08\7,08
#Устройство стяжек армированных полипропиленовой фиброй\м3\Устройство монолитных ж/б и бетонных конструкций
цемент\кг\280\54
песок\м3\1,15\2
фибра\кг\0,7\0,9
^^Устройство полов
#Для тех, кто в танке\куб. градусы\Устройство монолитных ж/б и бетонных конструкций
огонь\град\13\4
вода\литр\6\7
медные трубы\м\14\6
^Зоопарк
^^Клетки
#Для страуса\зиверты\Устройство монолитных ж/б и бетонных конструкций
песок\м3\8\5
цемент\кг\9\6
плитка\м2\10\7
#Ритуальные услуги\кв.литры\Устройство монолитных ж/б и бетонных конструкций
краска\литр\4\6
грунтовка\литр\8\7
шпатлевка\литр\13\5


Код:

Код: Выделить всё

FileIn = "Z:\Soft_In\Мой Пример New.cfg"
FileOut = "Z:\Soft_In\Мой Пример New.xls"
With WScript.Arguments
    If .Count >1 Then FileOut=.Item(1)
    If .Count >0 Then FileIn=.Item(0)
End With
Con = Array("B", "C", "G")              'В этих столбцах записываются заголовки блоков
Dan = Array("D", "E", "H", "I")         'В этих столбцах записываются данные
Str1 = 5                                'В этой строке первое данное
NoNull = "D"                            'В этом столбце обязательно должны быть данные
Form = Array("A", "F")                  'В этих столбцах формулы.
Forms = Array("=СЧЁТЗ(D" + CStr(Str1) + ":D??)", "=H??*I??") 'Формулы для строки
BegGl = "^"                             'Признак начала главы
BegRz = "^^"                            'Признак начала раздела (удвоенный символ главы)
RZag = "A??:G??"                        'Диапазон заголовка главы и раздела
InteriorColorIndexGl = 35               'Цвет главы
InteriorColorIndexRz = 40               'Цвет раздела
Beg = "#"                               'Признак начала секции
Delim = "\"                             'Разделитель данных
Set FSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set fIn = FSO.OpenTextFile(FileIn, 1, False)
If Err.Number  0 Then
    MsgBox "File   " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")"
    WScript.Quit 2
End If
On Error GoTo 0
If Not FSO.FileExists(FileOut) Then
    MsgBox "File   " + vbCrLf + FileOut + vbCrLf + "Not Exists"
    WScript.Quit 2
End If
Alls = Split(fIn.ReadAll, vbCrLf)
fIn.Close
i = Str1
CZag = Mid(RZag, 1, InStr(1, RZag, "??:") - 1)
With CreateObject("Excel.Application")
	.Visible = True
	.Workbooks.Open FileOut
Do                  ''''''''''''''''''''''''''''''''''''''
    If Trim(.Range(NoNull + CStr(i))) = "" And Trim(.Range(CZag + CStr(i))) = "" Then
        Exit Do
    End If
    i = i + 1
Loop
NCon = UBound(Con)
NDan = UBound(Dan)
LBegin = False
For Each j In Alls
    If Not Trim(j) = "" Then
        If Left(j, 1) = BegGl Then      '========================================
            ZZ = Replace(RZag, "??", CStr(i))
            i = i + 1
            With .Range(ZZ)
                .Merge
                .VerticalAlignment = -4160
                .Font.FontStyle = "полужирный"
            End With
            If Left(j, 2) = BegRz Then
                .Range(ZZ).Interior.ColorIndex = InteriorColorIndexRz
                .Range(ZZ).HorizontalAlignment = -4131
                .Range(ZZ) = Replace(j, BegRz, "")
            Else
                .Range(ZZ).Interior.ColorIndex = InteriorColorIndexGl
                .Range(ZZ).HorizontalAlignment = -4108
                .Range(ZZ) = Replace(j, BegGl, "")
            End If
        Else                            '========================================
        If Left(j, 1) = Beg Then
            If LBegin Then
                For Each m In Con
                    .Range(m + CStr(i1) + ":" + m + CStr(i2 - 1)).Merge
                Next
            End If
            LBegin = True
            i1 = i
            i2 = i
            jCon = Split(j, Delim)
            jj = 0
            For Each k In jCon
                If jj 
Вложения
Вложение 20191223-OsZone.rar больше недоступно
Вложения
20191223-OsZone.rar
(18.14 КБ) 0 скачиваний
20191223-OsZone.rar
(18.14 КБ) 0 скачиваний
Аватара пользователя
Ka3hak

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение Ka3hak »

Цитата megaloman:



Существенно доработал.
CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT




О БОжечки... Какая прелесть! Спасибо громадное!!! Это просто Великолепно...!

(но, как всегда, что в моём репертуаре - придумайте мне велосипед и научите ездить...)

Конечно понимаю, что "в край оборзел" и крайне не удобно спрашивать у Вас что-либо ещё, но:

- Зачем в скрипте задаётся формула для столбца "A"? В рабочем .xls, согласно стандарту оформления,

происходит нумерация "производимых работ" столбца "B" - от 1 и до max кол-ва (для каждого пункта каждого из разделов). //пример приложил (выделено жёлтеньким)

Можно ли такое как-нибудь исполнить? Если это слишком трудоёмко - может и вовсе не производить запись данных в этот столбец? Значит будет делаться ручками.

- Ещё момент с ячейками столбца "G"... Они объединены в каждом разделе и носят имя "Устройство монолитных ж/б и бетонных конструкций". Так тоже можно сделать? //пример приложил (выделено жёлтеньким)

P.S. Опять же отсылка на трудоёмкость. Возможно это не стоит Ваших усилий и тогда уж "хрен с ним", пусть остаётся так.

- Не особо понял момент "запуск скрипта с с аргументами". Подразумевается указание параметров запуска, или как? Если я не указываю аргумент, то скрипт не отрабатывает

Может тогда ну их, эти танцы? Ведь (повторюсь)
пользователь не будет напрямую взаимодействовать со скриптами, а только с визуальным интерфейсом, так что скрипты вполне могут находиться в постоянной боеготовности.
Вложения
Ласт момент ;).zip
(20.92 КБ) 0 скачиваний
Ласт момент ;).zip
(20.92 КБ) 0 скачиваний
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение megaloman »

Цитата Ka3hak:



Зачем в скрипте задаётся формула для столбца "A"? .... может и вовсе не производить запись данных в этот столбец
CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT




Это делается на уровне настроек:

Код:

Код: Выделить всё

'Form = Array("A", "F")                  'В этих столбцах формулы.
Form = Array("F")                  'В этих столбцах формулы.
'Forms = Array("=СЧЁТЗ(D" + CStr(Str1) + ":D??)", "=H??*I??") 'Формулы для строки
Forms = Array("=H??*I??") 'Формулы для строки


Цитата Ka3hak:



- Не особо понял момент "запуск скрипта с с аргументами". Подразумевается указание параметров запуска, или как? Если я не указываю аргумент, то скрипт не отрабатывает
CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT




Что значит не отрабатывает?

Если в тексте скрипта указаны реальные пути файлов, то при отсутствии аргументов при запуске, возьмутся указанные файлы.

Если указаны аргумент(ы) (сначала cfg затем xls) - то возьмется то, что в аргументе

Остальные идеи пока не осознал.
Аватара пользователя
Ka3hak

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение Ka3hak »

Цитата megaloman:



'Forms = Array("=СЧЁТЗ(D" + CStr(Str1) + ":D??)", "=H??*I??") 'Формулы для строки
CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT




Ах, да... Вот этот момент я недоглядел. Исключал только параметр "'Form = Array("A", "F")". Спасибо.


Цитата megaloman:



Если указаны аргумент(ы)
CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT




А что подразумевается под словом "аргументы"? О каких именно значениях речь?- Тогда самый главный момент. Какие процедуры или функции необходимо исключить для отмены своего рода "бэкапа" (.done)?

(вопрос из разряда: "на будущее")
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT

Сообщение megaloman »

Цитата Ka3hak:



А что подразумевается под словом "аргументы"? О каких именно значениях речь?
CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT




Например (в текстовом файле описано) запуск скрипта

Код:

Код: Выделить всё

я191223.vbs "Z:\Soft_In\Мой Пример New.cfg" "Z:\Soft_In\Мой Пример New.xls"

В аргументах полное имя cfg-файла и xls-файла.

При отсутствии втрорго аргумента (файла XLS) его имя возьмется из текста скрипта
Цитата Ka3hak:



Какие процедуры или функции необходимо исключить для отмены своего рода "бэкапа" (.done)?
CMD/BAT - [решено] как внести коррективы в .xls файл используя .BAT




Закомментировать (хватит и одного ')

Код:

Код: Выделить всё

''''''''''FSO.MoveFile FileIn, FileIn + ".Done"
Ответить

Вернуться в «Скриптовые языки администрирования Windows»