Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / обработка в цикле Excel-файлов / 17 сообщений из 17, страница 1 из 1
10.03.2005, 15:35
    #32953747
alexis glinski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
нужно из нескольких 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
15.03.2005, 12:21
    #32960502
Processor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
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
15.03.2005, 12:36
    #32960545
Ikar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
ProcessorВ данном случае приведен пример кода на VB, не совпадающем с VB 6.x
(см., напр., ключевые слова DESTROY, MessageBox).
В данном случае код приведен на PowerScript, а не на VB...
...
Рейтинг: 0 / 0
15.03.2005, 14:25
    #32960909
Processor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
IkarВ данном случае код приведен на PowerScript, а не на VB... С этим я разобрался ;-)))
...
Рейтинг: 0 / 0
16.05.2005, 16:53
    #33067755
alexis glinski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
Может кто-то сталкивался
Код: 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
17.05.2005, 10:10
    #33068746
ChV
ChV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
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
17.05.2005, 10:26
    #33068785
alexis glinski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
ChVСоболезную, но проблема не в приведенном скрипте. У меня 5 файлов обработались безукоризненно. ( PB 7.0 )
вобщем было замечено что проблемы начинаыутся когда этот код выполняется по несколько раз, аналогичное поведение на других машинах, версия PB 6.5.1 ...
...
Рейтинг: 0 / 0
17.05.2005, 10:57
    #33068859
ChV
ChV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
Ну, вообщем, речь шла только о том, что в скрипте нет ошибок. А если вообще, возможно следует учесть, что я проверял работу в Debug-е, а в реальной работе, в динамике ..., вообщем, - меня смущает сообщение "Cannot access ...". Может есть смысл проверить сутуацию - Excel не успел завершить работу с предыдущим файлом и поэтому не может выполнить подсоединение к следующиму ? Это, конечно, предположение. Может попробовать поместить обработку файла в отдельную функцию, а её вызывать через Post ?
P.S. кстати, а засады нет с доступом к файлу ?
...
Рейтинг: 0 / 0
17.05.2005, 11:06
    #33068902
ChV
ChV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
Кстати. Вызвал написанную функцию обработки 5 -ти Excel файлов в цикле - 100 раз - отработало без ошибок ( PB 7.0.3 Build 10009, а так же на PB 9.0.1 Buld 7171 )
...
Рейтинг: 0 / 0
17.05.2005, 13:11
    #33069331
alexis glinski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
ChVНу, вообщем, речь шла только о том, что в скрипте нет ошибок. А если вообще, возможно следует учесть, что я проверял работу в Debug-е, а в реальной работе, в динамике ..., вообщем, - меня смущает сообщение "Cannot access ...". Может есть смысл проверить сутуацию - Excel не успел завершить работу с предыдущим файлом и поэтому не может выполнить подсоединение к следующиму ? Это, конечно, предположение. Может попробовать поместить обработку файла в отдельную функцию, а её вызывать через Post ?
P.S. кстати, а засады нет с доступом к файлу ?
действительно, файл удерживался объектом транзакции Excel'евского ODBC ...
спасибо за помощь :)
...
Рейтинг: 0 / 0
14.09.2005, 09:37
    #33267881
alexis glinski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
Как правильно вызвать метод 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
14.09.2005, 16:53
    #33269589
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
А так?
Код: plaintext
1.
ole_book.application.ActiveWorkBook.worksheets( 1 ).Range("A1").Select()
...
Рейтинг: 0 / 0
14.09.2005, 17:06
    #33269625
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
А зачем вызывать Select? Тем более через OLE.
Совершенно ненужная функция, но почему-то чрезвычайно любимая новичками.
Хочешь работать с колонкой:
loo_Column = loo_Excel.Application.Workbooks( ls_FileName ).Worksheets( ll_Idx ).Columns( 1 )
а потом все действия делаешь напрямую с loo_Column.
...
Рейтинг: 0 / 0
14.09.2005, 17:21
    #33269676
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка в цикле Excel-файлов
White Owl wrote:

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

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

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


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