Toon posts:

[VBA] Lus voor het invoeren van records

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

Verwijderd

Topicstarter
Hallo mensen,

Ik heb een Excel sheet die ik gelinkt heb in Access 2000, maar door de opbouw van deze sheet kan ik het niet direct importeren. Namelijk de sheet heeft de opbouw in rijen in plaats van in kolommen zodat Access dat wil. Nu heb ik dit opgelost door VBA code achter een invoer formulier te zetten die de waardes in de Excel sheet af te gaan en daarna in het juiste veld in te vullen. Maar mijn probleem is nu dat ik maar een record te gelijk kan invoeren. Ik wil eigenlijk dat de gehele sheet wordt afgegaan naar record zodat alles wordt ingevoert in plaats van elke keer 1. Een lus dus, maar ik weet niet hoe ik dat moet aanpakken. Ik een voorbeeld van mijn code die ik nu heb:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Private Sub Form_Timer()
'foutafhandeling
    On Error GoTo Fout
  
'Declareer variabelen
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb()
    Dim sql As String
    Dim Waarde As Single 'zet de date/time velden van de Excel Sheet om in numerieke waarde.

'neem mbv SQL de importdata
    sql = "SELECT Import_Data.F2 FROM Import_Data;"
                
    Set rs = db.OpenRecordset(sql, dbOpenDynaset)

'deze functie gaat naar het record waar de waarde in staat, en plaatst deze in het form.
    'ga naar 8e record (date)
        rs.Move 7
        Me.Date.Value = rs!F2.Value
        
    'ga naar 9e record (time)
        rs.MoveNext
        Me.Time.Value = rs!F2.Value
           
    'ga naar 14e record (Conveyor)
        rs.Move 5
        Waarde = rs!F2.Value
        Me.Conveyor.Value = Waarde

        enzovoort, totdat de alle waardes zijn afgegaan.

'controleer of deze meting nog niet voorkomt in de tabel met meetgegevens
        Dim DateTime As String
        Dim Toegevoegd As Byte
        DateTime = Me.Date.Value & Me.Time.Value
        
 'maak een recordset aan die met als criteria de date en time van het form
            Dim Dbs As DAO.Database
            Set Dbs = CurrentDb()
            Dim Rst As DAO.Recordset
            Dim SQL2 As String
                   
            SQL2 = "SELECT [Date] & [time] AS Uniek FROM Meetdata " & _
                    "WHERE (([Date] & [time])='" & DateTime & "');"

            Set Rst = Dbs.OpenRecordset(SQL2, dbOpenDynaset)
        
        'tel aantal records, als nul, dan bestaat nog niet, anders bestaat wel
            If Rst.RecordCount > 0 Then
                'dit record bestaat al, undo de record
                    DoCmd.RunCommand acCmdUndo
                    Toegevoegd = 0
            Else
                'dit record bestaat nog niet, sla op
                    DoCmd.RunCommand acCmdSaveRecord
                    Toegevoegd = 1
            End If


De records staan in kolommen genaamd F met de opvolgende nummer, dus F2,F3,F4 enz (F1 heb ik niet nodig). Ik ben nieuw in VBA en op GoT en ik heb van mensen dat ze hier kunnen helpen. Weet iemand een oplossing voor mijn probleem?

Bedankt,

Martijn

[ Voor 4% gewijzigd door Verwijderd op 24-06-2003 08:41 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Als eerste: welkom op GoT :)

Om je probleem op te lossen, een aantal tips, zodat het voor iedereen wat duidelijker wordt.

1. Zet eens [code=vba][/code] -tags om je code heen. Je code wordt dan automatisch van een opmaak voorzien, welke wat duidelijker is. Je kan je post aanpassen met behulp van het Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif-knopje, rechts boven je post.
code:
1
' Stukje code


2. On Error GoTo Fout, sloop deze er eens uit. :) Met debuggen is het erg lastig met foutafhandeling. Bij fouten zie je nu direct waar het fout gaat en met welke regel.

3. Je zegt van: "Het lukt me niet?" Kan je misschien ook een stukje code geven van wat je hebt geprobeerd? Misschien ben je al heel dicht bij, en kan je met enkele hints zelf het laatste stukje ook aanpassen. :) Ook graag de foutmeldingen die je er evt. bij kreeg.

[ Voor 23% gewijzigd door gorgi_19 op 24-06-2003 08:33 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Welkom.

Als ik je probleem even mag ophakken in kleinere stukjes.

1. Je wilt een Excelsheet importeren maar die is verkeerd om opgebouwd (ofzo). Kan je die sheet niet copy, special paste, transponeren. Dan staat de boel weer goed en kan je het importeren.

2. Je wilt controleren of het record al bestaat. En dat werkt volgens mij?

3. Stel dat het transponeren niet kan/mag/wat dan ook, dan zou je inderdaad een loop kunnen maken:
Visual Basic:
1
2
3
4
5
6
7
Dim arrValues(10) as Variant 

do while not rs.eof
     intCnt = intCnt + 1
     rs.movenext
     arrValues(intCnt) = rs2!F2.Value
loop

En ga dan verder zoals je ook verder ging en gebruik nu inplaats waarden uit het form waarden uit de array. Voor de show zou je het form nog kunnen vullen....

btw Welkom op GoT! :)

Verwijderd

Topicstarter
Bedankt voor het snel reageren. Als antwoord op gorgi_19 geef ik bij deze code.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
'Declareer variabelen
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb()
    Dim sql As String
    Dim Waarde As Single 'zet de date/time velden van de Excel Sheet om in numerieke waarde.
    Dim Kolom, Recordnr As Integer
                        
'neem mbv SQL de importdata
                    
    Kolom = 1
    Recordnr = 1
                
    Set rs = CurrentDb.OpenRecordset("Import_data")
          
With rs
          
'deze functie gaat naar het record waar de waarde in staat, en plaatst deze in het form.
    
    Do Until .EOF
        Do Until Recordnr = .Fields.Count
    
    'ga naar 8e record (date)
        rs.Move 7
        Me.Date.Value = .Fields(Kolom).Value
        
    'ga naar 9e record (time)
        rs.MoveNext
        Me.Time.Value = .Fields(Kolom).Value
           
    'ga naar 14e record (Conveyor)
        rs.Move 5
        Waarde = .Fields(Kolom).Value
        Me.Conveyor.Value = Waarde

'controleer of deze meting nog niet voorkomt in de tabel met meetgegevens
        Dim DateTime As String
        Dim Toegevoegd As Byte
        DateTime = Me.Date.Value & Me.Time.Value
        
        'maak een recordset aan die met als criteria de date en time van het form
            Dim Dbs As DAO.Database
            Set Dbs = CurrentDb()
            Dim rst As DAO.Recordset
            Dim SQL2 As String
                   
            SQL2 = "SELECT [Date] & [time] AS Uniek FROM Meetdata " & _
                    "WHERE (([Date] & [time])='" & DateTime & "');"

            Set rst = Dbs.OpenRecordset(SQL2, dbOpenDynaset)
        
        'tel aantal records, als nul, dan bestaat nog niet, anders bestaat wel
            If rst.RecordCount > 0 Then
                'dit record bestaat al, undo de record
                    DoCmd.RunCommand acCmdUndo
                    Toegevoegd = 0
            Else
                'dit record bestaat nog niet, sla op
                    DoCmd.RunCommand acCmdSaveRecord
                    Toegevoegd = 1
                    DoCmd.RunCommand acCmdRecordsGoToNew
            End If
            Kolom = Kolom + 1
        Loop
        Recordnr = Recordnr + 1
        Kolom = 1
        
    Loop
End With


Ik wil als hij alle waarde heeft ingevult naar de volgende kolom en dan weer alle waardes afgaat totdat er geen kolommen meer zijn. Als de loop opnieuw begon dan kreeg ik bij de eerste waarde de null value en kreeg ik de foutmelding "invalid use of Null value". Dus code gaat alle records af in de gelinkte sheet, maar daarna moet deze naar de andere kolom springen(van F2 naar F3 bijvoorbeeld) en weer de records afgaan.

En nog bedankt voor de welkom. :)

[ Voor 5% gewijzigd door Verwijderd op 24-06-2003 09:24 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

modbreak: lees gorgi z'n 1e puntje nog eens ;) tevens mag iets minder code wel, probeer het te beperken tot het relevante. onthoud: hoe meer code je post hoe minder geneigd andere mensen zijn om er de tijd in de steken om het helemaal door te lezen. en natuurlijk vanuit de crew ook welkom op GoT :Y)

Professionele website nodig?


Verwijderd

Topicstarter
modbreak: lees gorgi z'n 1e puntje nog eens tevens mag iets minder code wel, probeer het te beperken tot het relevante. onthoud: hoe meer code je post hoe minder geneigd andere mensen zijn om er de tijd in de steken om het helemaal door te lezen. en natuurlijk vanuit de crew ook welkom op GoT
k, bedankt ik zal het onthouden O-) . Ik ben zelf ook bezig met een andere oplossing voor het probleem. Als iemand interesse heeft post ik dat stukje wel.

[ Voor 53% gewijzigd door Verwijderd op 24-06-2003 10:46 ]


Verwijderd

Topicstarter
Ben nu met een andere oplossing bezig, maar deze moet werken afgezien van 1 probleem. Hier snel een stukje van de code:

code:
1
2
3
4
5
6
7
8
9
10
11
Dim Kolomnummer As Integer
    Dim Kolomletter As String
    
    Kolomletter = "F"
    Kolomnummer = 2
       
    
'neem mbv QSL de importdata
    sql = "SELECT Import_Data." & Kolomletter & "" & Kolomnummer & " FROM Import_Data;"
                
    Set rs = db.OpenRecordset(sql, dbOpenDynaset)


Zoals je kunt zien heb ik de kolomnummer variable gemaakt en de kolomletter de vaste waarde F. De set rs ziet het sql gedeelte met de juiste start waarde van F2, dus elke keer als ik de lus doorloop wordt de kolomnummer opgewaardeerd met 1. Maar het eigenlijke probleem komt nu:

code:
1
Me.Date.Value = rs!F2.Value


In de eerste post kon je zien dat ik gewoon F2 heb neergezet, maar nu moet deze ook variabel zijn (de F2 van rs!F2.Value dus)met de kolomletter en kolomnummer. Maar elke keer als iets probeer krijg ik een "type mismatch error" of "Item not found in this collection". Hoe moet de code omzetten, want ik weet de correcte syntax niet?

Eigelijk is dit het programma voor de gek houden maar het moet werken. Dit is nog het enigste wat ik voor mijn stage moet doen en dan is mijn applicatie klaar.

edit:

Als ik niet duidelijk ben moet je het maar zeggen.



groet

[ Voor 20% gewijzigd door Verwijderd op 24-06-2003 12:50 ]

Pagina: 1