Что нового

Количество заполненных ячеек в столбце Excel

valdur2000

Знающий
Сообщения
155
Репутация
7
Здравствуйте, в файле Excel'a в А столбце 15 ячеек заполненно, в B столбце 2 ячейки, в C столбце 10. Скажите пожалуйста, как узнать сколько заполненных ячеек в столбце например С? и как вырезать две последние нижние заполненные ячейки, что б их потом можно было куда-нибудь вставить в txt. Решения с массивом может быть долго, т.к. в столбце может быть и 50000 и 250000 ячеек с данными... покопался в функциях AutoIt для работы с Excel, но вроде ничего там не нашел... На ум приходят варианты, сохранить как CSV и поработать с текстом либо COM команды, о которых знаю мало, справки русской нету и где узнать список команд с описанием скажем для Excel'a не нашел. Скачал Ole/COM Object Viewer, но там тоже ногу сломать можно. Посветите пожалуйста фонариком, в каком направлении двигаться? Спасибо.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Количество непустых ячеек в конкретном столбце мне определить не удалось, но удалось определить максимум - он определяется самым длинным столбцом в таблице. Может поможет:
Код:
$sFilePath = @ScriptDir & '\table.xls'
If Not FileExists($sFilePath) Then
	MsgBox(262208, 'Ошибка!', 'Файл отсутствует!')
	Exit
EndIf
$oExcel = ObjCreate('Excel.Application') ; создаем объект Excel
If Not IsObj($oExcel) Then
	MsgBox(262208, 'Ошибка!', 'Не удалось запустить Excel!')
	Exit
EndIf

$oExcel.Visible = False ; Excel будет невидим
$oExcel.WorkBooks.Open($sFilePath, Default, False)

With $oExcel.ActiveSheet
	ConsoleWrite('Используемых строк в таблице: ' & .UsedRange.Rows.Count & @CRLF)
	ConsoleWrite('Используемых колонок в таблице: ' & .UsedRange.Columns.Count & @CRLF)
EndWith

$oExcel.Application.Quit ; закрытие Excel


PS посмотри в сторону _Excel функций - UDF идет в комплекте с AutoIt
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
valdur2000,
Попробуйте так, у меня на Excel 2003 работает. Единственный минус - если колонка заполнена до конца, то правильно не определяет, выдает только первую строку (у меня).
Код:
#include <Excel.au3>
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global Const $xlUp = -4162
Global $iError, $oError, $oExcel, $iLastRow, $aLast_2[2][2], $iCount = 0, $sTemp

$oError = ObjEvent('AutoIt.Error', '_ErrFunc')

For $i = 1 To 1
	$oExcel = _ExcelBookOpen(@ScriptDir & '\1.xls');открываем файл
	If @error Then ExitLoop
	_ExcelSheetActivate($oExcel, 2);открываем лист 2 (по номеру листа). Можно по имени _ExcelSheetActivate($oExcel, 'Лист2')
	If @error Then ExitLoop
	;$oExcel.Rows.Count - определяем максимальное число строк (в 2003 можно заменить на 65536)
	$iLastRow = $oExcel.Cells($oExcel.Rows.Count, 'D' ).End($xlUp).Row;определяем последнюю не пустую ячейку в колонке D
	If $iError Then
		MsgBox(16, 'Error', $iError)
	Else
		MsgBox(64, 'Info', 'Номер последней заполненной строки: ' & $iLastRow)
		For $j = $iLastRow To 1 Step -1;заполняем массив адресами двух последних непустых ячеек и их значениями
			$sTemp = _ExcelReadCell($oExcel, 'D' & $j)
			If @error Then ExitLoop
			If $sTemp Then
				$aLast_2[$iCount][0] = 'D' & $j
				$aLast_2[$iCount][1] = $sTemp
				$iCount += 1
				If $iCount = 2 Then ExitLoop
			EndIf
		Next
		If Not @error Then
			If $iCount Then
				_ArrayDisplay($aLast_2, 'Две последние ячейки')
			Else
				MsgBox(64, 'Info', 'Нет заполненных ячеек')
			EndIf
		EndIf
	EndIf
Next
If @error Or $iError Then
	MsgBox(16, 'Error', 'Error')
EndIf
_ExcelBookClose($oExcel)

Func _ErrFunc()
	$iError = $oError.Number
EndFunc   ;==>_ErrFunc
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Вот у вас тоже используются COM команды. А где толковую справку по ним найти? Как узнать команды для Excel?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
valdur2000
Использование некоторых команды можно посмотреть в excel.au3
Ну и конечно google + msdn
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
http://citforum.ru/programming/windows/
Лекции Excel ЧаВо и Объекты Excel помогут в любой жизненной ситуации. Почти все COM объекты с примерами. Соответственно все на русском.
 
Верх