powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Чтение из закрытой кники
9 сообщений из 9, страница 1 из 1
Чтение из закрытой кники
    #36651821
Nikosta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть несколько идентичных файлов, из которых нужно собрать свод. Файлы достаточно большие (каждый по 40 Мб), поэтому было принято решение собрать свод макросом. Получилось примерно следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function Recalc()
Dim WB As Excel.Workbook
Dim XL As Excel.Application
Dim o As Excel.Worksheet
Set XL = CreateObject("Excel.Application")
For i =  1  To  10     
    put_ = Worksheets("Íàñòðîéêà").Cells(i,  2 )      
    If filesys.FileExists(put_) Then
      Set WB = XL.Workbooks.Open(put_)
      Set o = WB.Worksheets(strWSName)
      Call sumitog(o, start_stolb, stop_stolb, start_str, stop_str)
      WB.Close
    End If
    
  End If
Next i
XL.Quit
MsgBox "Ok!"
End Function
Функция sumitog просто суммирует все содержимое листа новой книги. Все это работает, но возникли проблемы с производительностью.
Одной из проблем является, на мой взгляд, долгое открытие книги (порядка 10 секунд), а т.к. файлов достаточно много (около 500), то итоговое время получается большое. Можно ли как-то прочитать данные, не открывая книги?
Или есть другой способ решить данную задачу более быстро?
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #36651853
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikosta,

если данные находятся в таблице, можно попробовать прочитать SQL-запросом
Вот кусочек функции, которая делает такое, правда на фокспро(у меня другого под рукой нет), поищи как это делается на VB
Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
Lparameters sFileName As String, dbf_file_name As String
******************************************************************************************
* Функция получает имя файла и пытается его прочесть и получить данные для импорта реестра
* Второй параметр имя курсора результата
*	Возвращаемые значения:
*   1  - Удачное завершение
*   0  - Файл прочли, но не нашли данных для импорта
* - 1  - Не установленно соединение с файлом
* - 2  - Не прочлась схема файла, не известны имена листов
* - 3  - Не создался курсорадаптер
* - 4  - Не создался объект АДО
******************************************************************************************

#Define adStateClosed      0  && Indicates that the object is closed.
#Define adStateOpen        1   && Indicates that the object is open.
#Define adStateConnecting  2   && Indicates that the object is connecting.
#Define adStateExecuting   4   && Indicates that the object is executing a command.
#Define adStateFetching    8   && Indicates that the rows of the object are being retrieved.

#Define adSchemaTables	 20 

Local ca As CursorAdapter
Local oCon As Variant, oRS As Variant, r As Variant
Local bFlag As Boolean, bRetValue As Long
bFlag = .T.
Try
	oCon  = Createobject("ADODB.Connection")
	r = Createobject("ADODB.Recordset")
Catch To oErr
	bRetValue = - 4  && Не создался объект АДО
Endtry
If Vartype(oCon)=='O' Then
	oCon.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="' + sFileName + '";Mode=Share Deny None;Extended Properties="Excel 8.0;HDR=No;IMEX=1";Persist Security Info=False;'
	Try
		oCon.Open
	Catch To oErr
		Messagebox("Не установленно соединение с файлом " + sFileName + Chr( 13 ) + Chr( 10 ) + oErr.Message,  0 + 16 , "Импорт данных")
		bRetValue = - 1 
	Endtry
	If oCon.State = adStateOpen Then
*	Пытаемся прочесть схему документа и узнать сколько листов и как их имена
		Try
			r = oCon.OpenSchema(adSchemaTables)
		Catch To oErr
			Messagebox("Не прочитанна схема файла, нет имен листов." + Chr( 13 ) + Chr( 10 ) + oErr.Message,  0 + 16 , "Импорт данных")
			bFlag = .F.
			bRetValue = - 2  && Не прочлась схема
		Endtry

		If bFlag Then && Schema reads successfulle
			oRS = Createobject("ADODB.Recordset")
			If Vartype(oRS)=='O' Then
				oRS.ActiveConnection=oCon
				oRS.CursorLocation =  3   && adUseClient
				oRS.CursorType=  1   && adOpenKeyset
				oRS.LockType=  3   && adLockOptimistic

				ca = Createobject("CursorAdapter")
				If Vartype(ca)=='O' Then
					With ca
						.UseCursorSchema = .T.
* set data source type, SELECT command and cursor schema
						.Alias = "ca"
						.DataSourceType="ADO"
*						.SelectCmd="select F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21 from [Лист1$]"
						.CursorSchema="F1 v(250), F2 v(250), F3 v(250), F4 v(250), F5 v(250), F6 v(250), F7 v(250), F8 v(250), F9 B(2), F10 B(2), F11 B(2), F12 v(250), F13 T, F14 T, F15 v(250), F16 v(250), F17 v(250), F18 v(250), F19 v(250), F20 B(2), F21 v(250), F22 v(250)"
*						.Tables =[Лист1$]
						.Datasource = oRS
					Endwith
					Do While !r.Eof
						With ca
							.Tables = r.Fields("TABLE_NAME").Value
							.SelectCmd = "select F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22 from [" + r.Fields("TABLE_NAME").Value + "]"
						Endwith
						If !ca.CursorFill() Then
							Aerror(laErrors)
*							Messagebox(laErrors[ 2 ])
							bFlag = .F.
*							? "Table name: " + r.Fields("TABLE_NAME").Value
*							? "Table type: " + r.Fields("TABLE_TYPE").Value
							r.MoveNext
						Else
*		Удачно прочли данные, можно двигатся дальше
							bFlag =.T.
							Exit
						Endif
					Enddo
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #36652026
fortik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самый прстой способ - написать в формуле ссылку на ячейку в закрытой книге, включая полный путь к ней, а потом range[a1]=range[a1].value (убить формулу, оставить только значение)
ну или через ADO подключаться если там диапазон ячеек
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #36652152
Nikosta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо - буду пробовать ADO.
С формулами не получится - очень большой объем, да и файлы/листы, которые должны быть в формуле могут отсутствовать периодически...
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #36654957
Nikosta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использование ADO позволило сократить время работы с 40 до 15 минут!
Еще раз спасибо.
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #36727034
Nikosta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возник один очень неприятный момент при использовании ADO. Не все данные переносятся в текущую книгу. Вот макрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Dim cnn As ADODB.Connection
  Dim rsT As ADODB.Recordset

  Set filesys = CreateObject("scripting.filesystemobject")
      
  If filesys.FileExists(put_) Then
    Set XL = CreateObject("Excel.Application")
    On Error GoTo ErrorHandler1
    Set cnn = New ADODB.Connection
    With cnn
      .Provider = "Microsoft.Jet.OLEDB.4.0"
      .ConnectionString = "Data Source=" & put_ & "; Extended Properties=Excel 8.0;"
      .Open
    End With
      
    On Error GoTo ErrorHandler2
    Set rsT = New ADODB.Recordset
    quest = "SELECT * FROM [" & strWSName & "A1:DN100]"
    rsT.Open quest, cnn
    ThisWorkbook.Worksheets("DATA").Range("A2").CopyFromRecordset rsT
  
    rsT.Close
    cnn.Close
Так некоторые ячейки в текущей книге остаются пустыми, хотя в книге put_ они заполнены данными. С чем это может быть связано и как решить данную проблему? Никакой закономерности я не могу найти. Например, простая нумерация столбцов выглядит следующим образом:
Код: plaintext
1.
								 9 			 12 	 13 	 14 	 15 	 16 
а должна с 1 до 16, формат ячеек одинаковый.
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #36727118
Nikosta,
попробуйте в строке соединения указать
Код: plaintext
Extended Properties='Excel  8 . 0 ;IMEX= 1 '
(!) не потеряйте одинарные кавычки.
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #36727286
Nikosta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все заработало! СавсемГость , огромное спасибо!
...
Рейтинг: 0 / 0
Чтение из закрытой кники
    #37018544
Nikosta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С
Код: plaintext
Extended Properties='Excel  8 . 0 ;IMEX= 1 '
все отлично работало, пока не пришлось читать данные из ячейки, в которой видно только один знак после (такой формат ячеек), а на самом деле их больше. Так вот если стоит параметр IMEX=1, то он читает только один знак после запятой, если поставить IMEX=0, то пропадают данные (как описано выше).
Что означает этот параметр? И как правильно сделать, чтоб данные не терялись и копировались данные без округления?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Чтение из закрытой кники
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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