VBA Excel макрос - PullRequest
       7

VBA Excel макрос

2 голосов
/ 08 февраля 2010

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

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

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

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

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

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 голосов
/ 17 февраля 2010

ЕСЛИ вы можете настроить запросы в хранимой процедуре на сервере 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...