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

Ответить
 • Просмотры: 1
Аватара пользователя
jordan_74

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

Сообщение jordan_74 »

Цитата jordan_74:



Iska,так и есть, один знак после запятой, таков формат данных в ячейке
VBA - Разбивка строк общего файла на отдельные csv файлы




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




Цитата jordan_74:



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

Тогда возникнет путаница с нумерацией чеков.... Возможно к имени чека помимо нумерации нужно добавлять имя файла реестра, что то типа check_26.08.2018_38490,25_001
VBA - Разбивка строк общего файла на отдельные csv файлы




Мы можем сделать так: будет жёсткая привязка к местоположению шаблона (strTemplateFile), будет жёсткая привязка к метоположению выходных файлов (strDestFolder), а путь к исходному файлу (strSourceFile) мы будем указывать параметром скрипта WSH — тогда Вы сможете просто перетаскивать любой исходный файл реестра на скрипт WSH в Проводнике. Такое Вас устроит, делаем?
Аватара пользователя
Iska

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

Сообщение Iska »

jordan_74, примерно так (на WSH):



Скрытый текст

[spoiler]Код:
[/spoiler]

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

Option Explicit
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)
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	If objFSO.FileExists(strTemplateFile) Then
		If objFSO.FileExists(strSourceFile) Then
			If objFSO.FolderExists(strDestFolder) Then
				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)
				For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
					With objTemplateFile.Worksheets.Item(1)
						anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
						.Range("B3").Value = anyValue
						.Range("F2").Value = anyValue
						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
					objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
				Next
				objSourceFile.Close False
				objTemplateFile.Close False
				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 & """ "
	WScript.Quit 1
End If
WScript.Quit 0







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



P.S. И что с округлением — делаем, не делаем? Делаем!
Аватара пользователя
jordan_74

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

Сообщение jordan_74 »

Цитата Iska:



P.S. И что с округлением — делаем, не делаем?
VBA - Разбивка строк общего файла на отдельные csv файлы




Округление до одного знака после запятой, да
Аватара пользователя
Iska

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

Сообщение Iska »

Цитата jordan_74:



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




Добавил в предыдущий код, пробуйте.



P.S. Забыл самое главное — одноимённые файлы, уже существующие в целевом каталоге, будут молча перезаписаны (точнее — удалены, а на их место будут записаны новые файлы).
Аватара пользователя
jordan_74

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

Сообщение jordan_74 »

Iska,так и есть, один знак после запятой, таков формат данных в ячейке
Аватара пользователя
jordan_74

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

Сообщение jordan_74 »

Цитата jordan_74:



сохранил в формате .js но при запуске возникла ошибка, может я что то криво сделал
VBA - Разбивка строк общего файла на отдельные csv файлы




Поправьте пути на свои, сохраните файл с расширением .vbs, а затем попробуйте перетащить на него файл реестра.
Аватара пользователя
Iska

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

Сообщение Iska »

jordan_74, примерно так (на WSH):



Скрытый текст

[spoiler]Код:
[/spoiler]

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

Option Explicit
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)
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	If objFSO.FileExists(strTemplateFile) Then
		If objFSO.FileExists(strSourceFile) Then
			If objFSO.FolderExists(strDestFolder) Then
				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)
				For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
					With objTemplateFile.Worksheets.Item(1)
						anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value
						.Range("B3").Value = anyValue
						.Range("F2").Value = anyValue
						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
					objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
				Next
				objSourceFile.Close False
				objTemplateFile.Close False
				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 & """ "
	WScript.Quit 1
End If
WScript.Quit 0







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



P.S. И что с округлением — делаем, не делаем? Делаем!
Аватара пользователя
jordan_74

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

Сообщение jordan_74 »

Цитата jordan_74:



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




Так было ж «обычным двойным кликом»
VBA - Разбивка строк общего файла на отдельные csv файлы
. Вы захотели, чтобы можно было работать с разными исходными файлами. Как скрипт будет узнавать, с каким именно исходным файлом ему следует работать?!
Аватара пользователя
Iska

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

Сообщение Iska »

Цитата Iska:



Как скрипт будет узнавать, с каким именно исходным файлом ему следует работать?!
VBA - Разбивка строк общего файла на отдельные csv файлы




Я не знаю) с VBA я ещё как то знаком, а вот с wsh совершенно нет.



Тем не менее огромное спасибо Iska, вы очень помогли и облегчили работу многим людям. У меня финальная просьба, т.к я с wsh вообще не знаком, могли бы прокомментировать блоки кода, чтобы понять что делается на разных этапах..!?
Аватара пользователя
jordan_74

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

Сообщение jordan_74 »

Цитата jordan_74:



У меня финальная просьба, т.к я с wsh вообще не знаком, могли бы прокомментировать блоки кода, чтобы понять что делается на разных этапах..!?
VBA - Разбивка строк общего файла на отдельные csv файлы




Постараюсь сделать вечером.
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Ответить

Вернуться в «Программирование и базы данных»