2016-07-28 2 views
1

Я написал код сегодня для работы, и я столкнулся с проблемой, когда команда, которую я предоставляю SQL-серверу через VBA, не запрашивает такое же количество информации, как если бы я выполнял ту же самую точную команду на самом сервере. Если я выполнил код ниже в VBA, я получаю около 25 строк из 68 столбцов. Если я выполняю ту же самую команду на самом сервере, я получаю чуть более 1500 строк из 68 столбцов. То, что я делаю, - это выбрать номер заказа или дату, в форме и лишить гору данных только то, что хочет найти мой клиент. Я уверен, что это не лучший способ распространения данных по электронной таблице. Я ищу предложения и исправления ошибок!Распространение данных соты

Спасибо заранее,

Адам

Set conn = New ADODB.Connection 
Set cmd = New ADODB.Command 
constr = "Provider=REMOVEDFORPRIVACY" 
If (ComboBox1.Value <> "" And ComboBox2.Value <> "") Or (ComboBox1.Value = "" And ComboBox2.Value = "") Then 
    MsgBox "Please select one search method.", vbOKOnly 
    ComboBox2.Value = "" 
    ComboBox1.Value = "" 
ElseIf (ComboBox1.Value <> "" And ComboBox2.Value = "") Then 
    cmd.CommandText = "SELECT * FROM [Run_Data].[dbo].[RunLog_Data] WHERE SnapShot_Date = '" & ComboBox1.Value & "'" 
    conn.Open constr 
    cmd.ActiveConnection = conn 
    Set rst = cmd.Execute() 
    Do While Not rst.EOF 
     o = o + 1 
     If o > 67 Then 
      o = 1     'Column Position 
      n = n + 1    'Row Position 
     End If 
     Range(Cells(n, o), Cells(n, o)).Value = rst(o) 
     rst.MoveNext 
    Loop 
    rst.Close 
    conn.Close 
ElseIf (ComboBox1.Value = "" And ComboBox2.Value <> "") Then 
    cmd.CommandText = "SELECT * FROM [Run_Data].[dbo].[RunLog_Data] WHERE OrderNumber = '" & ComboBox2.Value & "'" 
    conn.Open constr 
    cmd.ActiveConnection = conn 
    Set rst = cmd.Execute() 
    Do While Not rst.EOF 
     'Duplicate above and consolidate code 
    rst.MoveNext 
    Loop 
    rst.Close 
    conn.Close 
End If 
+0

Вместо 'Do While Not Rst.EOF' ...' Loop', вы можете просто сказать «Ячейки (n, o) .CopyFromRecordSet rst'. (Я думаю) (например, «Ячейки (2,1) .CopyFromRecordSet rst' должен [надеюсь] скопировать набор записей, начиная с ячейки A2) – YowE3K

+0

Dang, спасибо. Не знаю, как я это пропустил. Очистил его также. – Flibertyjibbet

ответ

2

Проблема у Вас есть то, что вы выполняете ваши rst.MoveNext после заполнения в каждой ячейке . Поэтому в первой строке вывода вы собираете первый столбец первой записи, второй столбец второй записи, ... 68-й столбец 68-й записи. Тогда вы наполнение второй линии продукции с 1-го столбцом 69th записи и т.д.

Я считаю, вы можете заменить весь цикл с

Cells(1,1).CopyFromRecordset rst 

(замена клеток (1,1) с независимо от ячейки вы хотите быть топ-левом углу ваших результатов)

, но в качестве альтернативы вы можете переместить команду rst.MoveNext в выписке Если, т.е.

If o > 67 Then 
     o = 1     'Column Position 
     n = n + 1    'Row Position 
     rst.MoveNext 
    End If 
0
Private Sub acceptButton_Click() 
    Set conn = New ADODB.Connection 
    Set cmd = New ADODB.Command 
    constr = "REMOVEDFORPRIVACY" 
    Dim sel_str, sel_type As String 
    If (ComboBox1.Value <> "" And ComboBox2.Value <> "") Or (ComboBox1.Value = "" And ComboBox2.Value = "") Then 
     MsgBox "Please select one search method.", vbOKOnly 
     ComboBox2.Value = "" 
     ComboBox1.Value = "" 
    ElseIf (ComboBox1.Value <> "" And ComboBox2.Value = "") Then 
     sel_type = "SnapShot_Date" 
     sel_str = ComboBox1.Value 
    ElseIf (ComboBox1.Value = "" And ComboBox2.Value <> "") Then 
     sel_type = "OrderNumber" 
     sel_str = ComboBox2.Value 
    End If 
    cmd.CommandText = "SELECT * FROM [Run_Data].[dbo].[RunLog_Data] WHERE " & sel_type & " = '" & sel_str & "'" 
    conn.Open constr 
    cmd.ActiveConnection = conn 
    Set rst = cmd.Execute() 
     Cells(2, 1).CopyFromRecordset rst 
    rst.Close 
    conn.Close 
    Me.Hide 
End Sub 
Смежные вопросы