Войти

Показать полную графическую версию : [решено] как внести коррективы в .xls файл используя .BAT


Страниц : 1 [2]

Ka3hak
18-12-2019, 23:22
DJ Mogarych, спасибо Вам большое за вариант. Беру его на рассмотрение, в обязательном порядке.
Смущает только # Конвертация xls в xlsx. Дело в том, что разбор полётов происходит с файлом старого образца, Office 2003
Избавляться надо от Excel »
И тут Вы правы. Солидарен. Но это не от меня зависит.
И максимумом геморроя для того, кто возьмётся это реализовывать. »
Есть такое.

Как максимум, можно предложить вносить исходные данные в Excel - таблицы, например - одно данное - одна книга созданная по бланку, со своим именем в определённой папке, »
Чувствуете этот запах? Запах жаренного мозга кажись... Не особо догнал о чём речь :(

Ka3hak
19-12-2019, 02:38
Господиии! Да как же всё сложно-то, а :(
Я понимаю, что задача из разряда - вырывание зуба через анальное отверстие. И было бы это просто - я бы к вам за помощью не обращался.
По-крайней мере, здесь я выяснил, что реализация задуманного невозможна по средствам 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
Ka3hak, мне кажется вы еще не рассматриваете Хабр Фриланс - и мне не ясно почему ?
опишите задачу и вам ее сделают - а как тема для форума ваша задача черезчур узко специальна

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

Ka3hak
19-12-2019, 12:34
Serguei Kouzmine, а мне почему-то кажется, что вы очень глубоко и сильно прониклись сутью поставленной задачи. Спасибо Вам.
ну кому может потребоваться заливать воду с огнем через медные трубы прописью в новую ячейку ? »
Не ячейку, а строку - что само собой подразумевает изменение целого ряда ячеек. И желательно не прописью, а печатными буквами и арабскими цифрами.

megaloman
19-12-2019, 13:06
Текущий файл имеет вид: »Так каждый может, ты мне Мурку сбацай! Дайте под эту постановку:
1. Текстовый файл откуда данные берём.
2. Excel-Таблицу с 1-2 строкой, после которых эти данные вставляем.
Пустых строк между строками с данными быть не может?
Это одна строка, или надо вставить за раз кучу строк?
Вы не боитесь, что умелые ручки запустят скрипт сто раз и вставят одни и те же строки многократно?
Соответственно, надо говорить об организации процесса: где-то в папке должен быть импортируемый файл с данными.
Куда-то после импорта он должен перемещаться.
И было бы это просто » Вставить строку в Excel-таблицу vbs - элементарная задача. Если бы было четкое понимание задачи.Не особо догнал о чём речь »Данные содержит сам скрипт. Для каждого из пунктов производимых работ "он свой". » Могу представить, что обычный пользователь способен в заготовку Excel-таблицы что-то заполнить. НоЧувствуете этот запах? Запах жаренного мозга кажись... »чтобы обычный пользователь вбивал данные в скрипте - никогда.

Ka3hak
19-12-2019, 22:59
Вставить строку в Excel-таблицу vbs - элементарная задача.»
Бесконечно рад. *ликует :D*
1. Текстовый файл откуда данные берём. »
Неужели скрипт не может содержать данные? Мне нужен пример лишь одного скрипта вносящего данные в 3 ячейки одной строки. Тогда хотя бы будет на чём основываться:
(строка:№1)\1(A1-числовая ячейка)\огонь(B1-текстовая ячейка)\45(С1-числовая ячейка) »
Я просто буду использовать видоизменённые копии одного и того же скрипта.
Скрипт также должен соблюсти условие "неперезаписывания". Чтобы свериться - можно запустить его парочку раз и увидеть результат.
А уже после, для каждого типа "производимых работ"(это раздел таблицы) я буду корректировать этот скрипт по-своему.
Это одна строка, или надо вставить за раз кучу строк? »
На примере файла вложенного в тему - там за раз необходимо задействовать 3 строки. Но, в принципе, можно и по одной.
Вы не боитесь, что умелые ручки запустят скрипт сто раз и вставят одни и те же строки многократно? »
Даже не думаю об этом. Пользователь будет работать непосредственно с GUI интерфейсом, а уже там - я исключу такую возможность.
P.S. Кстати! А ведь Вы навели меня на мысль! Что если собрать .txt, .ini, либо .cfg-файл по средствам того же .BAT, а после - разом занести всю информацию с помощью .VBS?
Может так даже лучше будет, как считаете? Или, это наоборот, в разы усложнит задачу?

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

Ka3hak
20-12-2019, 15:42
1. Текстовый файл откуда данные берём.
2. Excel-Таблицу с 1-2 строкой, после которых эти данные вставляем. »
megaloman, вот архив с файлами. Как можно внести строки 9, 10, 11?
[hr]
DJ Mogarych, да, ну опять же... Это плагин расширяющий функционал? В любом случае он требует времени на освоение и, как следствие, работу в самом Excel.
Если бы это было нужно мне, как пользователю, я бы несомненно автоматизировал под себя многие действия. Но увы... Задача другая :(
В любом случае СПАСИБО. Я обязательно рассмотрю предложенный Вами вариант.

Iska
20-12-2019, 18:01
Это плагин расширяющий функционал? »
Это бесплатная СУБД.

megaloman
20-12-2019, 23:23
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
megaloman, ну я даже не знаю что сказать.. ЧЕЛОВЕЧИЩЕ! Всё Великолепно работает!
Могу ли я пока не закрывать тему, на случай вдруг ещё вопросик-другой назреет?[hr]Кстати! Я ничего подобного на форуме не видел, может создать тему заново, в другой категории, поставив вопрос иначе?
Например: VBS/WSH/JS - как внести данные в .xls файл используя .VBS?
Ну, дабы облегчить поиски нуждающимся. А то выходит и вопрос в шапке поставлен иначе, и вариант исполнения другими методами.

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

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

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

megaloman
23-12-2019, 23:46
^ПОЛЫ
^^Стяжка
#Устройство армированных стяжек толщиной 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
Существенно доработал. »
О БОжечки... Какая прелесть! Спасибо громадное!!! Это просто Великолепно...!
(но, как всегда, что в моём репертуаре - придумайте мне велосипед и научите ездить...)
Конечно понимаю, что "в край оборзел" и крайне не удобно спрашивать у Вас что-либо ещё, но:
- Зачем в скрипте задаётся формула для столбца "A"? В рабочем .xls, согласно стандарту оформления,
происходит нумерация "производимых работ" столбца "B" - от 1 и до max кол-ва (для каждого пункта каждого из разделов). //пример приложил (выделено жёлтеньким)
Можно ли такое как-нибудь исполнить? Если это слишком трудоёмко - может и вовсе не производить запись данных в этот столбец? Значит будет делаться ручками.
- Ещё момент с ячейками столбца "G"... Они объединены в каждом разделе и носят имя "Устройство монолитных ж/б и бетонных конструкций". Так тоже можно сделать? //пример приложил (выделено жёлтеньким)
P.S. Опять же отсылка на трудоёмкость. Возможно это не стоит Ваших усилий и тогда уж "хрен с ним", пусть остаётся так.
- Не особо понял момент "запуск скрипта с с аргументами". Подразумевается указание параметров запуска, или как? Если я не указываю аргумент, то скрипт не отрабатывает :(
Может тогда ну их, эти танцы? Ведь (повторюсь) пользователь не будет напрямую взаимодействовать со скриптами, а только с визуальным интерфейсом, так что скрипты вполне могут находиться в постоянной боеготовности.

megaloman
25-12-2019, 14:49
Зачем в скрипте задаётся формула для столбца "A"? .... может и вовсе не производить запись данных в этот столбец »Это делается на уровне настроек:'Form = Array("A", "F") 'В этих столбцах формулы.
Form = Array("F") 'В этих столбцах формулы.

'Forms = Array("=СЧЁТЗ(D" + CStr(Str1) + ":D??)", "=H??*I??") 'Формулы для строки
Forms = Array("=H??*I??") 'Формулы для строки
- Не особо понял момент "запуск скрипта с с аргументами". Подразумевается указание параметров запуска, или как? Если я не указываю аргумент, то скрипт не отрабатывает »
Что значит не отрабатывает?
Если в тексте скрипта указаны реальные пути файлов, то при отсутствии аргументов при запуске, возьмутся указанные файлы.
Если указаны аргумент(ы) (сначала cfg затем xls) - то возьмется то, что в аргументе
Остальные идеи пока не осознал.

Ka3hak
25-12-2019, 16:11
'Forms = Array("=СЧЁТЗ(D" + CStr(Str1) + ":D??)", "=H??*I??") 'Формулы для строки »
Ах, да... Вот этот момент я недоглядел. Исключал только параметр "'Form = Array("A", "F")". Спасибо.
Если указаны аргумент(ы) »
А что подразумевается под словом "аргументы"? О каких именно значениях речь?[hr]- Тогда самый главный момент. Какие процедуры или функции необходимо исключить для отмены своего рода "бэкапа" (.done)?
(вопрос из разряда: "на будущее")

megaloman
25-12-2019, 16:48
А что подразумевается под словом "аргументы"? О каких именно значениях речь? »Например (в текстовом файле описано) запуск скриптая191223.vbs "Z:\Soft_In\Мой Пример New.cfg" "Z:\Soft_In\Мой Пример New.xls" В аргументах полное имя cfg-файла и xls-файла.
При отсутствии втрорго аргумента (файла XLS) его имя возьмется из текста скриптаКакие процедуры или функции необходимо исключить для отмены своего рода "бэкапа" (.done)? »
Закомментировать (хватит и одного ') ''''''''''FSO.MoveFile FileIn, FileIn + ".Done"




© OSzone.net 2001-2012