# VBA und Access



## Fibo (10. Januar 2005)

Hallo!

Bin daran in Access eine datenbank zu erstellen. Über eine Maske sollen Daten eingegeben werden können. Per Buttonklick sollen diese als neuer Datensatz in die DB geschrieben werden. Allerdings hab ich das Problem, dass ich das Ereignis nach Buttonklick per VBA schreiben muß. Hab aber leider keine Ahnung von VBA. Kann mir bitte irgendjemand helfen? Oder gibt es auch eine Möglichkeit die Daten aus der Maske ohne Programmieren in die DB zu speichern?

Gruß
Phil


----------



## Filone (10. Januar 2005)

Dann ist es doch sinnvoller das ganze ganz normal als Formular zu erstellen, somit können Deine Benutzer Eingaben machen und der Datensatz wird automatisch eingefügt.

Ansonsen mußt Du Dir in VBA einen Verweis auf die aktuelle Datenbank holen :

Dim CurDB As Database
Dim RecSet As Recordset

Set CurDB = CurrentDB
set RecSet = CurDb.Records.Add(Variablen)

Oder so ähnlich müsste der Code lauten.


----------



## Fibo (11. Januar 2005)

Ok, hab das Ganze als normales Formular erstellt und es klappt auch gut. Nur weiß ich jetzt noch nicht wie ich die Daten aus dem Formular in zwei verschiedenen Tabellen speichern kann.

In der Tabelle A sind alle Grunddaten zu finden. Die Felder dieser Tabelle hab ich zur Erstellung des Formulars verwendet.
In Tabelle B befinden sich die Werte für die verschiedenen Jahre, welche immer weiter ergänzt werden sollen.
Dazu sollen in der Eingabemaske Felder zur Verfügung stehen, in welche die Jahreszahl, die Stückzahl und der Preis eingegeben werden soll. Jedes Jahr soll als neuer Datensatz gespeichert werden.

Habe erst versucht es über ein Unterformular einzugeben. Das funktioniert an sich schon, jedoch sollen die Daten nicht wie in einer Exceltabelle, sondern über normale Eingabefelder in der Hauptmaske eingegeben werden. Wie kann ich es nun machen, dass diese Werte seperat in Tabelle B gespeichert werden und zwar jedes Jahr als neuer Datensatz?


----------



## Filone (12. Januar 2005)

Indem Du Dir Verweise auf die Tabellen holst mittels


```
Set tblToInsert1 = CurrentDB.TableDef(Name)
```

und dann mit "Recordsets.Add" den Datensatz einfügst.


----------



## Fibo (17. Januar 2005)

Meine Felder sind durchnummerriert von jahr1 bis jahr10. Das gleiche gillt für die Stückfelder. Nun dachte ich mir, dass ich die ja mit einer Schleife nach und nach abfragen kann.

For X = 1 To 10 Step 1
   .AddNew
   Y = "jahr" + CStr(X)
   !Jahr = [Y]

Y hat auch immer den Wert jahr1 bis jahr10. Wenn ich Y jedoch in Klammern schreibe gibt es immer einen Fehler. Durch direktes ansprechen des Formularfeldes , [jahr1], funktioniert auch alles. Nur wenn ich die Variable benutze gehts nicht. Was muß ich anders machen?


----------



## Filone (17. Januar 2005)

Ich glaube nicht daß Du zwei Strings zusammenfügen und daraus einen Objektverweis erstellen kannst.

Ein Lösungsvorschlag wäre folgender :


```
Dim accForm as Form

For Each accForms in Forms
 'Prüfen ob es ein Formular mit dem Namen 'Jahrx' ist
 If Left(accForm.Name,4) = "jahr" Then
  Befehle
 End If
Next accForm
```

Ich bin mir nicht sicher, vielleicht hilft es wenigsten Gedanklich.


----------



## Fibo (17. Januar 2005)

Ok, dieses Problem wär somit einigermaßen gelöst. Jedoch hab ich schon wieder andere.

Ich will schauen, ob die im Formular eingegebenen Daten schon in der Tabelle angespeichert sind. Wenn nicht, sollen sie hinzugefügt, ansonsten geändert werden. Dazu habe ich folgende Schleife:

    Do Until rst2!ID = [ID] Or rst2.EOF
      rst2.MoveNext
    Loop

Eigentlich dachte ich, dass sie aufhört, wenn gilt
a) ID des Datensatzes entspricht der ID im Formular
b) Letzter Datensatz ist erreicht.

Wenn die Daten der Maske jedoch noch nicht gespeichert sind und somit auch keine übereinstimmende ID vorhanden ist bricht die Schleife bei Do Until ab mit der Meldung "kein aktueller Datensatz". Ich dachte, dass dies durch rst2.eof verhindert wird.


----------



## Filone (17. Januar 2005)

> Jedoch hab ich schon wieder andere



Daran sollte man sich frühzeitig gewöhnen.   

Hinsichtlich der Datensatzspeicherung bin ich jetzt überfragt, alles was ich von mir geben könnte ist reine Vermutung. Sorry.


----------

