Excel VBA zu Access VBA konvertieren

Moderator: ModerationP

Excel VBA zu Access VBA konvertieren

Beitragvon <Raider> » 05. Okt 2019, 12:20

Moin zusammen,

ich habe VBA bisher nur in Excel benutzt. Allerdings wird Excel der Datenmenge nicht mehr gerecht und auch mein Makro genauso. Ich würde mich über eure Hilfe sehr freuen und hoffe, wir schaffen es, dass wir dieses Makro funktionell auf Access hinbekommen.

Die kompletten Daten habe ich bereits in Access importiert.

Ausgangspunkt ist ein Formular mit 21 Textfeldern:
- PSNR (für Palettenscheinnummer)
- LS1 bis LS20 (für Lieferscheinnummer)

Ich rufe also das Formular auf, gebe die Palettenscheinnummer ein und die dazugehörigen Aufträge. Ein Palettenschein pro Verladung, ein oder mehrere Lieferscheine pro Palettenschein. Nun soll das Makro beim klicken des Buttons die Palettenscheinnummer vor jeden gefundenen Lieferschein schreiben. Diese können auch mehrmals vorkommen (verschiede Palettentypen pro Auftrag). Am Ende soll nach der Palettenscheinnummer gefiltert werden.

Hier der Code:
Code: Alles auswählen
Private Sub CommandButton1_Click()
Dim zaehler1 As Integer
Dim AnzZeile As Integer
Dim zeile As Integer
Dim Wert As String
Dim Info As Byte

 

AnzZeile = Sheets("Sheet0").Cells(Rows.Count, 7).End(xlUp).Row 'letzte Beschriebene Zeile ermitteln
Sheets("Sheet0").Cells(2, 1).Select 'Zelle A2 auswählen
Application.ScreenUpdating = False
For zaehler1 = 1 To 20  'Schleife für alle Textboxen mit LS Nummern
    Me.Controls("LS" & CStr(zaehler1)) = Format(Right(Me.Controls("LS" & CStr(zaehler1)), 10), "0000000000")    'eingetragene Nummern 10-stellig machen
    Wert = Me.Controls("LS" & CStr(zaehler1)).Text  'Wert aus den Textboxen ermitteln
    If Left((Wert), 2) = "48" Then  'Abfrage ob PO-Nummer
        MsgBox ("Bitte die Eingaben der POs manuell machen. Danke")
        Exit Sub
    ElseIf Wert > "" Then   'Wenn Textbox gefüllt und keine PO
        For zeile = 2 To AnzZeile   'Schleife für die Zeilen
            If Sheets("Sheet0").Cells(zeile, 7).Text = Wert Then 'Prüfung nach passender LS Nr
                Sheets("Sheet0").Cells(zeile, 6).NumberFormat = "@" 'Palettenschein-Zeile als Text formatieren
                If Sheets("Sheet0").Cells(zeile, 6).Value > "" Then 'Prüfung ob Palettenscheinnr. leer
                    If Sheets("Sheet0").Cells(zeile, 6).Value <> PSNR.Text Then 'Abfrage, ob Palettenschein bereits gefüllt
                        Info = MsgBox("Zelle ist bereits mit einer anderen Palettenscheinnummer gefüllt! Wollen sie diesen Wert überschreiben? >>>" & Sheets("Sheet0").Cells(zeile, 6).Value & "<<<", vbYesNo, "Warnung")
                        Select Case Info
                            Case Is = vbYes
                                Sheets("Sheet0").Cells(zeile, 6).Value = PSNR.Text  'Falls bereits gefüllt und ersetzen geklickt, ersetzen
                        End Select
                    End If
                ElseIf Sheets("Sheet0").Cells(zeile, 6).Text = "" Then  'Wenn Palettenschein leer
                    Sheets("Sheet0").Cells(zeile, 6).Value = PSNR.Text  'eintragen
                End If
            End If
        Next
    End If
Next
 
Sheets("Sheet0").Range("$A$1:$X$594").AutoFilter Field:=6, Criteria1:=PSNR.Text 'Filtern nach Palettenschein Nummer
Application.ScreenUpdating = True
PSNR.Text = ""
LS1.Text = ""
LS2.Text = ""
LS3.Text = ""
LS4.Text = ""
LS5.Text = ""
LS6.Text = ""
LS7.Text = ""
LS8.Text = ""
LS9.Text = ""
LS10.Text = ""
LS11.Text = ""
LS12.Text = ""
LS13.Text = ""
LS14.Text = ""
LS15.Text = ""
LS16.Text = ""
LS17.Text = ""
LS18.Text = ""
LS19.Text = ""
LS20.Text = ""
Eintragungen.Hide
Sheets("Sheet0").Cells(2, 1).Select 'Zelle A2 auswählen
ActiveWindow.SmallScroll Down:=-30000

End Sub

Private Sub CommandButton2_Click() 'Button abbrechen
PSNR.Text = ""
LS1.Text = ""
LS2.Text = ""
LS3.Text = ""
LS4.Text = ""
LS5.Text = ""
LS6.Text = ""
LS7.Text = ""
LS8.Text = ""
LS9.Text = ""
LS10.Text = ""
LS11.Text = ""
LS12.Text = ""
LS13.Text = ""
LS14.Text = ""
LS15.Text = ""
LS16.Text = ""
LS17.Text = ""
LS18.Text = ""
LS19.Text = ""
LS20.Text = ""
Eintragungen.Hide

End Sub
MfG Daniel

Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
(Johann Wolfgang von Goethe)
Benutzeravatar
<Raider>
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1000
Registriert: 26. Jul 2006, 10:05
Wohnort: Niedersachsen

Re: Excel VBA zu Access VBA konvertieren

Beitragvon knobbi38 » 05. Okt 2019, 12:50

Hallo Daniel,

wie soll das gehen? Access verwendet zwar das gleiche VBA, aber das Objektmodell ist doch vollkommen anders. Excel ist eine Tabellenkalkulation und Access eine Datenbank. Beide basieren auf verschiedenen Paradigmen.
In Access müßtest du eine komplett neue Anwendung entwickeln.

Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1506
Registriert: 02. Jul 2015, 14:23

Re: Excel VBA zu Access VBA konvertieren

Beitragvon KlausMz » 05. Okt 2019, 15:57

Hallo,
- PSNR (für Palettenscheinnummer)
- LS1 bis LS20 (für Lieferscheinnummer)

In Access als Datenbank wären das 20 Datensätze für die 20 Lieferscheinnummern mit sich wiederholender Palettenscheinnummer.
Ggf. ist für die Paletten (mit Palettenscheinnummer) auch noch eine Tabelle erforderlich.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 39256
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Excel VBA zu Access VBA konvertieren

Beitragvon <Raider> » 05. Okt 2019, 16:57

Ich habe mir das in Access so vorgestellt:

1.) Eine Abfrage erstellen, die alle Lieferscheinnummern in der Userform rausfiltert (also die kompletten Datensätze).
2.) Die Palettenscheinnummer eintragen, sodass diese in der Haupttabelle steht
3.) In der úrsprünglichen Tabelle filtern nach Palettenscheinnummer

Ausnahme: Alle Lieferscheinnummern, die mit 48... beginnen. Hier sollte Schritt 2+3 entfallen. Trotzdem sollten dann Eintragungen dort in der Haupttabelle übernommen werden.

Sowas sollte doch möglich sein.
MfG Daniel

Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
(Johann Wolfgang von Goethe)
Benutzeravatar
<Raider>
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1000
Registriert: 26. Jul 2006, 10:05
Wohnort: Niedersachsen

Re: Excel VBA zu Access VBA konvertieren

Beitragvon <Raider> » 05. Okt 2019, 16:59

knobbi38 hat geschrieben:Hallo Daniel,

wie soll das gehen? Access verwendet zwar das gleiche VBA, aber das Objektmodell ist doch vollkommen anders. Excel ist eine Tabellenkalkulation und Access eine Datenbank. Beide basieren auf verschiedenen Paradigmen.
In Access müßtest du eine komplett neue Anwendung entwickeln.

Ulrich


Genau deswegen steige ich bei in Access noch nicht durch. Ich kann mit simplen Methoden so ziemlich alles in Excel programmieren, habe aber keine Ahnung, wie das in Access funktioniert...
MfG Daniel

Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
(Johann Wolfgang von Goethe)
Benutzeravatar
<Raider>
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1000
Registriert: 26. Jul 2006, 10:05
Wohnort: Niedersachsen

Re: Excel VBA zu Access VBA konvertieren

Beitragvon KlausMz » 05. Okt 2019, 18:28

Hallo,
habe aber keine Ahnung, wie das in Access funktioniert...
Access funktioniert völlig anders als Excel. Von Deinen VBA Kenntnissen wirst Du bei Access so gut wie nichts verwenden können. Allenfalls die Kontrollstrukturen sind vergleichbar, wie z.B. For...Next, Select Case ... usw.
Auch die Tabellen selbst erfordern einen völlig anderen Aufbau als in Excel.
In Access gibt es keine Aufzählungsfelder (LS1 bis LS20).
Die Lieferscheinnummern müssen in eine extra Tabelle als je ein Datensatz und keine 20 Felder wie ich das bereits weiter oben schrieb.
Du wirst auch weitere Tabellen benötigen (z.B. Aufträge).
Access muss man lernen, da kann man nicht einfach mal so beginnen.

Besonders bei einer größeren Datenmenge (was ja der Grund für den Umstieg ist) wirst Du um ein ordentliches Datenmodell nicht herum kommen.
Stichwort: Normalisierung
Hier 2 Links dazu:
Erst mal graue Theorie:
https://www.hdm-stuttgart.de/~riekert/lehre/db-kelz/
Und hier etwas mehr Praxis bezogen:
https://www.access-tutorial.de/
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 39256
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Excel VBA zu Access VBA konvertieren

Beitragvon knobbi38 » 05. Okt 2019, 18:40

Hallo Daniel,

Genau deswegen steige ich bei in Access noch nicht durch

Das läßt sich alles lernen, aber dieser Schritt steht am Anfang und "learning by doing" funktioniert bei Datenbanken nur mit Frustration, insbesondere dann, wenn versucht wird, daß bisher erlernte von Excel auf Access übertragen zu wollen (VBA Syntax mal ausgenommen).

Wenn du das stemmen möchtes, greife zu eine guten Buch und schaue dir dort die Kapitel über Datenmodellierung, Normalisierung usw. an, bevor du auch nur ansatzweise über Formulare usw. nachdenkst. Gerade diese funktionieren in Access komplett anders als in Excel.

Vielleicht als Einstiegs:
du möchtest Aufträge, Paletten, Palettentypen und Lieferscheine verwalten (wo sind eigentlich die Kunden?). Nehme einmal diese Komponenten und setze sie zueinander in Beziehung. Das sind so die ersten gedanklichen Schritte um sich einem Datenmodell zu nähern.
und hier geht es dann weiter: http://www.office-loesung.de/ftopic318127_0_0_asc.php

Ulrich
Zuletzt geändert von knobbi38 am 14. Okt 2019, 13:34, insgesamt 1-mal geändert.
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1506
Registriert: 02. Jul 2015, 14:23

Re: Excel VBA zu Access VBA konvertieren

Beitragvon <Raider> » 14. Okt 2019, 13:22

Also dieses Makro habe ich nun fertig konvertiert, falls es euch interessiert:

Code: Alles auswählen
Private Sub CommandButton1_Click()
Dim zaehler1 As Integer
Dim AnzZeile As Integer
Dim Schein As String
Dim Wert As String
Dim Info As Byte
Dim dbsKonto As DAO.Database
Dim rstDaten As DAO.Recordset
 
   Set dbsKonto = CurrentDb
   Set rstDaten = dbsKonto.OpenRecordset("Daten")
   Schein = PSNR.Text
   
 
For zaehler1 = 1 To 20 'Schleife für Textboxen
    Me.Controls("LS" & CStr(zaehler1)) = Format(Right(Me.Controls("LS" & CStr(zaehler1)), 10), "0000000000")    'eingetragene Nummern 10-stellig machen
    Wert = Me.Controls("LS" & CStr(zaehler1)).Text  'Wert aus den Textboxen ermitteln
    If Left((Wert), 2) = "48" Then  'Abfrage ob PO-Nummer
        MsgBox ("Bitte die Eingaben der POs manuell machen. Danke")
        Exit Sub
    ElseIf Wert > "" Then   'Wenn Textbox gefüllt und keine PO
        rstDaten.MoveFirst
        Do Until rstDaten.EOF
            If rstDaten!Referenz = Wert Then
                rstDaten.Edit
                If rstDaten!Palettenscheine > "" Then 'prüfen ob Palettenscheinnummer fehlt
                    If rstDaten!Palettenscheine <> Schein Then 'Abfrage ob Palettenschein bereits gefüllt
                        Info = MsgBox("Zelle ist bereits mit einer anderen Palettenscheinnummer gefüllt! Wollen sie diesen Wert überschreiben? >>>" & rstDaten!Palettenscheine.Value & "<<<", vbYesNo, "Warnung")
                        rstDaten!Palettenscheine = Schein
                        rstDaten.Update
                        Select Case Info
                            Case Is = vbYes
                                With rstDaten
                                    .Edit
                                    rstDaten!Palettenscheine = Schein 'Falls bereits gefüllt und ersetzen geklickt, ersetzen
                                    rstDaten.Update
                                End With
                        End Select
                    End If
                Else 'wenn nicht gefüllt, dann
                    With rstDaten
                        .Edit
                        rstDaten!Palettenscheine = Schein 'eintragen
                        rstDaten.Update
                    End With
                End If
            End If
            rstDaten.MoveNext
        Loop
    End If
