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

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

Ka3hak 16-12-2019 19:22 2900752

как внести коррективы в .xls файл используя .BAT
 
Вложений: 1
День добрый Уважаемые знатоки, всеми нами любимого, супер-форума OSZone!
Уважаемый "Боженька кодеров" megaloman, ну и конечно же Iska, дорогие...
Излагаю суть:
1) Необходимо внести коррективы в .xls-файл по средствам .BAT, .CMD либо .VBS.
Лучше наверное будет .VBS, потому как на BAT-ники многие антивирусы попросту ругаются. А там, конечно же, на ваше усмотрение, Уважаемые.
Почему коррективы? Потому, как столбцы в .xls изначально размечены по ширине и присутствует некая шапка-заголовок.
Информация заносится "в строку", в каждую ячейку, (слева на право :D), как в текстовом, так и в числовом виде (зависит от типа столбца).
Для примера: (№3|Вася Пупкин|Мужчина|КрасаУчиГ|28|ЖиЕсть);
или: (12|текст|текст|текст|56|текст), в общем, что-то вроде того.
2) Возможно ли выполнить проверку на "пустоту строки"? Т.е. строки №1,№2,№3 уже заполнены Васей, Федей и Толиком, а нужна запись в №4 - как следствие.
Или, другими словами, "запись в близжайшую свободную строку",
что в конкретной задаче необходимо для последовательности:
#1
#2
#3
...


3) Есть ли возможность привязать вдовесок какую-нибудь формулу, например "произведение чисел" или ячеек?

P.S. Возможно я всё усложняю и "пункт 2)" можно реализовать как-то иначе. Например несколько BAT-ников(если на .BAT всё же пал выбор)
вносят коррективы в один ОСНОВНОЙ (пополня список Вась, Петь и т.д.), а тот уже одним махом внесёт все данные в .xls
Т.е. BAT1(№1), BAT2(№2), BAT(...) to>>> .BAT(основной)
(№1|текст|число|текст|)
(№2|текст|число|текст|)
to>>> .xls


Мне кажется, что так даже будет лучше. Но вот незадача! Снова проверка ближайших свободных "пустых строк" :(

Iska 16-12-2019 21:23 2900774

Цитата:

Цитата Ka3hak
1) Необходимо внести коррективы в .xls-файл по средствам .BAT, .CMD либо .VBS. »

Про первое — забудьте.

Цитата:

Цитата Ka3hak
потому как на BAT-ники многие антивирусы попросту ругаются. »

Не видел ни единого разу.

Цитата:

Цитата Ka3hak
Информация заносится "в строку", в каждую ячейку, (слева на право :D), как в текстовом, так и в числовом виде (зависит от типа столбца).
Для примера: (№3|Вася Пупкин|Мужчина|КрасаУчиГ|28|ЖиЕсть);
или: (12|текст|текст|текст|56|текст), в общем, что-то вроде того. »

Где файл Рабочей книги, упакованный в архив и приложенный к сообщению («что-то вроде того» может вызвать только аналогичный ответ)? Как и чем «заносится информация» на Рабочий лист?

Цитата:

Цитата Ka3hak
2) Возможно ли выполнить проверку на "пустоту строки"? Т.е. строки №1,№2,№3 уже заполнены Васей, Федей и Толиком, а нужна запись в №4 - как следствие.
Или, другими словами, "запись в близжайшую свободную строку", »

Легко. Как только будет от Вас выложен образец Рабочей книги.

Цитата:

Цитата Ka3hak
3) Есть ли возможность привязать вдовесок какую-нибудь формулу, например "произведение чисел" или ячеек? »

Можно.

DJ Mogarych 16-12-2019 21:45 2900777

Ka3hak, если файл будет перекодирован в xlsx, то Powershell в модулем ImportExcel без проблем работает с такими файлами.

Работать с xls - это крайне неудобно и медленно.

Iska 17-12-2019 01:47 2900820

Цитата:

Цитата DJ Mogarych
Работать с xls - это крайне неудобно и медленно. »

Не могу с Вами согласиться, коллега.

Ka3hak 17-12-2019 09:07 2900853

Цитата:

Цитата Iska
Не видел ни единого разу. »

Да, но это факт.
Цитата:

Цитата Iska
Про первое — забудьте. »

Вот, после такого ответа, разве имеется смысл дальнейших манипуляций в виде "файла Рабочей книги, упакованного в архив и приложенного к сообщению"?
Или Вы в силах помочь мне каким-то другим способом?
Цитата:

Цитата Iska
Легко. Как только будет от Вас выложен образец Рабочей книги. »

Хорошо. Позже прикреплю архив.

DJ Mogarych 17-12-2019 11:14 2900863

Iska, ну а как с ним работать? Только через COM-объект Экселя?

Iska 17-12-2019 17:27 2900931

Цитата:

Цитата Ka3hak
Да, но это факт. »

Продемонстрируйте.


Цитата:

Цитата Ka3hak
Вот, после такого ответа, разве имеется смысл дальнейших манипуляций в виде "файла Рабочей книги, упакованного в архив и приложенного к сообщению"? »

Имеет. А вот без архива с файлом я не вижу особого смысла заниматься и вторым:
Цитата:

Цитата Ka3hak
либо .VBS. »

вариантом.

Цитата:

Цитата DJ Mogarych
Iska, ну а как с ним работать? Только через COM-объект Экселя? »

Угу. В ряде случаев можно и ADO пользовать (если сие допустимо по сути ТЗ).

DJ Mogarych 17-12-2019 17:54 2900938

Ну я это и называю "неудобно". Лучше сначала
Код:

"C:\Program Files (x86)\Microsoft Office\Office12\excelcnv.exe" -oice "C:\scripts\test1.xls" "C:\scripts\test1.xlsx"
а потом ImportExcel-ем делай что хочешь.

Ka3hak 17-12-2019 23:41 2900972

Вложений: 1
Iska, прикрепил файл к теме.
Скрипт производит запись в строки с 12-ой по 24-ую (выделенные кроваво-красным цветом), а точнее - любую ближайшую, свободную, в данном случае 12-ую, нО_о...!
Вот не задача! :( Ведь "столбец B" и "столбец А" занимают аж 3 строки! И если скрипт произвёл запись в строку 12, то следующая ближайшая (для повторной отработки скрипта) аж 15-ая!
Не окажется ли это непреодолимой преградой в реализации поставленной задачи? Далее...
Между строк ;)
"Строку 19" наверное нужно игнорировать, даже не знаю. Т.к. это некое оглавление определённого типа работ, именуемого например "Укладка", но это уже "вопрос десятый", опустим.

В "столбце F"(который зелёненький), с 7-ой строки и до бесконечности происходит произведение "столбцов H на I". По-большому счёту, это основная формула для этого столбца.
Цитата:

Цитата Iska
Продемонстрируйте. »

Между прочим
P.S. Все (или почти) BAT-ники из этой темы: http://forum.oszone.net/thread-327297.html ловко сожрал Dr.Web CureIt, а Касперовский визжал как свинья. Хорошо хоть в архивах исходники не тронул.
Не помог даже некий "Bat To Exe Converter", чтобы скрыть содержание файла. А хотяяя! Может в нём-то и была проблема, уже не помню... Но интереса ради - обязательно проверю и залью скриншоты Log-а ;)

Iska 18-12-2019 03:19 2900996

Цитата:

Цитата Ka3hak
Скрипт производит запись »

Какой скрипт? Какую запись?

Цитата:

Цитата Ka3hak
выделенные кроваво-красным цветом »

Цитата:

Цитата Ka3hak
который зелёненький »

Вам стоит проверить зрение.

Цитата:

Цитата Ka3hak
Все (или почти) BAT-ники из этой темы: http://forum.oszone.net/thread-327297.html»

Конкретнее, пожалуйста. «Все (или почти)» — это ни о чём.

Цитата:

Цитата Ka3hak
Не помог даже некий "Bat To Exe Converter" »

Вот «некий "Bat To Exe Converter"», как правило, ломаный и заражённый какой-нибудь хренью, может давать такой эффект.


Ka3hak, попробуйте теперь внятно сформулировать техзадание.

Ka3hak 18-12-2019 07:34 2901005

Цитата:

Цитата Iska
Какой скрипт? Какую запись? »

Visual Basic Script. Visual Basic Script-овую запись. Запись в .xls файл, если помните...
Под словом "производит" - я подразумеваю "должен". Это своего рода конкретизация поставленной задачи.
В строку 12. Если ячейка столбца данной строки не пустая, то в 13. Если и та содержит информацию, то в 14.
ЗАПИСЬ аналогичную специально представленными выше примерами(в .xls файле).

DJ Mogarych 18-12-2019 11:35 2901027

В нынешнем виде таблица непригодна для автоматизации, во всяком случае, эта автоматизация будет крайне трудоёмкая.

1) Для нормальной автоматизации нужно избавиться от объединённых ячеек, продублировав данные.

Тогда можно получить такой вывод

№ п/п : 1
Наименование работы : Устройство армированных стяжек толщ 20мм
Материал : раствор или бетон
Ед. изм : м3
Норма на ед. изм. : 6,5
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 1,3
умножить на "это" : 5

№ п/п : 1
Наименование работы : Устройство армированных стяжек толщ 20мм
Материал : сетка сварная
Ед. изм : м2
Норма на ед. изм. : 7,6464
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 1,08
умножить на "это" : 7,08

№ п/п : 2
Наименование работы : Устройство стяжек армированных полипропиленовой фиброй
Материал : цемент
Ед. изм : кг
Норма на ед. изм. : 15120
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 280
умножить на "это" : 54

№ п/п : 2
Наименование работы : Устройство стяжек армированных полипропиленовой фиброй
Материал : песок
Ед. изм : м3
Норма на ед. изм. : 2,3
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 1,15
умножить на "это" : 2

№ п/п : 2
Наименование работы : Устройство стяжек армированных полипропиленовой фиброй
Материал : фибра
Ед. изм : кг
Норма на ед. изм. : 0,63
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 0,7
умножить на "это" : 0,9

Потом с этими данными уже можно работать, добавлять строки и т. д.

2) Ячейки с числами сделать реально числовыми. Сейчас, если импортировать из экселя данные, то умножить числа не получается, для этого надо объяснить компьютеру, что это действительно числа
Код:

[double]$1 = $_.'"это"' -replace ',','.'
[double]$2 = $_.'умножить на "это"' -replace ',','.'


Ka3hak 18-12-2019 12:11 2901041

DJ Mogarych, спасибо Вам большое за то, что откликнулись!
Цитата:

Цитата DJ Mogarych
Тогда можно получить такой вывод
№ п/п : 1
Наименование работы : Устройство армированных стяжек толщ 20мм
Материал : раствор или бетон
Ед. изм : м3
Норма на ед. изм. : 6,5
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 1,3
умножить на "это" : 5

№ п/п : 1
Наименование работы : Устройство армированных стяжек толщ 20мм
Материал : сетка сварная
Ед. изм : м2
Норма на ед. изм. : 7,6464
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 1,08
умножить на "это" : 7,08

№ п/п : 2
Наименование работы : Устройство стяжек армированных полипропиленовой фиброй
Материал : цемент
Ед. изм : кг
Норма на ед. изм. : 15120
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 280
умножить на "это" : 54

№ п/п : 2
Наименование работы : Устройство стяжек армированных полипропиленовой фиброй
Материал : песок
Ед. изм : м3
Норма на ед. изм. : 2,3
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 1,15
умножить на "это" : 2

№ п/п : 2
Наименование работы : Устройство стяжек армированных полипропиленовой фиброй
Материал : фибра
Ед. изм : кг
Норма на ед. изм. : 0,63
Нормативный документ : Устройство монолитных ж/б и бетонных конструкций
"это" : 0,7
умножить на "это" : 0,9
»

На счёт этого я всё понял. Спасибо Вам кстати за наставления, которые безусловно внесли прояснения.
Но вот что касается остального - возникают вопросы.
Цитата:

Цитата DJ Mogarych
[double]$1 = $_.'"это"' -replace ',','.'
[double]$2 = $_.'умножить на "это"' -replace ',','.' »

Это код .VBS? Осмелюсь предположить что здесь речь об произведении двух столбцов, и замена символов - запятой на точку, так?

Ka3hak 18-12-2019 12:49 2901052

DJ Mogarych, дело в том, что на текущий момент, в .VBS я нулевой. Но спешу заверить, что быстро учусь :)
Могу ли я предложить поставить задачу ещё проще и попросить кусочек полного кода, чтобы было от чего отталкиваться?
Мне важны только 3 ключевых момента.
1) Внедрение формулы в одну из ячеек строки, а лучше - на весь столбец. Потому как на основе одного (рабочего) скрипта, поочерёдно будут вноситься разные данные.
Но и хрен бы с этим "пунктом первым". Он просто блекнет на фоне пункта №2, ведь формулу произведения чисел можно изначально забить и ручками.
2) Очерёдности записи в ближайшую, верхнюю, свободную строку. С учётом дублирования, как вы подсказали - буду также колдовать.
3) Внесённые данные должны различаться по типу: текстовый - числовой, хотя и это, как я понимаю, тоже можно исполнить вручную.

И вдовесок ещё вопросик, пожалуйста... Я никак не смогу управлять размером ячейки по средствам .VBS?

DJ Mogarych 18-12-2019 14:50 2901071

Нет, это Powershell. Также, необходимо установить модуль Import-Excel: https://www.powershellgallery.com/packages/ImportExcel

Полный код:
Код:

# Конвертация xls в xlsx
& 'C:\Program Files (x86)\Microsoft Office\Office16\excelcnv.exe' -oice D:\temp\normy_spisania_materialov.xls D:\temp\normy_spisania_materialov.xlsx

$xlsx = import-excel D:\temp\normy_spisania_materialov.xlsx -StartRow 4 -DataOnly

# Если ячейки в исходном файле не числовые
$xlsx.where{$_.'Ед. изм'} |% {
[double]$1 = $_.'"это"' -replace ',','.'
[double]$2 = $_.'умножить на "это"' -replace ',','.'
$1 * $2
}

# Если числовые
$xlsx.where{$_.'Ед. изм'} |% {
$_.'"это"' * $_.'умножить на "это"'
}

Видео по модулю: https://www.youtube.com/watch?v=U3Ne...e_NtvSo0k0K0kq

1) Формулы там вроде бы есть, см. справку по модулю.
2) Можно внести ещё один столбец просто с порядковыми номерами и отталкиваться от них, или сделать № п/п последовательными, если я правильно понял ваш вопрос.
3) Если данные будут вноситься скриптом, то при экспорте готового файла с данными будет всё в порядке. Вопрос в исходном файле.

Управлять размером ячейки при экспорте можно. Я обычно пользуюсь параметром -AutoSize.

Iska 18-12-2019 17:40 2901091

Избавляться надо от Excel, потому как в примере — типичная картина для базы данных с тремя таблицами: Нормативные документы, Наименование работы, Материалы и связями между ними один-ко-многим. Посему — MS Access, 1С или любую другую не плоскую СУБД.

megaloman 18-12-2019 18:12 2901100

Цитата:

Цитата DJ Mogarych
В нынешнем виде таблица непригодна для автоматизации »

Ka3hak, А что подразумевается под автоматизацией? Откуда надо вставлять данные? В каком они виде? Откуда известно, на какие нормы надо ссылаться? Возьмите для примера уже имеющиеся 2 пункта и покажите, как они выглядят в файле (?) для вставки в Excel.
Цитата:

Цитата Ka3hak
Внедрение формулы в одну из ячеек строки, а лучше - на весь столбец. »

Это не проблема даже в Вашей таблице, но смысла в этом нет - руками в Excel это сделать проще и надёжнее.
И, опять же, не проще ли это сделать макросом в таблице, а не внешним скриптом?

Ka3hak 18-12-2019 22:23 2901158

megaloman, доброго времени суток!
Цитата:

Цитата megaloman
не проще ли это сделать макросом в таблице, а не внешним скриптом? »

Я рассматривал такой вариант. Но = нет. Задача стоит однозначная. Это "должно быть похоже" на полноценное ПО,
с удобным, понятным интерфейсом и как следствие - минимумом манипуляций для пользователя.
Цитата:

Цитата megaloman
А что подразумевается под автоматизацией?

В аналогии с моей прошлой темой (http://forum.oszone.net/thread-327297.html) за что Вам отдельное, громаднейшее СПАСИБО,
подразумевается некая связка визуального GUI-интерфейса и исполняемых файлов в виде скриптов.
- В GUI оболочке есть выпадающий список с наименованием производимых работ на выбор.
- Выбираем необходимый пункт (тип производимых работ) и он уже ссылается на заведомо определённые скриптом значения.
- Далее - кнопка "apply" и уже тут отработывает скрипт, который заносит необходимую информацию в .xls файл.
Если быть несколько точнее, то условно: when press "apply"\ if change "наименование работ №1"\ then run "script1"\ else if... и т.д. и т.п.
Цитата:

Цитата megaloman
Откуда надо вставлять данные? В каком они виде? Откуда известно, на какие нормы надо ссылаться? »

Данные содержит сам скрипт. Для каждого из пунктов производимых работ "он свой".

DJ Mogarych 18-12-2019 22:37 2901165

Цитата:

Цитата Ka3hak
Это "должно быть похоже" на полноценное ПО, с удобным, понятным интерфейсом и как следствие - минимумом манипуляций для пользователя. »

И максимумом геморроя для того, кто возьмётся это реализовывать.

Зачем вообще всё это? Почему не использовать просто Excel, а не дублировать его интерфейс непонятными костылями?

megaloman 18-12-2019 22:52 2901171

Ka3hak, Не понимаю задачи.
Цитата:

Цитата DJ Mogarych
Почему не использовать просто Excel, а не дублировать его интерфейс непонятными костылями »

Цитата:

Цитата Ka3hak
Данные содержит сам скрипт. Для каждого из пунктов производимых работ "он свой". »

Как максимум, можно предложить вносить исходные данные в Excel - таблицы, например - одно данное - одна книга созданная по бланку, со своим именем в определённой папке, не пытаться ваять непонятную конструкцию для каждого данного в скрипте. И затем объединять таблицы в одну например макросом или скриптом.
То есть, работать надо в направлении организации процесса на базе полноценного ПО (Excel), либо
Цитата:

Цитата Iska
Избавляться надо от Excel, потому как в примере — типичная картина для базы данных с тремя таблицами: Нормативные документы, Наименование работы, Материалы и связями между ними один-ко-многим. »


Ka3hak 18-12-2019 23:22 2901182

DJ Mogarych, спасибо Вам большое за вариант. Беру его на рассмотрение, в обязательном порядке.
Смущает только # Конвертация xls в xlsx. Дело в том, что разбор полётов происходит с файлом старого образца, Office 2003
Цитата:

Цитата Iska
Избавляться надо от Excel »

И тут Вы правы. Солидарен. Но это не от меня зависит.
Цитата:

Цитата DJ Mogarych
И максимумом геморроя для того, кто возьмётся это реализовывать. »

Есть такое.

Цитата:

Цитата megaloman
Как максимум, можно предложить вносить исходные данные в Excel - таблицы, например - одно данное - одна книга созданная по бланку, со своим именем в определённой папке, »

Чувствуете этот запах? Запах жаренного мозга кажись... Не особо догнал о чём речь :(

Ka3hak 19-12-2019 02:38 2901209

Господиии! Да как же всё сложно-то, а :(
Я понимаю, что задача из разряда - вырывание зуба через анальное отверстие. И было бы это просто - я бы к вам за помощью не обращался.
По-крайней мере, здесь я выяснил, что реализация задуманного невозможна по средствам BAT/CMD. А может VBS здесь тоже не поможет? Тогда скажите об этом прямо.
GUI+исполняемые скрипты - как вариант работы извне. Ну вот нету у меня Excel-я, к примеру... Соответственно нет макросов. Да вообще ничего нет! Что делать...?
Если я перефразирую задачу вплоть до самого минимума, это что-то изменит? Могу даже ещё один файл залить, для примера и точности описания текущей задачи. Хотя подойдёт и пустой.
Пример. Текущий файл имеет вид:
(строка:№1)\1(A1-числовая ячейка)\огонь(B1-текстовая ячейка)\45(С1-числовая ячейка)
(строка:№2)\2(A2-числовая ячейка)\вода(B2-текстовая ячейка)\86(С2-числовая ячейка)
...

Вопрос.
VBS скрипт вносит строку: (строка:№3)\3(A3-числовая ячейка)\медные трубы(B3-текстовая ячейка)\94(С3-числовая ячейка); т.к. строки:№1-2 заняты.
Если отсутствует (строка:№2\"вода"), то вносимая строка (строка:№3\"медные трубы") прописывается вместо неё, под №2. Если отсутствуют обе (№1,2), то под №1/
Могу поставит вопрос ещё проще. Мне даже нумерация не нужна, дело не в этом! Просто нужно избежать перезаписывания строк.
Вопрос.
Как, с помощью VBS записать текстовую и числовую информацию в ячейки A2(текстовая) и B2(числовая) - (строки:№2)(соответственно), если (строка:№1) уже занята?

Serguei Kouzmine 19-12-2019 03:20 2901212

Ka3hak, мне кажется вы еще не рассматриваете Хабр Фриланс - и мне не ясно почему ?
опишите задачу и вам ее сделают - а как тема для форума ваша задача черезчур узко специальна

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

Ka3hak 19-12-2019 12:34 2901255

Serguei Kouzmine, а мне почему-то кажется, что вы очень глубоко и сильно прониклись сутью поставленной задачи. Спасибо Вам.
Цитата:

Цитата Serguei Kouzmine
ну кому может потребоваться заливать воду с огнем через медные трубы прописью в новую ячейку ? »

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

megaloman 19-12-2019 13:06 2901262

Цитата:

Цитата Ka3hak
Текущий файл имеет вид: »

Так каждый может, ты мне Мурку сбацай! Дайте под эту постановку:
1. Текстовый файл откуда данные берём.
2. Excel-Таблицу с 1-2 строкой, после которых эти данные вставляем.
Пустых строк между строками с данными быть не может?
Это одна строка, или надо вставить за раз кучу строк?
Вы не боитесь, что умелые ручки запустят скрипт сто раз и вставят одни и те же строки многократно?
Соответственно, надо говорить об организации процесса: где-то в папке должен быть импортируемый файл с данными.
Куда-то после импорта он должен перемещаться.
Цитата:

Цитата Ka3hak
И было бы это просто »

Вставить строку в Excel-таблицу vbs - элементарная задача. Если бы было четкое понимание задачи.
Цитата:

Цитата Ka3hak
Не особо догнал о чём речь »

Цитата:

Цитата Ka3hak
Данные содержит сам скрипт. Для каждого из пунктов производимых работ "он свой". »

Могу представить, что обычный пользователь способен в заготовку Excel-таблицы что-то заполнить. Но
Цитата:

Цитата Ka3hak
Чувствуете этот запах? Запах жаренного мозга кажись... »

чтобы обычный пользователь вбивал данные в скрипте - никогда.

Ka3hak 19-12-2019 22:59 2901341

Цитата:

Цитата megaloman
Вставить строку в Excel-таблицу vbs - элементарная задача.»

Бесконечно рад. *ликует :D*
Цитата:

Цитата megaloman
1. Текстовый файл откуда данные берём. »

Неужели скрипт не может содержать данные? Мне нужен пример лишь одного скрипта вносящего данные в 3 ячейки одной строки. Тогда хотя бы будет на чём основываться:
Цитата:

Цитата Ka3hak
(строка:№1)\1(A1-числовая ячейка)\огонь(B1-текстовая ячейка)\45(С1-числовая ячейка) »

Я просто буду использовать видоизменённые копии одного и того же скрипта.
Скрипт также должен соблюсти условие "неперезаписывания". Чтобы свериться - можно запустить его парочку раз и увидеть результат.
А уже после, для каждого типа "производимых работ"(это раздел таблицы) я буду корректировать этот скрипт по-своему.
Цитата:

Цитата megaloman
Это одна строка, или надо вставить за раз кучу строк? »

На примере файла вложенного в тему - там за раз необходимо задействовать 3 строки. Но, в принципе, можно и по одной.
Цитата:

Цитата megaloman
Вы не боитесь, что умелые ручки запустят скрипт сто раз и вставят одни и те же строки многократно? »

Даже не думаю об этом. Пользователь будет работать непосредственно с GUI интерфейсом, а уже там - я исключу такую возможность.
К слову
P.S. Кстати! А ведь Вы навели меня на мысль! Что если собрать .txt, .ini, либо .cfg-файл по средствам того же .BAT, а после - разом занести всю информацию с помощью .VBS?
Может так даже лучше будет, как считаете? Или, это наоборот, в разы усложнит задачу?

DJ Mogarych 20-12-2019 14:47 2901419

Можно поднять MySQL и использовать Excel как интерфейс к базе, и то лучше будет.
https://youtu.be/E_kn71R9BL0

Ka3hak 20-12-2019 15:42 2901433

Вложений: 1
Цитата:

Цитата megaloman
1. Текстовый файл откуда данные берём.
2. Excel-Таблицу с 1-2 строкой, после которых эти данные вставляем. »

megaloman, вот архив с файлами. Как можно внести строки 9, 10, 11?


DJ Mogarych, да, ну опять же... Это плагин расширяющий функционал? В любом случае он требует времени на освоение и, как следствие, работу в самом Excel.
Если бы это было нужно мне, как пользователю, я бы несомненно автоматизировал под себя многие действия. Но увы... Задача другая :(
В любом случае СПАСИБО. Я обязательно рассмотрю предложенный Вами вариант.

Iska 20-12-2019 18:01 2901465

Цитата:

Цитата Ka3hak
Это плагин расширяющий функционал? »

Это бесплатная СУБД.

megaloman 20-12-2019 23:23 2901494

Вложений: 1
Ka3hak,
Изменил последний вариант Вашей таблицы, придумал немного другой файл с данными.
Смысл этого извращения мне до сих пор непонятен
Это скрипт
Код:

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

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

#Для тех, кто в танке;куб. градусы
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

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

Ka3hak 22-12-2019 08:03 2901621

megaloman, ну я даже не знаю что сказать.. ЧЕЛОВЕЧИЩЕ! Всё Великолепно работает!
Могу ли я пока не закрывать тему, на случай вдруг ещё вопросик-другой назреет?
Кстати! Я ничего подобного на форуме не видел, может создать тему заново, в другой категории, поставив вопрос иначе?
Например: VBS/WSH/JS - как внести данные в .xls файл используя .VBS?
Ну, дабы облегчить поиски нуждающимся. А то выходит и вопрос в шапке поставлен иначе, и вариант исполнения другими методами.

megaloman 22-12-2019 09:09 2901624

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

Ka3hak 22-12-2019 14:38 2901640

Вложений: 1
megaloman, всё Великолепно отрабатывает, повторюсь (готов повторять это вечно). Собственно о доп.вопросиках... :)
Я прилагаю архив со скриптами и .cfg файлами, которые как производят записи индивидуально, так и один, "Общий".
Вопрос:
Как мне реализовать строку типа:№6(Стяжка) после каждого успешного внесения данных из "Общий"?
Подразумевается выравнивание по левому краю (если возможно), полужирный текст, параметр "Объединить и поместить в центре", и, желательно (если возможно), соответствующий цвет заливки.
СтрОки столбца "A" можно причесть туда же, не принципиально. Иными словами - задать вышеуказанные значения для всей строки, полностью.
Осмелюсь только догадываться, что есть возможность дополнить скрипт, а сами параметры прописать в файле "Общий.cfg", не так ли?
Пример желаемого результата в строке 19 файла "Образец.xls".

Ka3hak 23-12-2019 02:38 2901717

Нагуглил вот такой вариант:
XLApp.ActiveWorkbook.ActiveSheet.Range("A28:F30").Merge(True);
Теперь понять бы как это работает и куда его приткнуть, чтобы было грамотно :\

megaloman 23-12-2019 23:46 2901870

Вложений: 1
Существенно доработал.
Код:

^ПОЛЫ
^^Стяжка
#Устройство армированных стяжек толщиной 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 <= 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 k = 0 To UBound(Form)
                    .Range(Form(k) + CStr(i)).FormulaLocal = Replace(Forms(k), "??", CStr(i))
                Next
               
                i = i + 1
                i2 = i
            End If
        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
.Cells.EntireRow.AutoFit

.ActiveWorkbook.Save
.ActiveWorkbook.Close
.Quit

End With

FSO.MoveFile FileIn, FileIn + ".Done"


Ka3hak 25-12-2019 13:25 2902103

Вложений: 1
Цитата:

Цитата megaloman
Существенно доработал. »

О БОжечки... Какая прелесть! Спасибо громадное!!! Это просто Великолепно...!
(но, как всегда, что в моём репертуаре - придумайте мне велосипед и научите ездить...)
Конечно понимаю, что "в край оборзел" и крайне не удобно спрашивать у Вас что-либо ещё, но:
- Зачем в скрипте задаётся формула для столбца "A"? В рабочем .xls, согласно стандарту оформления,
происходит нумерация "производимых работ" столбца "B" - от 1 и до max кол-ва (для каждого пункта каждого из разделов). //пример приложил (выделено жёлтеньким)
Можно ли такое как-нибудь исполнить? Если это слишком трудоёмко - может и вовсе не производить запись данных в этот столбец? Значит будет делаться ручками.
- Ещё момент с ячейками столбца "G"... Они объединены в каждом разделе и носят имя "Устройство монолитных ж/б и бетонных конструкций". Так тоже можно сделать? //пример приложил (выделено жёлтеньким)
P.S. Опять же отсылка на трудоёмкость. Возможно это не стоит Ваших усилий и тогда уж "хрен с ним", пусть остаётся так.
- Не особо понял момент "запуск скрипта с с аргументами". Подразумевается указание параметров запуска, или как? Если я не указываю аргумент, то скрипт не отрабатывает :(
Может тогда ну их, эти танцы? Ведь (повторюсь) пользователь не будет напрямую взаимодействовать со скриптами, а только с визуальным интерфейсом, так что скрипты вполне могут находиться в постоянной боеготовности.

megaloman 25-12-2019 14:49 2902118

Цитата:

Цитата Ka3hak
Зачем в скрипте задаётся формула для столбца "A"? .... может и вовсе не производить запись данных в этот столбец »

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

'Form = Array("A", "F")                  'В этих столбцах формулы.
Form = Array("F")                  'В этих столбцах формулы.

'Forms = Array("=СЧЁТЗ(D" + CStr(Str1) + ":D??)", "=H??*I??") 'Формулы для строки
Forms = Array("=H??*I??") 'Формулы для строки

Цитата:

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

Что значит не отрабатывает?
Если в тексте скрипта указаны реальные пути файлов, то при отсутствии аргументов при запуске, возьмутся указанные файлы.
Если указаны аргумент(ы) (сначала cfg затем xls) - то возьмется то, что в аргументе
Остальные идеи пока не осознал.

Ka3hak 25-12-2019 16:11 2902136

Цитата:

Цитата megaloman
'Forms = Array("=СЧЁТЗ(D" + CStr(Str1) + ":D??)", "=H??*I??") 'Формулы для строки »

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

Цитата megaloman
Если указаны аргумент(ы) »

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

megaloman 25-12-2019 16:48 2902140

Цитата:

Цитата Ka3hak
А что подразумевается под словом "аргументы"? О каких именно значениях речь? »

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

я191223.vbs "Z:\Soft_In\Мой Пример New.cfg" "Z:\Soft_In\Мой Пример New.xls"
В аргументах полное имя cfg-файла и xls-файла.
При отсутствии втрорго аргумента (файла XLS) его имя возьмется из текста скрипта
Цитата:

Цитата Ka3hak
Какие процедуры или функции необходимо исключить для отмены своего рода "бэкапа" (.done)? »

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

''''''''''FSO.MoveFile FileIn, FileIn + ".Done"


Время: 14:10.

Время: 14:10.
© OSzone.net 2001-