Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Аватара пользователя
Vadikan

Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Vadikan »

Всем привет!



Есть рутинная задача. Имеется папка с книгами Excel, в которых разное количество листов, но в каждом есть столбец B (с ячейкой B1=Owner). Нужен скрипт, который удалит все столбцы со всех листов во всех книгах.



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



Буду признателен за любую помощь.



Вадим
Аватара пользователя
Iska

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Iska »

Цитата Vadikan:



удалит все столбцы со всех листов во всех книгах.
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




«Все столбцы» — подходящие под условие столбцы B? Можно попробовать так:


читать дальше »




Код:

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

Option Explicit
Const xlWorksheet = &HFFFFEFB9
Dim strFolder
Dim objFSO
Dim objFile
Dim objExcel
Dim objWorksheet
If WScript.Arguments.Count = 1 Then
	strFolder = WScript.Arguments.Item(0)
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	If objFSO.FolderExists(strFolder) Then
		Set objExcel = WScript.CreateObject("Excel.Application")
		For Each objFile In objFSO.GetFolder(strFolder).Files
			Select Case LCase(objFSO.GetExtensionName(objFile.Name))
				Case "xls", "xlsx"
					With objExcel.Workbooks.Open(objFile.Path)
						For Each objWorksheet In .Sheets
							With objWorksheet
								If .Type = xlWorksheet Then
									With .Cells.Item(1, 2)
										If .Value = "Owner" Then
											.EntireColumn.Delete
										End If
									End With
								End If
							End With
						Next
						.Save
						.Close
					End With
				Case Else
					' Nothing to do
			End Select
		Next
		objExcel.Quit
		Set objExcel = Nothing
	Else
		WScript.Echo "Folder [" & strFolder & "] not found"
	End If
Else
	WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " "
End If
WScript.Quit 0





* писалось под 2003-им Microsoft Excel, потому крайне рекомендую сначала опробовать «на свинках»;

* не рекурсивно.
Аватара пользователя
Vadikan

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Vadikan »

Iska, в общем, дело в том, что Office 2013 не поддерживает VBA/Activex Изображение
Аватара пользователя
van1985

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение van1985 »

Powershell



написал только что , так что без особого тестирования... Сначала лучше запустить на "кошках"

Excel 2007.





Код:

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

$xlCellTypeLastCell = 11
$xl = New-Object -com Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $False
Get-ChildItem -Path c:\temp\excelRemouveColumn -Recurse -Include *.xlsx | %{
$wb = $xl.Workbooks.Open($_.fullname) 
1..$wb.Worksheets.Count | %{
$ws = $wb.Worksheets.Item($_)
if($ws.cells.item(1,2).value() -eq "Owner"){
[void]$ws.columns.item(2).delete()
}
}
$wb.Save()
$wb.Close()
}
$xl.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
Remove-Variable xl

Upd. Язык Office 2013 должен совпадать с региональными стандартами
Аватара пользователя
Vadikan

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Vadikan »

Iska, спасибо за вариант, я ждал помощи от вас Изображение



К сожалению, получил ошибку

Код:

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

C:\Users\username\Documents\test\remove-column.vbs(31, 11) Microsoft VBScript runtime error: Type mismatch: 'Value'

У меня Office 2010.



van1985, кстати, я очень хотел посмотреть, не предложит ли кто-нибудь вариант с PowerShell. Я по гуглу такое не осилил, к сожалению. Большое спасибо, ненужные мне столбцы удалились везде. Нужные, вроде, не пропали Изображение
Аватара пользователя
Vadikan

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Vadikan »

Цитата Vadikan:



потому что в Windows RT из пошика это не сделать.
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




Там нет PowerShell'а?




Цитата Vadikan:



Для решения текущей задачи достаточно только поочередно открыть, сохранить и закрыть все книги XLS в заданной папке.
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




То бишь, со «внутренностями» документа никаких операций делать больше не надо?



Примерно так:


читать дальше »




Код:

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

Option Explicit
Dim objFSO
Dim objFile
Dim strFolder
Dim objSheet
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count = 1 Then ' Если задан аргумент скрипта…
	' …используем его как имя папки для обработки
	strFolder = WScript.Arguments.Item(0)
Else
	' …иначе используем текущий каталог для скрипта
	strFolder = objFSO.GetAbsolutePathName(".")
End If
' В принципе, можно и прямо задать потребную папку для обработки
'strFolder = "c:\temp\excelRemouveColumn"
With WScript.CreateObject("Excel.Application")
	.DisplayAlerts = False
	If objFSO.FolderExists(strFolder) Then
		For Each objFile In objFSO.GetFolder(strFolder).Files
			Select Case LCase(objFSO.GetExtensionName(objFile.Name))
				Case "xls", "xlsx"
					With .Workbooks.Open(objFile.Path)
						'WScript.Echo objFile.Path
						.Save
						.Close
					End With
				Case Else
					' Nothing to do
			End Select
		Next
	Else
		WScript.Echo "Folder [" & strFolder & "] not found."
	End If
	.Quit
End With
Set objFSO = Nothing
WScript.Quit
Аватара пользователя
Iska

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Iska »

Цитата Iska:



Там нет PowerShell'а?
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




Есть, но один специалист по нему сказал, что PS там урезан, поэтому код выше завершается с ошибками.




Цитата Iska:



Примерно так:
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




Спасибо, работает, но выводит диалог с именем каждого обработанного файла. Как его убрать?
Аватара пользователя
Vadikan

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Vadikan »

Цитата Vadikan:



Есть, но один специалист по нему сказал, что PS там урезан, поэтому код выше завершается с ошибками.
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




Спасибо, ясно.




Цитата Vadikan:



выводит диалог с именем каждого обработанного файла. Как его убрать?
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




Вариантов несколько. Проще всего закомментировать строку с «WScript.Echo …». Поправил код
Любой язык - [решено] Открытие, изменение и сохранение книг Excel
.
Аватара пользователя
Iska

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Iska »

Iska, да, так работает, но все равно не сработало в RT.




Цитата:



"Не удается создать объект с именем WScript.Shell".



Видимо, там и VBS какой-то не такой Изображение



Спасибо за помощь!
Аватара пользователя
Vadikan

Re: Любой язык - [решено] Открытие, изменение и сохранение книг Excel

Сообщение Vadikan »

Цитата Vadikan:



Iska, да, так работает, но все равно не сработало в RT.
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




Вот же зараза такая Изображение!




Цитата Vadikan:




Цитата:



"Не удается создать объект с именем WScript.Shell".



Видимо, там и VBS какой-то не такой
Любой язык - [решено] Открытие, изменение и сохранение книг Excel




Давайте попробуем дедовский способ получения текущего каталога — «objFSO.GetAbsolutePathName(".")» вместо использования объекта «WScript.Shell». Ещё раз
Любой язык - [решено] Открытие, изменение и сохранение книг Excel
.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»