Next
   
PSNR.Text = ""
LS1.Text = ""
LS2.Text = ""
LS3.Text = ""
LS4.Text = ""
LS5.Text = ""
LS6.Text = ""
LS7.Text = ""
LS8.Text = ""
LS9.Text = ""
LS10.Text = ""
LS11.Text = ""
LS12.Text = ""
LS13.Text = ""
LS14.Text = ""
LS15.Text = ""
LS16.Text = ""
LS17.Text = ""
LS18.Text = ""
LS19.Text = ""
LS20.Text = ""
Eintragungen.Hide
DoCmd.OpenTable "Daten"
DoCmd.ApplyFilter , "Palettenscheine like '" & Schein & "'" 'nach Palettenschein Nummer


End Sub

Private Sub CommandButton2_Click()
PSNR.Text = ""
LS1.Text = ""
LS2.Text = ""
LS3.Text = ""
LS4.Text = ""
LS5.Text = ""
LS6.Text = ""
LS7.Text = ""
LS8.Text = ""
LS9.Text = ""
LS10.Text = ""
LS11.Text = ""
LS12.Text = ""
LS13.Text = ""
LS14.Text = ""
LS15.Text = ""
LS16.Text = ""
LS17.Text = ""
LS18.Text = ""
LS19.Text = ""
LS20.Text = ""
Eintragungen.Hide

End Sub
MfG Daniel

Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
(Johann Wolfgang von Goethe)
Benutzeravatar
<Raider>
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1000
Registriert: 26. Jul 2006, 10:05
Wohnort: Niedersachsen

Re: Excel VBA zu Access VBA konvertieren

Beitragvon knobbi38 » 14. Okt 2019, 13:58

Hallo Daniel,

mal ganz davon abgesehen, daß der Code aus dem Zusammenhang gerissen, gar nichts aussagt, solltest du dir doch nochmal ein VBA Tutorial oder die OH ansehen.

Nur mal so als Beispiel:
Der Rückgabewert einer Msgbox ist kein Byte und die Syntax für den Select-Befehl ist auch anders (hier die Verwendung des 'IS' Operators).

Noch als Tip:
Die Eigenschaft Text sollte man bei den Access Steuerelementen nur ansprechen, wenn das Steuerelement auch den Fokus besitzt. Das ist anders als bei den MSForms Steuerelementen, wie sie in Userforms bei Excel verwendet werden.

Nichts für ungut, aber wenn du dich etwas in das Thema Access/DBs hineingearbeitet hättest, wärest du nicht auf die Idee gekommen, mit einer For-Next Schleife alle Textboxen zu durchlaufen und dann in dieser Schleife wiederum mit einer Do-Until Schleife den dazugehörigen Eintrag in einem Recordset zu suchen, um den anzulegen oder zu ändern.

Machen kann man ja viel ...

Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1506
Registriert: 02. Jul 2015, 14:23

Re: Excel VBA zu Access VBA konvertieren

Beitragvon <Raider> » 14. Okt 2019, 14:44

knobbi38 hat geschrieben:Hallo Daniel,
Noch als Tip:
Die Eigenschaft Text sollte man bei den Access Steuerelementen nur ansprechen, wenn das Steuerelement auch den Fokus besitzt. Das ist anders als bei den MSForms Steuerelementen, wie sie in Userforms bei Excel verwendet werden.


Das Userform aus Excel habe ich 1:1 übernommen, da ich dafür kein Formular erstellen wollte. Daher habe ich auch die For-Next-Schleife übernommen.
MfG Daniel

Auch aus Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
(Johann Wolfgang von Goethe)
Benutzeravatar
<Raider>
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1000
Registriert: 26. Jul 2006, 10:05
Wohnort: Niedersachsen


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste