{Excel/Access/VBA] Met VBA een Access database benaderen

Pagina: 1
Acties:
  • 859 views sinds 30-01-2008
  • Reageer

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 06:41
Goedenavond,

Ik zit hier nu al 2 avonden mee te pielen, en het wil maar niet.. |:(

Wat wil ik:
Ik heb een Excel document, en daarin wil ik aan de hand van wijzingen van bepaalde cellen data naar een Access database schrijven of eruit halen (query's verzenden dus). Deze Access database staat gewoon heel simpel in dezelfde map, en is erg simpel. Ik wil de database kunnen benaderen via VBA, omdat ik dan de gegevens uit de database kan 'analyseren' en aan de hand daarvan bepaalde acties kan uitvoeren. Ik wil dus niet een 'standaard-wizard-koppeling' die je handmatig moet vernieuwen.

Kleine maaarr:
Het moet werken in Office 97 (draait op locatie), en ik heb zelf Office 2007. Werkt niet altijd even handig zo, maar ik ben hard op zoek naar een Office 97 cd'tje ;)

Wat heb ik:
Niet veel :+
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Worksheet_Change(ByVal Target As Range)
  
    If Target.Address = "$A$6" Or Target.Address = "$B$6" Then
        Dim strSQL As String
        
        strSQL = "INSERT INTO Vuller" & vbCrLf
        strSQL = strSQL & "FIELDS (Id, Naam, Data)" & vbCrLf
        strSQL = strSQL & "VALUES(3, Hans, Blaa)" & vbCrLf
        
        Dim db As DAO.Database
        Set db = DBEngine.Workspaces(0).OpenDatabase("C:\dev\ah\test.mdb")
        docmd.setwarnings False
        db.Execute strSQL, dbFailOnError
        docmd.setwarings True

        Set Test = Nothing
    End
End Sub


Met bovenstaande code opent ie de database dus niet, en geeft een error "Kan database niet vinden" oid. Geeft deze error bij zowel relatieve als harde verwijzing.Ik heb begrepen dat het in dit geval het beste is om de koppeling middels DAO te doen. Ik heb deze library geactiveerd en werkend.

Hoe kan ik het beste vanuit excel een Access database benaderen via VBA? (Werkend onder office 97)

Alvast bedankt! :*)

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Clock schreef op maandag 30 april 2007 @ 22:32:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Worksheet_Change(ByVal Target As Range)
  
    If Target.Address = "$A$6" Or Target.Address = "$B$6" Then
        Dim strSQL As String
        
        strSQL = "INSERT INTO Vuller" & vbCrLf
        strSQL = strSQL & "FIELDS (Id, Naam, Data)" & vbCrLf
        strSQL = strSQL & "VALUES(3, Hans, Blaa)" & vbCrLf
        
        Dim db As DAO.Database
        Set db = DBEngine.Workspaces(0).OpenDatabase("C:\dev\ah\test.mdb")
        docmd.setwarnings False
        db.Execute strSQL, dbFailOnError
        docmd.setwarings True

        Set Test = Nothing
    End
End Sub


Met bovenstaande code opent ie de database dus niet, en geeft een error "Kan database niet vinden" oid.
Een oid kan van alles zijn, heb je een exacte foutmelding? :?
Wat ik ook niet helemaal snap is waarom je in Office 2007 werkt, terwijl je wilt dat het ook in Office 97 werkt?

Is er misschien geen optie, om die locatie over te laten stappen? IMO is Office 97 erg outdated.
Heb je trouwens al naar de mogelijkheden gekeken van ODBC?

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 06:41
Om even iets nauwkeurig te zijn idd. Met de volgende code (nieuwe database gemaakt):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$5" Or Target.Address = "$B$5" Then
        ActiveWorkbook.RefreshAll
    End If
    
    If Target.Address = "$A$6" Or Target.Address = "$B$6" Then
        'Dim db As database
        Dim strSQL As String
        
        strSQL = "SELECT * From vuller" & vbCrLf
        'strSQL = strSQL & "FIELDS (Id, Naam, Data)" & vbCrLf
        'strSQL = strSQL & "VALUES(5, Douwe, fdfdfdf)" & vbCrLf
        
        Dim db As DAO.Database
        Set db = DBEngine.Workspaces(0).OpenDatabase("C:\Vulplanning\database.mdb")
        db.Execute strSQL, dbFailOnError

        Set db = Nothing
    End If
End Sub


Krijg ik de volgende error (in excel): Fout 3065 tijdens uitvoering. Kan geen selectiequery uitvoeren.

Het is idd wat lastig dat het met office 2007 moet, maar ik kan daar natuurlijk ook nog het een en ander aanpassen. En het gaat uiteindelijk allemaal om de DAO koppeling, en die was er in office 97 ook al wel. Overigens sla ik de access database en exel file wel op als een 97-2000 file.

Mogelijkheden om over te stappen zijn er niet, ligt niet binnen bereik. Ik ben niet bekend met manieren om deze koppeling te maken met ODBC, ik zal eens gaan googlen.

[ Voor 6% gewijzigd door Clock op 30-04-2007 22:45 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

De melding geeft het al aan: db.execute is niet geschikt om een select query uit te voeren. db.execute kan wél insert en delete querys uitvoeren.
Met dao worden recordset opgehaald dmv set rs = db.openrecordset(strSql)

Maw als je teruggaat naar je oorspronkelijke code, domweg goed controleert of de database wel bestaat in dat pad dat zou het zonder problemen moeten werken, mits je die rare en overbodige crlf uit je sqlstring weglaat / vervangt door spaties ;)

En nog wat: in excel zal een docmd zonder verdere verwijzing ook wel een compile-error opleveren. Comment die ook voor het debuggen maar even uit :)

[ Voor 48% gewijzigd door Lustucru op 30-04-2007 22:53 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Clock
  • Registratie: Maart 2005
  • Laatst online: 06:41
Werkend! Geweldig, bedankt voor de hulp. Achteraf gezien allemaal domme fouten natuurlijk.

Voor de mensen die hier later wellicht ooit eens terugkijken op zoek naar een oplossing:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        ActiveWorkbook.RefreshAll
    End If
    
    'Database openen
    Dim db As DAO.Database
    Set db = DBEngine.Workspaces(0).OpenDatabase("C:\Vulplanning\database.mdb")
    
    
    If Target.Address = "$A$6" Then
        'Query maken
        Dim strSQL1 As String
        strSQL1 = "INSERT INTO vuller (Naam, Data) VALUES('Dosddsauwe', 'fdfdsadfdf')"
        
        'Query naar database schoppen
        db.Execute strSQL1, dbFailOnError
    End If
    
    If Target.Address = "$A$5" Then
        'Query maken
        Dim strSQL2 As String
        strSQL2 = "SELECT * FROM vuller"
        
        'Query naar database schoppen
        Set rs = db.OpenRecordset(strSQL2)
    End If
    
    'Database afsluiten
    Set db = Nothing
End Sub


Ondersteund Office 97 ook ADO al? Ik lees hier dat dat behoordelijk de voorkeur heeft boven DAO. Is het verstandig dit te gebruiken?

Verwijderd

zowel ADO als DAO maken deel uit van ms's MDAC, wat wil zeggen dat deze componenten ook zonder office installatie standaard in windows aanwezig en benaderbaar zijn. DAO is het "meest native" -als je het zo kan uitdrukken- om een access database te benaderen, bovendien werd deze component opgefrist in office 2007.
Pagina: 1