2016-02-11 2 views
0

Привет, У меня есть существующий лист Excel с некоторыми данными внутри, и теперь я хочу выполнять запросы непосредственно из VBA. Это то, что я сейчас:Excel VBA SQL-запрос ADODB

Private Sub CommandButton1_Click() 
Dim sSQLQry As String 
Dim ReturnArray 
Dim Conn As New ADODB.Connection 
Dim mrs As New ADODB.Recordset 
Dim DBPath As String, sconnect As String 
Dim newSheet As Worksheet 
'DBPath = ThisWorkbook.FullName 
DBPath = "C:\someData.xlsm" 
sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';" 
Conn.Open sconnect 
sSQLSting = "SELECT username,count(username) FROM [Sheet1$] group by username order by count(username) desc;" 
mrs.Open sSQLSting, Conn 
Set newSheet = Sheets.Add 
ActiveSheet.Range("A1").CopyFromRecordset mrs 
mrs.Close 
Conn.Close 
End Sub 

Этот запрос выполняет хорошо и дает желаемый результат, но когда я изменить его к этому:

Select param0,count(param0) From [Sheet1$] where eventid='addToCart' group by param0 order by count(param0) desc; 

Поскольку param0 как это: большинство из них являются номерами, но некоторые из них представляют собой числа и символы, смешанные вместе, поэтому результат запроса возвращает только записи чистого номера. Итак, как я могу настроить базу данных так, чтобы она распознавала поле param0, должно быть text, а не int? Кроме того, когда я выполняю этот запрос:

Select eventid,param0,param1,count(*) From [Sheet1$] where eventid='search' group by param0, param1 order by count(*) desc; 

Он дает «ошибку автоматизации». Я искал его, но не смог найти подходящее решение. Может кто-нибудь помочь с этим? Спасибо!

Редактировать: все три запроса дают правильные результаты в workbench MySQL. Теперь мне нужно выполнить запрос непосредственно в листе Excel.

ответ

1

Ваша вторая проблема заключается в том, что вы просите за поле кода события, не включая его в совокупности GROUP BY пункта.

SELECT eventid, param0, param1, count(*) 
    FROM [Sheet1$] 
    WHERE eventid='search' 
    GROUP by eventid, param0, param1 
    ORDER BY COUNT(*) DESC; 

Я запустил исправленные запросы по некоторым образцовым данным, которые я составил, и придумал это.

Sub grp_param() 
    Dim cnx As Object, rs As Object, rs1 As Object 
    Dim sWS1 As String, sWS2 As String, sWB As String, sCNX As String, sSQL As String 
    Dim ws1TBLaddr As String 

    ws1TBLaddr = Worksheets("Sheet4").Cells(1, 1).CurrentRegion.Address(0, 0) 
    sWS1 = Worksheets("Sheet4").Name 

    sWB = ThisWorkbook.FullName 
    'for 64-bit Office 
    'sCNX = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" & sWB _ 
     & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 
    'for 32-bit or 64-bit Office 
    sCNX = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sWB _ 
     & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 
    Debug.Print sCNX 

    Set cnx = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 
    Set rs1 = CreateObject("ADODB.Recordset") 

    cnx.Open sCNX 

    'Select param0,count(param0) From [Sheet1$] where eventid='addToCart' 
    ' group by param0 order by count(param0) desc; 
    sSQL = "SELECT param0, COUNT(param0) " & _ 
      "FROM [" & sWS1 & "$" & ws1TBLaddr & "] " & _ 
      "GROUP BY param0 " & _ 
      "ORDER BY count(param0) DESC;" 
    Debug.Print sSQL 

    rs.Open sSQL, cnx 

    With Worksheets.Add(after:=Sheets(Sheets.Count)) 
     .Name = "Summary Data" 
     .Range("A1").Resize(1, 2) = Array("param0", "count") 
     .Range("A2").CopyFromRecordset rs 
    End With 

    'Select eventid,param0,param1,count(*) From [Sheet1$] where eventid='search' 
    'group by param0, param1 order by count(*) desc; 
    sSQL = "SELECT eventid, param0, param1, COUNT(*) " & _ 
      "FROM [" & sWS1 & "$" & ws1TBLaddr & "] " & _ 
      "GROUP BY eventid, param0, param1 " & _ 
      "ORDER BY count(param0) DESC;" 
    Debug.Print sSQL 

    rs1.Open sSQL, cnx 

    With Worksheets(Sheets.Count) 
     .Range("E1").Resize(1, 3) = Array("eventid", "param0", "count") 
     .Range("E2").CopyFromRecordset rs1 
    End With 

    rs.Close: Set rs = Nothing 
    rs1.Close: Set rs1 = Nothing 
    cnx.Close: Set cnx = Nothing 

End Sub 

Я неясно, почему MySql допускает, что последний запрос, но мой фон находится в T-SQL, и было бы, конечно, задушить на этом.

+0

Спасибо! Я удалил первый eventid, а затем он работает. – richards

0

Для первого путаницы я заметил сообщение здесь: link, но я не хочу добавлять в другой файл для обработки, поэтому в конце концов нет другого выбора, я предварительно обрабатываю файл, добавляя в 4 строки текстов прямо под линией заголовка. (Как и в моем случае все поля могут быть текстовыми, я сделал это в MySQL). Поскольку количество данных довольно велико, эти фиктивные тексты не влияют на результат, но помогают мне правильно создавать БД.