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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Открытие, изменение и сохранение книг Excel

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

(*.*)


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


Конфигурация

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


Всем привет!

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

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

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

Вадим

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:04, 07-12-2012

 

Ветеран


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

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


Цитата Vadikan:
удалит все столбцы со всех листов во всех книгах. »
«Все столбцы» — подходящие под условие столбцы 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 & " <Folder>"
End If

WScript.Quit 0

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

Отправлено: 16:31, 07-12-2012 | #2



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

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


Новый участник


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

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


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, 16-04-2013 в 22:02. Причина: upd

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:12, 07-12-2012 | #3


(*.*)


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

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


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

К сожалению, получил ошибку
Код: Выделить весь код
C:\Users\username\Documents\test\remove-column.vbs(31, 11) Microsoft VBScript runtime error: Type mismatch: 'Value'
У меня Office 2010.

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

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 18:59, 07-12-2012 | #4


(*.*)


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

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


Я временно сниму пометку решено и подниму тему.

Сейчас нужно решение именно на VBS под Office 2013 RT, потому что в Windows RT из пошика это не сделать. Для решения текущей задачи достаточно только поочередно открыть, сохранить и закрыть все книги XLS в заданной папке.

Вот тут есть очень похожее http://stackoverflow.com/questions/1...-automatically , надо на обработку папки переделать, но у меня с VBS совсем никак

Буду признателен любым идеям!

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 22:07, 16-04-2013 | #5


Ветеран


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

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


Цитата Vadikan:
потому что в Windows RT из пошика это не сделать. »
Там нет PowerShell'а?


Цитата Vadikan:
Для решения текущей задачи достаточно только поочередно открыть, сохранить и закрыть все книги XLS в заданной папке. »
То бишь, со «внутренностями» документа никаких операций делать больше не надо?

Примерно так:
читать дальше »
Код: Выделить весь код
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, 18-04-2013 в 00:17.

Это сообщение посчитали полезным следующие участники:

Отправлено: 04:49, 17-04-2013 | #6


(*.*)


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

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


Цитата Iska:
Там нет PowerShell'а? »
Есть, но один специалист по нему сказал, что PS там урезан, поэтому код выше завершается с ошибками.

Цитата Iska:
Примерно так: »
Спасибо, работает, но выводит диалог с именем каждого обработанного файла. Как его убрать?

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 11:16, 17-04-2013 | #7


Ветеран


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

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


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

Цитата Vadikan:
выводит диалог с именем каждого обработанного файла. Как его убрать? »
Вариантов несколько. Проще всего закомментировать строку с «WScript.Echo …». Поправил код выше.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:09, 17-04-2013 | #8


(*.*)


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

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


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

Цитата:
"Не удается создать объект с именем WScript.Shell".
Видимо, там и VBS какой-то не такой

Спасибо за помощь!

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 21:45, 17-04-2013 | #9


Ветеран


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

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


Цитата Vadikan:
Iska, да, так работает, но все равно не сработало в RT. »
Вот же зараза такая !


Цитата Vadikan:
Цитата:
"Не удается создать объект с именем WScript.Shell".
Видимо, там и VBS какой-то не такой »
Давайте попробуем дедовский способ получения текущего каталога — «objFSO.GetAbsolutePathName(".")» вместо использования объекта «WScript.Shell». Ещё раз поправил код.

Отправлено: 00:18, 18-04-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Открытие, изменение и сохранение книг Excel

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Открытие файла Excel в Visual Basic 2010 neo21 Программирование и базы данных 18 27-07-2016 14:22
2010 - Создание, сохранение и открытие документа в Word 2010 OSZone Microsoft Office (Word, Excel, Outlook и т.д.) 11 13-05-2014 11:26
VBA - [решено] сохранение текстовых файлов (Excel) neprotiv Программирование и базы данных 4 28-12-2011 08:54
VBS/WSH/JS - [решено] Открытие файла Excel с помощью vbs neo21 Скриптовые языки администрирования Windows 1 30-10-2011 20:08
Разное - Internet explorer + сохранение/открытие файла Dj Dynamite Microsoft Windows 2000/XP 8 31-01-2009 20:10




 
Переход