|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Разбивка строк общего файла на отдельные csv файлы |
|
VBA - Разбивка строк общего файла на отдельные csv файлы
|
Пользователь Сообщения: 60 |
Профиль | Отправить PM | Цитировать
Добрый день всем!! Нужна помощь с написанием макроса.
Имеется 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 |
|
Отправлено: 14:08, 02-09-2018 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата 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 или все подряд файлы реестра в каталоге, наподобие: Скрытый текст
И всё это будет работать. 3. Хранить путь в каком-либо заранее предопределённом и обговоренном месте. Например, использовать какой-нибудь файл конфигурации с предопределённым именем и местоположением, в котором указывать путь к исходному файлу (откуда он будет считываться скриптом). Или какой-нибудь предопределённый параметр в реестре. Столь же неудобно и малоосмысленно, как и прямое указание пути непосредственно в коде. Цитата jordan_74:
Цитата 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 |
|||
Отправлено: 23:57, 05-09-2018 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать 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 |
Отправлено: 18:05, 10-09-2018 | #22 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать jordan_74, а пути:
Вы поменяли на свои? Какой код у Вас получился? Что сообщает пакетный файл при работе? Что сообщает скрипт? |
Отправлено: 19:06, 10-09-2018 | #23 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать 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 |
Отправлено: 20:14, 10-09-2018 | #24 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать jordan_74, и…? Если открыть командную строку и запустить в ней этот пакетный файл, что происходит?
|
Отправлено: 20:41, 10-09-2018 | #25 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Iska,
Я батник двойным кликом запускаю. Ошибка вот такая же cscript.exe //nologo "C:\РЕЕСТР ЧЕКОВ\checkCut.vbs" "%%~i" |
Отправлено: 21:43, 10-09-2018 | #26 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата jordan_74:
Скрытый текст
нажмите Enter, покажите, что получилось. |
|
Отправлено: 22:19, 10-09-2018 | #27 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Iska,
Так все работает да! Спасибо! А я спросил потому, что хочется как в лучших домах, "нажал кнопочку" и готово, чтобы как можно меньше кликов делать) Я думал, что можно запустить батник, и уже он запускает в работу скрипт, который отработает все файлы реестров в папке. |
Последний раз редактировалось jordan_74, 11-09-2018 в 07:17. Отправлено: 07:05, 11-09-2018 | #28 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать jordan_74, не должно быть никакой разницы между запуском в командной строке или обычным двойным щелчком. Разве что Вы какие-то коррективы вносили в насройки исполнения пакетных файлов.
Давайте попробуем так — закомментировать @echo off и добавить в конец паузу: Попробуйте запустить на исполнение двойным щелчком, покажите получившийся скриншот (только не выкладывайте на Радикал, пожалуйста), посмотрим. |
Отправлено: 20:58, 11-09-2018 | #29 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Iska,
Вот что получилось |
Отправлено: 17:20, 12-09-2018 | #30 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Создание .bat файла для выборки строк из .csv файла в .xlsx | GODolubOFF | Скриптовые языки администрирования Windows | 10 | 14-12-2015 15:34 | |
CMD/BAT - Чтение указанной строки и разбив на отдельные символы и запись их в отдельные меремен | angel_lyucifer | Скриптовые языки администрирования Windows | 0 | 10-05-2015 20:48 | |
CMD/BAT - [решено] Периеминование файла doc.csv в Документ_дата_время.csv | kagorec | Скриптовые языки администрирования Windows | 2 | 29-03-2014 18:40 | |
CMD/BAT - [решено] Разбивка текстового файла файла | Seryoga204 | Скриптовые языки администрирования Windows | 1 | 04-10-2010 21:19 | |
Установка - Разбивка файла .gho на куски | Pavelnt | Microsoft Windows 2000/XP | 2 | 15-05-2009 12:15 |
|