powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Почему не выгружаются данные во второй лист с 1-го раза
4 сообщений из 4, страница 1 из 1
Почему не выгружаются данные во второй лист с 1-го раза
    #39207937
лягуш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, уважаемые форумчане!

Требуется наводка, уже голову сломал))

Есть MSA 2003 mdb-база, есть готовый шаблон экселя (на самом деле их уже много, они выгружаются как положено).
Есть некий шаблон с двумя листами: "манифест" и "акт". Требуется выгружать разные данные из таблицы Выгрузка в таблицы ManifTBL и AktTBL, затем из этих таблиц и неких запросов выгружаем в эксель-шаблон, который уже находится в базе акцесса.

Проблема:
- Первый раз при выгрузке (нажатии кнопки экспорта) выгружаются данные только в лист "манифест". Лист "акт" остается активным, и выделен диапазон B10 (- срабатывает код xlApp.Sheets("акт").Range("B10").Activate - ).
- Новые пустые строки в шаблон не вставляются ( - не работает For j = 0 To rs4.RecordCount - 3
xlApp.Selection.Insert Shift:=xlDown
Next j
-).
- Рекордсет не вставляется ( - не работает xlApp.Sheets("акт").Range("rangeVstavka").CopyFromRecordset rs4 - ).
- Остальные значения в ячейки с листа "акт" вставляются.

!!! Если не закрывать эту книгу и еще раз нажать кнопку Выгрузки в эксель - заполняется и лист "акт" !!!

Вопрос: где ошибка и почему такое происходит???

Примерный код (изменил несущественно):

Код: vbnet
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.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
Option Compare Text
Option Explicit
  Dim xlApp As Excel.Application
  Dim xlBook As Excel.Workbook
  Dim xlSheet As Excel.Worksheet
  Dim obExcel As Object
  Dim obWindow As Object  'окно документа

'Печать/выгрузка манифеста и акта
Private Sub ManifAkt_9()

'Открываем шаблон Excel-файла
  StartExcelEasy "Shabl"
  
'Отключаем вывод оповещаний
  DoCmd.SetWarnings False

'Вставка данных для листа-манифеста
  DoCmd.RunSQL "INSERT INTO [ManifTBL] (  бла-бла-бла )" & _
  "SELECT Выгрузка.бла-бла-бла " & _
  "FROM [Выгрузка];"
  
 'Включаем оповещания
  DoCmd.SetWarnings True
  
  CounterManif 'вызываем функцию счетчика

  Dim sNWind1 As String       ' For conn1 (ManifTBL-таблица)
  Dim sNWind2 As String       ' For conn2 (запрос)
  Dim sNWind3 As String       ' For conn3 (AktTBL, таблица)
  Dim sNWind4 As String       ' For conn4 (AktZapros, Запрос)
  
  Dim conn1 As New ADODB.Connection
  Dim conn2 As New ADODB.Connection
  Dim conn3 As New ADODB.Connection
  Dim conn4 As New ADODB.Connection
  
  Dim rs1 As ADODB.Recordset  
  Dim rs2 As ADODB.Recordset  
  Dim rs3 As ADODB.Recordset
  Dim rs4 As ADODB.Recordset
     
  sNWind1 = "c:\база.mdb"
  conn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNWind1 & ";"
  conn1.CursorLocation = adUseClient
   
  sNWind2 = "c:\база.mdb"
  conn2.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNWind2 & ";"
  conn2.CursorLocation = adUseClient
   
  sNWind3 = "c:\база.mdb"
  conn3.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNWind3 & ";"
  conn3.CursorLocation = adUseClient
  
  sNWind4 = "c:\база.mdb"
  conn4.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNWind4 & ";"
  conn4.CursorLocation = adUseClient
   
  Set rs1 = conn1.Execute("ManifTBL", , adCmdTable)                  ' Таблица
  Set rs2 = conn2.Execute("ManifZapros", , adCmdTable)                 ' Запрос
  Set rs3 = conn3.Execute("AktTBL", , adCmdTable)       ' Таблица
  Set rs4 = conn4.Execute("AktZapros", , adCmdTable) ' Запрос
    
'Вставка количества пустых строк в эксель, равную количеству строк в таблице ManifTBL
'- Делаем лист "манифест" активным
  xlApp.Sheets("манифест").Select
  xlApp.Sheets("манифест").Range("9:9").Select
  xlApp.Sheets("манифест").Range("B9").Activate
  
  Dim i As Integer
' - Вставляем нужное кол-во строк в таблице-шаблоне. // Здесь выполняется шикарно.
  For i = 0 To rs1.RecordCount - 3
  xlApp.Selection.Insert Shift:=xlDown
  Next i
   
'Экспорт из МСА-таблицы ManifTBL в Эксель, лист манифест // Здесь всё выполняется шикарно.
  xlApp.Sheets("манифест").Range("rangeManif").CopyFromRecordset rs1
  xlApp.Sheets("манифест").Range("date").value = Now()
  xlApp.Sheets("манифест").Range("Доставил_Маниф").value = rs2![Доставил_Маниф] ' ИЗ ЗАПРОСА!!!
  xlApp.Sheets("манифест").Range("WhoPrint").value = CurrentUser()
  xlApp.Sheets("манифест").Range("TimePrint").value = Time
  xlApp.Sheets("манифест").Range("A7").Select
  xlApp.Selection.Sort Key1:=xlApp.Sheets("манифест").Range("A7"), Order1:=xlAscending, Header:=xlGuess, _
  OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

' Close 2 recordsets
  rs1.Close
  rs2.Close
  conn1.Close
  conn2.Close
  Set rs1 = Nothing
  Set rs2 = Nothing
     
' ============== Выгрузка Листа Акт ============================

'Отключаем вывод оповещаний
  DoCmd.SetWarnings False
     
'Вставляем данные для листа Акт
  DoCmd.RunSQL "INSERT INTO [AktTBL] ( бла-бла-бла )" & _
  "SELECT Выгрузка.бла-бла-бла " & _
  "FROM [Выгрузка];"

'Считаем и вставляем нумерацию строк в таблице AktTBL
  CounterAkt

'Проверяем, является ли отправитель ИМ и вставляем значения в ОценочнаяСтоимость и НаложенныйПлатеж
' - Является ИМ (ОцСт=ОцСт, НалПлат=ОцСт):
  DoCmd.OpenQuery "_AktPeredachiUpdIM_Sum"
' - НЕ является ИМ (ОцСт=3000, НалПлат=0)
  DoCmd.OpenQuery "_AktPeredachiUpdNotIM_Sum"

'Включаем оповещания
  DoCmd.SetWarnings True

' ===== ЭКСПОРТ В ЭКСЕЛЬ ===== !!!
  xlApp.Sheets("акт").Activate
  xlApp.Sheets("акт").Range("10:10").Select
  xlApp.Sheets("акт").Range("B10").Activate

'Вставляем нужное кол-во строк в таблицу-шаблон ' // ЗДЕСЬ НЕ РАБОТАЕТ, ВЫШЕ НА 1-м ЛИСТЕ РАБОТАЕТ.
  Dim j As Integer
  For j = 0 To rs4.RecordCount - 3
  xlApp.Selection.Insert Shift:=xlDown
  Next j
   
'Экспорт из МСА запроса AktZapros в Эксель, лист акт

  xlApp.Sheets("акт").Range("rangeAkt").CopyFromRecordset rs4 ' // ЗДЕСЬ НЕ РАБОТАЕТ
  
'Вставляем дату в шапку
  'xlApp.Sheets("акт").Range("date").value = Now() ' // И ТАК РАБОТАЕТ !!!
  xlSheet.Range("date").value = Now() ' // ЗДЕСЬ РАБОТАЕТ !!!
  xlApp.Sheets("акт").Range("WhoPrint").value = CurrentUser() ' // ЗДЕСЬ РАБОТАЕТ !!!
  xlApp.Sheets("акт").Range("TimePrint").value = Time ' // ЗДЕСЬ РАБОТАЕТ !!!
  
'Close the connection. Закрываем подключения, ресетим рекордсеты
 
  rs3.Close
  rs4.Close
  conn3.Close
  conn4.Close
  
  Set rs3 = Nothing
  Set rs4 = Nothing
  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
   
End Sub

...
Рейтинг: 0 / 0
Почему не выгружаются данные во второй лист с 1-го раза
    #39208121
Код: vbnet
1.
Set rs4 = conn4.Execute("AktZapros", , adCmdTable) ' Запрос

ИМХО, здесь вы получаете Recordset типа ForwardOnly, а он не знает, сколько у него записей.
Вообще, какая-то странная конструкция. Впервые вижу в подобном случае применение adCmdTable. Recordset правильного типа открывается иначе.

Для получения правильного RecordCount нужно выполнить MoveLast, MoveFirst.

Есть замечания к методам работы с Excel. Все эти .Select, .Selection, .Activate - архитектурные излишества и часто являются причиной не закрытия процесса Excel в памяти.
Работать нужно с объектом Range. Да и переменную xlSheet вы объявили, а не используете
Например, вставить сразу все строки:
Код: vbnet
1.
2.
3.
4.
    Set xlSheet = xlApp.Sheets("манифест")
    Set rng = xlSheet.Range("B9")
    Set rng = rng.Resize(rs1.RecordCount - 3).EntireRow
    rng.Insert



И еще. Вы создаете 4 соединения к одной и той же БД. В реалии они разные?
...
Рейтинг: 0 / 0
Почему не выгружаются данные во второй лист с 1-го раза
    #39208431
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему вместо медленной построчной вставки
Код: vbnet
1.
2.
3.
  For i = 0 To rs1.RecordCount - 3
  xlApp.Selection.Insert Shift:=xlDown
  Next i


гораздо эффективнее использовать копирование-вставку формата
Код: vbnet
1.
2.
3.
4.
5.
With xlSheet
    .Rows("3:3").Copy
    .Rows("3:" & 3 + lngRecordCount - 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    .Rows("3:" & 3 + lngRecordCount - 1).PasteSpecial xlPasteValidation, xlPasteSpecialOperationNone
End With


А вместо глючного Select использовать для пиозиционирования использовать GoTo

Код: vbnet
1.
xlApp.Goto Reference:=xlWork.ActiveSheet.Range("A1"), Scroll:=True
...
Рейтинг: 0 / 0
Почему не выгружаются данные во второй лист с 1-го раза
    #39208503
лягуш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев )
Работать нужно с объектом Range. Да и переменную xlSheet вы объявили, а не используете
И еще. Вы создаете 4 соединения к одной и той же БД. В реалии они разные?
xlSheet объявлена глобально (все по экселю глобально). xlSheet используется, просто в данной функции почему-то не срабатывало, я искал варианты.
Соединения идут к одной БД, просто таблицы или запросы разные. Сделано "топорно", согласен. Я делал так потому что есть своего рода промежуточные таблицы, в которых надо подсчитывать и что-то изменять (видно в коде 2 запроса на обновление выполняются для таблицы и соотв. листа Акт).

Насчет остальных поправок, я вечером попробую и отпишусь о результатах. Спасибо Вам за помощь и наводки!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Почему не выгружаются данные во второй лист с 1-го раза
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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