Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Разбивка строк общего файла на отдельные csv файлы

Ответить
Настройки темы
VBA - Разбивка строк общего файла на отдельные csv файлы

Пользователь


Сообщения: 60
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: jordan_74
Дата: 03-09-2018
Добрый день всем!! Нужна помощь с написанием макроса.
Имеется 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
Благодарности: 8086

Профиль | Отправить 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

или все подряд файлы реестра в каталоге, наподобие:
Скрытый текст
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:57, 05-09-2018 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 60
Благодарности: 0

Профиль | Отправить 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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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
Вы поменяли на свои? Какой код у Вас получился? Что сообщает пакетный файл при работе? Что сообщает скрипт?
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:06, 10-09-2018 | #23


Пользователь


Сообщения: 60
Благодарности: 0

Профиль | Отправить 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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:41, 10-09-2018 | #25


Пользователь


Сообщения: 60
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:43, 10-09-2018 | #26


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 22:19, 10-09-2018 | #27


Пользователь


Сообщения: 60
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось jordan_74, 11-09-2018 в 07:17.


Отправлено: 07:05, 11-09-2018 | #28


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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
Попробуйте запустить на исполнение двойным щелчком, покажите получившийся скриншот (только не выкладывайте на Радикал, пожалуйста), посмотрим.

Отправлено: 20:58, 11-09-2018 | #29


Пользователь


Сообщения: 60
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg 111.jpg
(29.4 Kb, 3 просмотров)

Iska,
Вот что получилось

Отправлено: 17:20, 12-09-2018 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Разбивка строк общего файла на отдельные csv файлы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход