powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / обработка в цикле Excel-файлов
17 сообщений из 17, страница 1 из 1
обработка в цикле Excel-файлов
    #32953747
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно из нескольких Excel-файлов достать список листов (spreadsheet'ов), следующий код валится на 3-й итерации (первый и второй файл обрабатываются нормально) в строке
Код: plaintext
lole_WorkBook = lole_Excel.Application.Workbooks.Open( ls_FullName )
чего тут не хватает (изменение порядка файлов ни на что не влияет, т.е. проблема не с файлом) ???

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
// connect to Excel
lole_Excel = CREATE OLEObject
IF IsValid( lole_Excel ) THEN
	ll_Rtn = lole_Excel.ConnectToNewObject( "Excel.Application" )
	// if connection succesfull
	IF ll_Rtn =  0  THEN
		FOR ll_FileIdx =  1  TO ll_FileCount
			ls_FileName = lnv_DirAttrib[ll_FileIdx].is_FileName
			ls_FullName = ls_Folder + ls_FileName
			// check existing/locking
			IF FileExists( ls_FullName ) THEN
				// open file in Excel
				lole_WorkBook = lole_Excel.Application.Workbooks.Open( ls_FullName )
				IF IsValid( lole_WorkBook ) THEN
					ll_SSCount = lole_WorkBook.Worksheets.Count
					FOR ll_Idx =  1  TO ll_SSCount
						ls_WorkSheet = lole_WorkBook.Worksheets(ll_Idx).Name
					NEXT
					lole_WorkBook.Close()
					ll_Rtn = lole_WorkBook.DisconnectObject()
					IF ll_Rtn <>  0  THEN
						MessageBox( ls_InternalError, 'OLE WorkBook.DisconnectObject() failed: ' + string( ll_Rtn ), StopSign! )
					END IF
					DESTROY lole_Workbook
				ELSE
					MessageBox( ls_InternalError, 'Cannot open Workbook:~r~n' + ls_FullName, StopSign! )
				END IF
							
			END IF
		NEXT
		ll_Rtn = lole_Excel.DisconnectObject()
		IF ll_Rtn <>  0  THEN
			MessageBox( ls_InternalError, 'OLE Excel.DisconnectObject() failed: ' + string( ll_Rtn ), StopSign! )
		END IF
	ELSE
		MessageBox( ls_InternalError, 'OLE creation failed: ' + string( ll_Rtn ), StopSign! )
	END IF
	DESTROY lole_Excel		
END IF
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #32960502
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Как правило, при демонстрации неработающего фрагмента кода последний должен быть "выхолощен" от затеняющих проблему фрагментов.
2. Также "правилом хорошего тона" является описание переменных.

В данном случае приведен пример кода на VB, не совпадающем с VB 6.x
(см., напр., ключевые слова DESTROY, MessageBox).
Поэтому трудно утверждать наверное, что конструкция
Код: plaintext
lole_WorkBook = lole_Excel.Application.Workbooks.Open( ls_FullName )
синтаксически правильна, но семантически ошибочна.

Однако, следуя VB от Microsoft, логичен таков ход анализа:

Метод Workbooks.Open(...) возвращает объект Workbook.
Если lole_WorkBook трактуется как ссылка на объект, то предполагается следующая её инциализация:
Код: plaintext
Set lole_WorkBook = lole_Excel.Application.Workbooks.Open( ls_FullName )

(До третьей итерации трудно добраться без предварительного знакомства с этим диалектом VB).
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #32960545
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProcessorВ данном случае приведен пример кода на VB, не совпадающем с VB 6.x
(см., напр., ключевые слова DESTROY, MessageBox).
В данном случае код приведен на PowerScript, а не на VB...
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #32960909
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IkarВ данном случае код приведен на PowerScript, а не на VB... С этим я разобрался ;-)))
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33067755
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто-то сталкивался
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// open file in Excel
loo_Excel = CREATE n_oo
IF IsValid( loo_Excel ) THEN
	ll_Rtn = loo_Excel.ConnectToObject( ls_FullName )
	// if connection succesfull
	IF ll_Rtn =  0  THEN
		ll_SSCount = loo_Excel.Application.Workbooks( ls_FileName ).Worksheets.Count
		FOR ll_Idx =  1  TO ll_SSCount
			ls_WorkSheet = loo_Excel.Application.Workbooks( ls_FileName ).Worksheets(ll_Idx).Name
		NEXT
		loo_Excel.Application.Workbooks( ls_FileName ).Close()
		ll_Rtn = loo_Excel.DisconnectObject()
		IF ll_Rtn <>  0  THEN
			MessageBox( ls_InternalError, ls_Message, StopSign! )
		END IF
	ELSE
		MessageBox( ls_InternalError, ls_Message, StopSign! )
	END IF
	
	DESTROY loo_Excel
END IF
если этот код выполнится для одного фаила 2 раза, то появляется такая ошибка Excel:
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33068746
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexis glinski
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
// connect to Excel
lole_Excel = CREATE OLEObject
IF IsValid( lole_Excel ) THEN
	ll_Rtn = lole_Excel.ConnectToNewObject( "Excel.Application" )
	// if connection succesfull
	IF ll_Rtn =  0  THEN
		FOR ll_FileIdx =  1  TO ll_FileCount
			ls_FileName = lnv_DirAttrib[ll_FileIdx].is_FileName
			ls_FullName = ls_Folder + ls_FileName
			// check existing/locking
			IF FileExists( ls_FullName ) THEN
				// open file in Excel
				lole_WorkBook = lole_Excel.Application.Workbooks.Open( ls_FullName )
				IF IsValid( lole_WorkBook ) THEN
					ll_SSCount = lole_WorkBook.Worksheets.Count
					FOR ll_Idx =  1  TO ll_SSCount
						ls_WorkSheet = lole_WorkBook.Worksheets(ll_Idx).Name
					NEXT
					lole_WorkBook.Close()
					ll_Rtn = lole_WorkBook.DisconnectObject()
					IF ll_Rtn <>  0  THEN
						MessageBox( ls_InternalError, 'OLE WorkBook.DisconnectObject() failed: ' + string( ll_Rtn ), StopSign! )
					END IF
					DESTROY lole_Workbook
				ELSE
					MessageBox( ls_InternalError, 'Cannot open Workbook:~r~n' + ls_FullName, StopSign! )
				END IF
							
			END IF
		NEXT
		ll_Rtn = lole_Excel.DisconnectObject()
		IF ll_Rtn <>  0  THEN
			MessageBox( ls_InternalError, 'OLE Excel.DisconnectObject() failed: ' + string( ll_Rtn ), StopSign! )
		END IF
	ELSE
		MessageBox( ls_InternalError, 'OLE creation failed: ' + string( ll_Rtn ), StopSign! )
	END IF
	DESTROY lole_Excel		
END IF

Соболезную, но проблема не в приведенном скрипте. У меня 5 файлов обработались безукоризненно. ( PB 7.0 )
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33068785
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChVСоболезную, но проблема не в приведенном скрипте. У меня 5 файлов обработались безукоризненно. ( PB 7.0 )
вобщем было замечено что проблемы начинаыутся когда этот код выполняется по несколько раз, аналогичное поведение на других машинах, версия PB 6.5.1 ...
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33068859
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вообщем, речь шла только о том, что в скрипте нет ошибок. А если вообще, возможно следует учесть, что я проверял работу в Debug-е, а в реальной работе, в динамике ..., вообщем, - меня смущает сообщение "Cannot access ...". Может есть смысл проверить сутуацию - Excel не успел завершить работу с предыдущим файлом и поэтому не может выполнить подсоединение к следующиму ? Это, конечно, предположение. Может попробовать поместить обработку файла в отдельную функцию, а её вызывать через Post ?
P.S. кстати, а засады нет с доступом к файлу ?
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33068902
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати. Вызвал написанную функцию обработки 5 -ти Excel файлов в цикле - 100 раз - отработало без ошибок ( PB 7.0.3 Build 10009, а так же на PB 9.0.1 Buld 7171 )
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33069331
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChVНу, вообщем, речь шла только о том, что в скрипте нет ошибок. А если вообще, возможно следует учесть, что я проверял работу в Debug-е, а в реальной работе, в динамике ..., вообщем, - меня смущает сообщение "Cannot access ...". Может есть смысл проверить сутуацию - Excel не успел завершить работу с предыдущим файлом и поэтому не может выполнить подсоединение к следующиму ? Это, конечно, предположение. Может попробовать поместить обработку файла в отдельную функцию, а её вызывать через Post ?
P.S. кстати, а засады нет с доступом к файлу ?
действительно, файл удерживался объектом транзакции Excel'евского ODBC ...
спасибо за помощь :)
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33267881
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно вызвать метод Select? У меня всё время Error accessing external object property (function - если скобки приписать в конце) select at line ...
Код: plaintext
1.
2.
loo_Excel.Application.Workbooks( ls_FileName ).Worksheets( ll_Idx ).Columns(  1  ).Select
loo_Excel.Application.Workbooks( ls_FileName ).Worksheets( ll_Idx ).Columns(  1  ).Cells.Select
пробовал и так:
Код: plaintext
1.
loo_Select = loo_Excel.Application.Workbooks( ls_FileName ).Worksheets( ll_Idx ).Columns(  1  )
loo_Select.Select

также попробовал добаить скобки ( Select() ) - не помогло ...
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33269589
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?
Код: plaintext
1.
ole_book.application.ActiveWorkBook.worksheets( 1 ).Range("A1").Select()
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33269625
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вызывать Select? Тем более через OLE.
Совершенно ненужная функция, но почему-то чрезвычайно любимая новичками.
Хочешь работать с колонкой:
loo_Column = loo_Excel.Application.Workbooks( ls_FileName ).Worksheets( ll_Idx ).Columns( 1 )
а потом все действия делаешь напрямую с loo_Column.
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33269676
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> Совершенно ненужная функция, но почему-то чрезвычайно любимая новичками.

Потому что сам Excel очень любит её использовать, когда записывает
макросы. А избавиться от неё ума не хватает .
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33269873
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА зачем вызывать Select?
Например если нужно, чтобы при открытии файла курсор был в заданной ячейке :)
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33270033
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky White OwlА зачем вызывать Select?
Например если нужно, чтобы при открытии файла курсор был в заданной ячейке :)
А это еще зачем?
...
Рейтинг: 0 / 0
обработка в цикле Excel-файлов
    #33270095
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА так?
Код: plaintext
1.
ole_book.application.ActiveWorkBook.worksheets( 1 ).Range("A1").Select()

как оказалось вариант с Select работал не так как надо (проверил на VBA) поэтому пришлось переписать без него, если вдруг ещё раз понадобится Select то попробую :)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / обработка в цикле Excel-файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]