| Предыдущая тема :: Следующая тема | 
	
	
		| Автор | Сообщение | 
	
		| dimachus 
 
 
 Зарегистрирован: 07.10.2011
 Сообщения: 108
 
 
 | 
			
				|  Добавлено: Чт Фев 27, 2020 11:14    Заголовок сообщения: Быстрый вывод в Excel |   |  
				| 
 |  
				| Добрый день коллеги! Задался задачей, как на платформе Oracle сделать вывод большого количества данных (заранее наполненного двумерного массива) в Excel.
 Хочется не по строчно выводить данные, а загнать в массив и фигануть всё средствами VBA.
 Кто-нибудь так делал? Получалось?
 Если пробовать так:
 
  	  | Код: |  	  | number ir[1][2];
 
 ir[0][0] = 3;
 ir[0][1] = 4;
 
 m_Excel.VBScript("Dim TheRange(1,2)");
 m_Excel.VBScript("TheRange(0,0) = " + ir[0][0]);
 m_Excel.VBScript("TheRange(0,1) = " + ir[0][1]);
 m_Excel.VBScript("Range(\"H1:I1\").Value = TheRange");
 m_Excel.VBScript("Erase TheRange");
 
 | 
 то нигде не ругается.. но ничего и не делает
   
 
  	  | Код: |  	  | m_Excel.VBScript("TheRange(0,0) = 3");
 m_Excel.VBScript("Range(\"H1\").Value = TheRange(0,0)");
 
 | 
 так тоже ничего...
 Поддерживаются ли вообще массивы для передачи в VBA в Z-языке?
 
 
 
 P.S. Есть ещё менее красивая, но действующая идея.. вывести запрос с данными на сервер приложений с помощью to_Excel(   а потом скопировать на компьютер пользователя.. но тогда очень ограничено получается.
 
 Буду признателен за различные идеи и мысли)
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| Optimizer 
 
 
 Зарегистрирован: 11.03.2020
 Сообщения: 3
 
 
 | 
			
				|  Добавлено: Ср Мар 11, 2020 10:23    Заголовок сообщения: |   |  
				| 
 |  
				| Добрый день, коллеги. 
 Столкнулись с аналогичной проблемой при построении больших отчетов.
 На данный момент используем следующие функции поячеячной записи:
 
  	  | Код: |  	  | m_Excel_num m_Excel_str
 | 
 
 Но это работает быстро только на маленьких отчетах до пары тысяч строк и небольшого количества столбцов.
 
 Для больших отчетов формирование может длиться часами, что не есть клиентоориентированный подход.
 То есть сам запрос формируется за несколько минут и потом 95% времени он выгружается в Excel поячеячно.
 
 Наверняка должен быть способ более быстрого вывода записей, возможно через массив, подобно тому как описал топикстартер, возможно через recordset или каким-то иным образом.
 
 Помогите, пожалуйста!
 
 Спасибо.
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| NewAge 
 
 
 Зарегистрирован: 11.06.2010
 Сообщения: 110
 
 
 | 
			
				|  Добавлено: Ср Мар 11, 2020 11:00    Заголовок сообщения: |   |  
				| 
 |  
				| А чем QueryTables не подходит??? У меня отчет, который ранее выводился более 4 часов, сейчас формируется за 20 минут. |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| _Alexander_ 
 
 
 Зарегистрирован: 10.03.2020
 Сообщения: 3
 
 
 | 
			
				|  Добавлено: Ср Мар 11, 2020 11:15    Заголовок сообщения: |   |  
				| 
 |  
				| На платформе MS SQL для передачи результатов запроса в Excel используем OpenQuery. Самый быстрый вариант для выдачи отчета пользователю. Запрос может быть в макросе в xls-файле или вызываться из x-языка. А у Вас, видимо, можно и из z через m_Excel.VBScript(...) |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| Optimizer 
 
 
 Зарегистрирован: 11.03.2020
 Сообщения: 3
 
 
 | 
			
				|  Добавлено: Ср Мар 11, 2020 17:47    Заголовок сообщения: |   |  
				| 
 |  
				|  	  | NewAge писал(а): |  	  | А чем QueryTables не подходит??? У меня отчет, который ранее выводился более 4 часов, сейчас формируется за 20 минут. | 
 Можете прислать пример на Z-языке?
 Работает ли он для Web версии БК?
 У пользователей нет толстого клиента.
 
 Спасибо.
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| Optimizer 
 
 
 Зарегистрирован: 11.03.2020
 Сообщения: 3
 
 
 | 
			
				|  Добавлено: Чт Мар 12, 2020 13:31    Заголовок сообщения: |   |  
				| 
 |  
				|  	  | _Alexander_ писал(а): |  	  | На платформе MS SQL для передачи результатов запроса в Excel используем OpenQuery. Самый быстрый вариант для выдачи отчета пользователю. Запрос может быть в макросе в xls-файле или вызываться из x-языка. А у Вас, видимо, можно и из z через m_Excel.VBScript(...) | 
 Может быть и можно через m_Excel.VBScript,только к сожалению нигде не нашли документацию и примеры по тому, что и как в нем прописывать.
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| _Alexander_ 
 
 
 Зарегистрирован: 10.03.2020
 Сообщения: 3
 
 
 | 
			
				|  Добавлено: Чт Мар 12, 2020 16:41    Заголовок сообщения: |   |  
				| 
 |  
				| Вот пример кода для x-языка SQL-версии. Предполагается, что Excel-файл уже открыт.
 wb = ActiveWorkbook
 
 
  	  | Код: |  	  | vb { 
 y = wb.ActiveSheet.Cells(7,4)
 
 With wb.ActiveSheet.QueryTables.Add("ODBC;DSN=MyBase;DATABASE=MyBase;LANGUAGE=us_english;Trusted_Connection=Yes", wb.Application.Range("A1"))
 .CommandText = "exec dbo.MyBase_holiday_work_report @y=" & y
 .Name = "export_table"
 .FieldNames = True
 .RowNumbers = False
 .FillAdjacentFormulas = False
 .PreserveFormatting = True
 .RefreshOnFileOpen = False
 .BackgroundQuery = False
 .RefreshStyle = xlInsertDeleteCells
 .SavePassword = False
 .SaveData = True
 .AdjustColumnWidth = True
 .RefreshPeriod = 0
 .PreserveColumnInfo = True
 .Refresh(BackgroundQuery=False)
 End With
 
 While wb.ActiveSheet.QueryTables("export_table").Refreshing = True
 Wend
 
 xlInsideVertical = 11
 xlInsideHorizontal = 12
 xlContinuous = 1
 xlThin = 2
 xlAutomatic = -4105
 
 With wb.ActiveSheet.QueryTables("export_table").ResultRange.Borders(xlInsideVertical)
 .LineStyle = xlContinuous
 .Weight = xlThin
 .ColorIndex = xlAutomatic
 End With
 With wb.ActiveSheet.QueryTables("export_table").ResultRange.Borders(xlInsideHorizontal)
 .LineStyle = xlContinuous
 .Weight = xlThin
 .ColorIndex = xlAutomatic
 End With
 
 wb.ActiveSheet.QueryTables("export_table").Delete
 
 wb.ActiveSheet.Cells(1,1).Select
 
 };
 
 | 
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
	
	
	
		|  |