2010-02-08 9 views
2

J'ai cette macro VBA dans Excel. Lorsqu'un utilisateur clique sur un bouton de la feuille, la macro renvoie les résultats à la feuille. Ce que je voudrais demander, est comment puis-je exécuter plus d'une requête (qui renvoie des résultats différents) dans la même feuille, en utilisant le code ci-dessous?Macro 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 
+0

vous pouvez appeler plusieurs méthodes à partir d'une méthode et chaque méthode effectue sa propre logique. Je ne suis pas sûr de comprendre cette question. – FiveTools

+0

ce que je veux dire est dans cette section de code strSQL = "select * from ACCOUNT_CATEGORY_TYPE" comment ajouter une autre requête? Puis-je l'ajouter comme ceci strSQL = "select * from ACCOUNT_CATEGORY_TYPE" + "select * from users"? – andreas

+0

Vous aurez besoin de clarifier le Q alors. Pourquoi voulez-vous lancer plusieurs requêtes? Est-ce que vous réalisez qu'il n'y a pas de logique dans l'ensemble de retour de votre exemple dans le commentaire? – gbianchi

Répondre

1

Vous devez appeler exactement cette procédure d'un supérieur un, passer la requête et la cellule de départ en tant que paramètres et vous pouvez exécuter plusieurs fois remplir la feuille comme vous voulez.

petit exemple:

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 pouvez-vous me donner un exemple sur la façon de le faire .. pas vraiment un progrmammer VB ici .. – andreas

0

SI vous pouvez définir les requêtes dans une procédure stockée sur le serveur SQL requêtes sera exécuté un jeux de résultats Seperated retournés, quelque chose comme:

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 

Vous pouvez également spécifier plusieurs requêtes avec

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

hav ing le; entre chaque requête, je ne suis pas sûr à ce sujet, je configure généralement un sproc