Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2014-09-20 13:48:20

  HAL9000 - Użytkownik

HAL9000
Użytkownik
Zarejestrowany: 2006-04-22

VBA i SQL

Witam
Nie wiem czy to jest właściwe forum na pytania o technologie MS ale na chwilę obecną nie mam konta na żadnym związanym z windowsami ;-)
Obiecałem kogoś nauczyć tworzenia makr dla excela przeczytałem sobie to poniżej i język jak język odrobinę dziwna składnia ale do zrozumienia
http://msdn.microsoft.com/en-us/library/ee441152%28v=office.12%29.aspx
tutaj natomiast jest excel object model czasami się tam gubię ale też do zrozumienia do czego jeszcze wrócimy ;-)
http://msdn.microsoft.com/en-us/library/bb149081.aspx
ale jak to zwykle bywa gdy zabieram się za coś konkretnego i wymagającego użycia biblioteki a nie tylko samego języka to kończy się nieciekawie.

Chciałem pobrać jakieś dane z bazy mysql znalazłem to http://stackoverflow.com/questions/13558921/how-can … base-in-excel
następnie zainstalowałem to http://dev.mysql.com/downloads/connector/odbc/ bo doszedłem do wniosku, że jest potrzebne ;-)

Stworzyłem coś takiego

Kod:

Option Explicit

Sub getDataFromDataBase()
    Dim con As Object, rs As Object 'con to jakiś tam obiekt polaczenia a rs obiekt recordset jak opisane tutaj http://www.w3schools.com/asp/ado_intro.asp
    Set con = CreateObject("ADODB.Connection")
    Dim conArgs As String
    conArgs = "DRIVER={MySQL ODBC 5.3.4 Driver};" & _
                "SERVER=localhost;" & _
                "DATABASE=vba;" & _
                "USER=tomasz;" & _
                "PASSWORD=pass123;" & _
                "OPTION=3"
    'MsgBox conArgs
    
    On Error GoTo SQLCONERROR
    con.Open conArgs
    con.Close
    
SQLCONERROR:
    Dim ce As Object
    For Each ce In con.Errors
        MsgBox ce
    Next ce
End Sub

Oczywiście jest tutaj tylko próba (nieudana) połączenia nad pobieraniem danych posiedzę później.
Powyższy kod skutkuje następującym komunikatem (to jest ta część po etykiecie sqlconerror)

Kod:

[Microsoft][Menedżer sterowników ODBC] Nie można odnaleźć nazwy źródła danych, a nie ma podanego sterownika domyślnego

Teraz nie wiem czy ten sterownik mysql odbc jest zainstalowany poprawnie gdyż w panelu sterowania -> narzędzia administracyjne -> odbc nie ma nic związanego z mysql ani na liście ani po kliknięciu opcji dodaj, gdzie jest tylko sql server od ms i nie wiem czy ten instalator od mysql odbc robi coś źle czy trzeba jakie dodatkowe usługi windows uruchomić aby cokolwiek zaczęło działać.
Mysql odbc zainstalowało się w jakimś katalogu w program files, którego nie zmieniałem zostało tak jak chciał instalator i nie wiem czy mam próbować dodawać do zmiennej path bo tutaj (http://dev.mysql.com/doc/refman/5.0/es/myodbc-insta … y-windows-dll ) pisze, że niby instaluje do windows\system32 i rejestruje wszystkie potrzebne składniki (cokolwiek to znaczy) i już sam nie wiem gdzie mam szukać błędu.

MySQL w wersji 5.5.34 z jakiegoś xampp działa jak należy z "czarnego okienka" (cmd) mogę sobie tworzyć bazy, tabele itd.


For some reason I'm thinking I'm still 25 but I act like I'm 12.

Offline

 

#2  2014-09-20 14:55:02

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: VBA i SQL

Strzał: masz do źródło dodane w źródłach danych OBDC w Narzędziach Administracyjnych? IMO powinno być dodane bo to się tak fajnie dubluje ;)

Offline

 

#3  2014-09-20 15:24:34

  HAL9000 - Użytkownik

HAL9000
Użytkownik
Zarejestrowany: 2006-04-22

Re: VBA i SQL

Możesz jaśniej?
Wspominałem już że na liście "składników" do dodania nie ma nic co chociażby trochę przypominało mysql -> http://www.h9k.republika.pl/odbc.png jeżeli o to chodzi. Nie wiem czy to niewłaściwy plik pobrałem czy ( http://dev.mysql.com/downloads/connector/odbc/ ) ale nie ma tam nic na tej liście do dodania chyba, że to nie to okienko.



Edycja:
Zainstalowałem wersje x64 i w końcu się pojawiło na liście, dodałem źródła do tego connectora ale w tym "programiku" vba dalej ten sam błąd.

Ostatnio edytowany przez HAL9000 (2014-09-20 15:35:53)


For some reason I'm thinking I'm still 25 but I act like I'm 12.

Offline

 

#4  2014-09-20 16:30:59

  Lorenzo - Moderator

Lorenzo
Moderator
Zarejestrowany: 2005-12-23

Offline

 

#5  2014-09-20 17:10:15

  HAL9000 - Użytkownik

HAL9000
Użytkownik
Zarejestrowany: 2006-04-22

Re: VBA i SQL

