Count records van RecordSet (Excel - .mdb)

Status
Niet open voor verdere reacties.

Hankieh

Gebruiker
Lid geworden
14 jun 2010
Berichten
37
Hoi

In het verleden heb ik me vooral gefocust op PHP maar aangezien ik dat niet in mijn beroepsveld kan gebruiken heb ik mijn focus verlegd naar VBA.


In het project waar ik nu mee bezig ben, heb ik een recordset uit de database gehaald. Dit doe ik vanuit Excel, via VBA en de bron is een .mdb database. Dit gaat perfect.

Maar nou wil ik van deze recordset het aantal records tellen. Hier krijg ik telkens de waarde -1 op terug. Wat ik terug vond zou dit betekenen dat de RecordCount geen telling kan maken en daarom geeft hij -1 weer.
Ook vond ik ergens anders dat voor de RecordCount het definiëren van het rs.Open heel belangrijk is. Daarom denk ik dat in het volgende stukje code iets niet goed is ingesteld. Hoewel de recordset dus perfect word geprint.
Code:
                    rs.Open QueryInvoer, cn, , , adCmdText
Kan iemand mij verder helpen wat ik fout doe?

Alvast mijn dank,
Chris







Hieronder is het gehele stuk code.
Code:
                    Dim cn As Object, rs As Object
                    Dim DBFullName As String
                    Dim TargetRange As Range
                    IngevoerdeShirtnaam = Range("AY6").Value
                    Qry = "SELECT TOP 12 Id, Achternaam, Voornaam, Shirtnaam, Geboortedatum FROM spelers WHERE Shirtnaam Like '%" & IngevoerdeShirtnaam & "%' OR Achternaam Like '%" & IngevoerdeShirtnaam & "%' OR Voornaam Like '%" & IngevoerdeShirtnaam & "%' ORDER BY Shirtnaam"
                    DBFullName = ThisWorkbook.Path & "\Database002.mdb"
                    Application.ScreenUpdating = False
                    Set TargetRange = Sheets("Insert").Range("BF8")
                    Set cn = CreateObject("ADODB.Connection")
                    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & ADBFullNameF & ";"
                    Set rs = CreateObject("ADODB.Recordset")
                    rs.Open QueryInvoer, cn, , , adCmdText
                    Range("BG5").FormulaR1C1 = rs.RecordCount
                    TargetRange.Offset(0, 0).CopyFromRecordset rs
                    Application.ScreenUpdating = True
                    rs.Close
                    Set rs = Nothing
                    cn.Close
                    Set cn = Nothing
Mijn uiteindelijke doel is om 12 resultaten per pagina te krijgen. Ik wil via een RecordCount het totaal aantal krijgen om te berekenen om hoeveel pagina's het gaat. Dit wil ik doen via een vergelijkbare methode als LIMIT (uit SQL/PHP).
 
Code:
sub M_snb()
    With New Recordset
        .Open "SELECT * FROM Q_test", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\Access\fiets.mdb"
        sheet1.cells(1).copyfromrecordset .datasource
    End With

    For j = 13 To Sheet1.Cells(1).CurrentRegion.Rows.Count Step 12
        Sheet1.HPageBreaks.Add sheet1.Cells(j, 1)
    Next
End Sub
 
Laatst bewerkt:
Als je een recordset opent kun je de Recordcount eigenschap alleen goed gebruiken als je het juiste CursorType gebruikt. Bij het verkeerde type 'leest' de recordset niets uit, en krijg je de waarde -1. In dat geval kun je alsnog de recordcount property wel ophalen door eerst rs.MoveLast en rs.MoveFirst uit te voeren, dan weet de code ook wel weer hoeveel records er zijn. Maar dat kan bij grote tabellen een vertraging in de uitvoer van je code opleveren.
Beter is het dus om het CursorType wél mee te geven. Makkelijkste manier om te weten hoe is natuurlijk om je ADO objecten eerst op de juiste manier te declareren (zijnde Early binding)
Code:
''Dim cn As Object, rs As Object
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
Zodat je gebruik kunt maken van de IntelliSense van VBA. Dan zie je namelijk exact welke opties je kunt meegeven aan een recordset. Met deze instelling krijg je de RecordCount wél:
Code:
    rs.Open strSQL, cn, adOpenStatic, adLockReadOnly
Als alles naar het zin werkt, kun je de variabelen wel weer omzetten naar Late binding.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan