2010-02-08 7 views
2

У меня этот макрос VBA в Excel. Когда пользователь нажимает кнопку на листе, макрос возвращает результаты на лист. Что я хотел бы спросить, как я могу запустить более одного запроса (который возвращает разные результаты) на том же листе, используя приведенный ниже код?VBA excel macro

Sub Stats2() 
    Workbooks("macro.xls").Sheets("Sheet3").Select 
    ActiveSheet.Range("A1").Select 

    Dim objConn As ADODB.Connection 
    Dim rsData As ADODB.Recordset 
    Dim strSQL As String 
    szconnect = "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=*******88;Data Source=****" 

    ''#Create the Connection and Recordset objects. 
    Set objConn = New ADODB.Connection 
    Set rsData = New ADODB.Recordset 

    On Error GoTo errHandler 

    ''#Open the Connection and execute the stored procedure 
    objConn.Open szconnect 
    strSQL = "select * from CATEGORY_TYPE " 
    objConn.CommandTimeout = 0 
    Set rsData = objConn.Execute(strSQL) 

    For iCols = 0 To rsData.Fields.Count - 1 
    ActiveSheet.Range("A3").Select 
    ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column + iCols).Value = rsData.Fields(iCols).Name 
    ActiveSheet.Cells.Font.Name = "Arial" 
    ActiveSheet.Cells.Font.Size = 8 
    ActiveSheet.Cells.EntireColumn.AutoFit 
    Next 

    ActiveSheet.Range(ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column), ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column + rsData.Fields.Count)).Font.Bold = True 
    j = 2 

    If Not rsData.EOF Then 
    ''#Dump the contents of the recordset onto the worksheet 
    On Error GoTo errHandler 
    ActiveSheet.Cells(ActiveCell.Row + 1, ActiveCell.Column).CopyFromRecordset rsData 
    If Not rsData.EOF Then 
     MsgBox "Data set too large for a worksheet!" 
    End If 
    rsData.Close 
    End If 

    Unload frmSQLQueryADO 
    Exit Sub 

    errHandler: 
    MsgBox Err.Description, vbCritical, "Error No: " & Err.Number 
    ''#Unload frmSQLQueryADO 
End Sub 
+0

вы можете вызвать несколько методов из одного метода, и каждый метод выполняет свою собственную логику. Я не уверен, что понимаю этот вопрос. – FiveTools

+0

что я имею в виду в этом разделе кода strSQL = "select * from ACCOUNT_CATEGORY_TYPE" Как добавить еще один запрос? могу ли я добавить его так: strSQL = "select * from ACCOUNT_CATEGORY_TYPE" + "select * from users"? – andreas

+0

Затем вам нужно уточнить Q. Почему вы хотите запускать многократные запросы? Вы понимаете, что нет логики в возвращаемом наборе вашего примера в комментарии? – gbianchi

ответ

1

Вы должны вызвать именно эту процедуру вышестоящих один, передать запрос и начальную ячейку в качестве параметров, и вы можете запустить его несколько раз заполняя лист, как вы хотите.

маленький пример:

sub stats2() 
    dim lastrow as string 
    lastrow = "A1" 
    lastrow = Query1(lastrow,"select * from foo") 
    lastrow = Query1(lastrow,"select * from other") 
end sub 

sub query1(startingrow as string, sqlquery as string) as string 
    'your code here. Take in mind that you can have a connection opened outside of here 
    'The rest could be the same 
    'just use the two parameters, one for the query, the other for the range you 
    'start filling the columns name. 
    [code here] 
    'return the las used row. 
end sub 
+0

ermmm ok вы можете дать мне пример о том, как это сделать .. не реально Vg progrmammer здесь .. – andreas

0

Если вы можете задать вопросы в хранимой процедуре на сервере SQL запросы будут выполнил разделенным наборы результатов вернулся, что-то вроде:

Dim rsData As ADODB.Recordset 
    Dim oCmd As ADODB.Command 

    With oCmd 
     .ActiveConnection = objConn 
     .CommandType = adCmdStoredProc 
     .CommandText = "SprocName" 
    End With 

    Set rsData = oCmd.Execute() 

    'do stuff with the first results 

    rsData.NextRecordset 
    'rsData will now be the next set of results 

    rsData.NextRecordset 
    'rsData will now be the third set of results 

В качестве альтернативы вы можете указать несколько запросов с помощью

.CommandType = adCmdText 
.CommandText = "Select * FROM Foo; Select * FROM Bar;" 

hav ; между каждым запросом я не уверен в этом, я обычно настраиваю sproc