VBA excelmacros

我在Excel中有这个VBAmacros。 当用户单击工作表上的button时,macros将结果返回到工作表。 我想问的是,如何在同一张表中使用下面的代码运行多个查询(返回不同的结果)?

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 

您应该从上级调用这个过程,将查询和起始单元格作为parameter passing,您可以像填写表单一样多次运行它。

小例子:

 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 

如果您可以在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;" 

有; 在每个查询之间,我不确定这个,我通常会设置一个sproc