Nie wiem albo ja jestem niepełnosprytny (dość prawdopodobne) albo coś jest nie tak nie wiem z czym
Kod:

Kod:

Option Explicit

Public Sub getDataFromDatabase()
    Dim con As Object, rs As Object
    Dim conArgs As String, queryStr As String
    queryStr = "SELECT userName FROM vba WHERE userID = 1"
    conArgs = "DRIVER={MySQL ODBC 5.3 Unicode Driver};" & _
                "USER=root;" & _
                "PASSWORD=;" & _
                "DATABASE=vba;" & _
                "PORT=3306;" & _
                "OPTION=3;"
                
    'MsgBox conArgs
    'ThisWorkbook.Sheets(1).Cells(1, 1).Value = conArgs
    
    Set con = CreateObject("ADODB.Connection")
    On Error GoTo SQLERRORS
    
    con.Open conArgs
    con.Close
    con = Nothing
    
    
SQLERRORS:
    Dim ce As Object
    For Each ce In con.Errors
      MsgBox ce
    Next ce

Ustawienia
http://www.h9k.republika.pl/odbc.png
Skutek
http://www.h9k.republika.pl/error.png


Dodane
Szukam i szukam w sieci w czym moze byc problem i gdzieś tam ktoś pisał, że architektura tego sterownika mysql powinna być identyczna jak excela, ustaliłem, że excel jest 32bitowy a mysql odbc x64 bo jak już wspomniałem tego 32bitowego w ogóle nie było można dodać w tym okienku od odbc w narzędziach administracyjnych ma to jakikolwiek sens? I co ewentualnie zrobić aby ta 32bitowa wersja była widoczna aby na początek można ją było dodać do źródeł.

Ostatnio edytowany przez HAL9000 (2014-09-20 18:19:07)


For some reason I'm thinking I'm still 25 but I act like I'm 12.

Offline

 

#6  2014-09-21 14:27:45

  Lorenzo - Moderator

Lorenzo
Moderator
Zarejestrowany: 2005-12-23

Re: VBA i SQL

Sprawdź kod na bazie accesowej, wtedy będzie jasne czy to problem kodu czy bazy

Offline

 

#7  2014-09-21 15:05:02

  HAL9000 - Użytkownik

HAL9000
Użytkownik
Zarejestrowany: 2006-04-22

Re: VBA i SQL

Z accessem działa bez problemu ale tam jest zupełnie inny "connectionstring"

Kod:

Option Explicit

Dim DataBaseCon As Object
Dim RstUsers As Object

Public Sub main()
    Dim QueryString As String
    QueryString = "SELECT * FROM Users"
    Dim ConState As Integer
    ConState = OpenDataBaseConnection()
    
    If ConState Then
        MsgBox "Nie udalo sie nawiazac polaczenia z baza " & ConState
        Exit Sub
    End If
    Set RstUsers = CreateObject("ADODB.Recordset")
    RstUsers.Open QueryString, DataBaseCon
        MsgBox RstUsers.RecordCount
    
    Dim wyniki As Variant
    wyniki = RstUsers.GetRows()
    
    Dim r As Integer, c As Integer
    If RstUsers.RecordCount <> 0 Then
        For r = 0 To UBound(wyniki, 2)
            For c = 0 To UBound(wyniki, 1)
                ThisWorkbook.Sheets(1).Cells(r + 1, c + 1).Value = wyniki(c, r)
            Next c
            
        Next r
    End If
    
        
    
    RstUsers.Close
    Set RstUsers = Nothing
    
    Call CloseDataBaseConnection
       
    
End Sub

Private Function OpenDataBaseConnection() As Integer
    
    Set DataBaseCon = CreateObject("ADODB.Connection")
    Dim ConString As String
    ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=J:/excel2010/Simple.accdb;" & _
                        "Persist Security Info=False;"
    
    On Error GoTo SQLCONHANDLER
    
    DataBaseCon.Open ConString
    DataBaseCon.cursorlocation = 3
    If DataBaseCon.State = 1 Then
        OpenDataBaseConnection = 0
        'Exit Function
    End If
    
    OpenDataBaseConnection = 1
    Exit Function
    
    
SQLCONHANDLER:

    If Not DataBaseCon Is Nothing Then
        If DataBaseCon.State = 1 Then DataBaseCon.Close
    End If
    Set DataBaseCon = Nothing
    Dim ce As Object
    For Each ce In DataBaseCon.Errors
        MsgBox ce
    
    Next ce

End Function


Private Function CloseDataBaseConnection()
    On Error Resume Next
    DataBaseCon.Close
    Set DataBaseCon = Nothing
End Function

I jeszcze takie pytanie bo niby doszedłem jak to ładnie "ułożyć" w komórkach excela ale niemniej nie wiem czy dobrze to zrozumiałem

The first subscript identifies the field and the second identifies the record number

to z metody getrows czyli jeżeli w w tabeli sql dane sa w formacie
id | imie | adres
------------------
1  | jas   | krakow
2  |karol | warszawa
to ten 1 wiersz z bazy jest zwracany jako kokumna?
Bo niby RecordCount zwraca 2 ale ubound(wynik,1) zwraca 2 czyli niby 3 wiersz a ubound(wynik, 2) zwraca 1 czyli niby 2 kolumny chyba, że czegoś tutaj nie zrozumiałem.


For some reason I'm thinking I'm still 25 but I act like I'm 12.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)