Zugriff auf Daten in VBA

Hallo,

ich bräuchte da mal wieder etwas (Nach-)Hilfe von den Experten! :wink:

Ich habe Access 97 (ziemlich alt, ich weiss!) und habe eine Tabelle mit meinen Daten und ein Formular mit Kombinationsfeldern …

Nun meine Frage: Ich möchte das Ganze in dieser Access-DB mit VBA steuern, kann aber nicht so recht auf die Daten meiner Tabelle/DB zugreifen! Welche Funktion ist dafür zuständig oder wie kann man’s sonst machen???

Vielen lieben Dank.
Kati

Mahlzeit,

ich bräuchte da mal wieder etwas (Nach-)Hilfe von den
Experten! :wink:

hmmm… das hört sichnicht nach Nachhilfe an, eher nach Einführungsunterricht…

Nun meine Frage: Ich möchte das Ganze in dieser Access-DB mit
VBA steuern, kann aber nicht so recht auf die Daten meiner
Tabelle/DB zugreifen! Welche Funktion ist dafür zuständig oder
wie kann man’s sonst machen???

Du solltest deine konkreten Probleme beschreiben. Deine Anfrage ist so allgemein, daß man dir nur eine Buchempfehlung nennen kann. Was heißt „das Ganze“, wozu brauchst du VBA, warum kannst du nicht zugreifen?

Gruß

Sancho

Ich habe eine Tabelle, auf dessen Daten ich per VBA zugreifen will. Ich habe gelesen, das es die Objekte Database, Worksheet, … geben soll, ueber die ich mittels eines Recordsets auf die Daten zugreifen koennen sollte!!!
Nur leider bietet mir Access diese genannten Objekte nicht an.

Gibt es sonst noch eine andere Moeglichkeit in VBA Zugriff, z.B. per SQL, auf meine Daten zu bekommen?

Danke

Mahlzeit,

Ich habe eine Tabelle, auf dessen Daten ich per VBA zugreifen
will. Ich habe gelesen, das es die Objekte Database,
Worksheet, … geben soll, ueber die ich mittels eines
Recordsets auf die Daten zugreifen koennen sollte!!!

Worksheet nicht, aber Workspace.

Nur leider bietet mir Access diese genannten Objekte nicht an.

Wo und warum nicht? Was passiert, wenn du dieses Beispiel aus der Access-Hilfe ausprobierst?

Sub DatabaseObjectX()

 Dim wrkJet As Workspace
 Dim dbsNorthwind As Database
 Dim dbsNew As Database
 Dim dbsLoop As Database
 Dim prpLoop As Property

 Set wrkJet = CreateWorkspace("JetWorkspace", "Admin", \_
 "", dbUseJet)

 ' Sicherstellen, daß es nicht bereits eine Datei 
 ' mit dem Namen der neuen Datenbank gibt.
 If Dir("NeueDB.mdb") "" Then Kill "NeueDB.mdb"

 ' Neue Datenbank mit der angegebenen
 ' Sortierreihenfolge erstellen.

Set dbsNew = wrkJet.CreateDatabase("NeueDB.mdb", \_
 dbLangGeneral)
 Set dbsNorthwind = wrkJet.OpenDatabase("Nordwind.mdb")

 ' Databases-Auflistung durchlaufen.
 For Each dbsLoop In wrkJet.Databases
 With dbsLoop
 Debug.Print "Eigenschaften von " & .Name
 ' Properties-Auflistung jedes Database-
 ' Objekts durchlaufen.
 For Each prpLoop In .Properties
 If prpLoop.Name "" Then \_
 Debug.Print " " & \_
 prpLoop.Name & " = " & prpLoop.Name

Next prpLoop
 End With
 Next dbsLoop

 dbsNew.Close
 dbsNorthwind.Close
 wrkJet.Close

End Sub

Wenn du eine Fehlermeldung bezüglich fehlender Objekttypen bekommen solltest, so mußt du das DAO- Objekt Library nachinstallieren.

Gruß

Sancho

kann mich Sancho nur anschliessen…

Worksheet nicht, aber Workspace.

Nur leider bietet mir Access diese genannten Objekte nicht an.

Wo und warum nicht?

Worksheet kann Access auch nicht anbieten… wie bemerkt, gibt es in Access nur Workspace. Worksheet wird erst nach dem Einbinden des Verweises auf Excel verfügbar. Aber damit steuert man dann ja aus Acc. heraus ein Excel-Worksheet.

Wenn du eine Fehlermeldung bezüglich fehlender
Objekttypen bekommen solltest, so mußt du das DAO- Objekt
Library nachinstallieren.

…also unter Extras/Verweise!
verstehe nur nicht ganz, warum hier VBA oder SQL bemüht werden muss, wenn die wichtigsten Funktionen für die Anzeige und Bearbeitung der Tabellendaten bereits durch das „Formular“ selbst erledigt werden.
Sprich: mir ist die eigentliche Frage noch zu oberflächig. Wäre interessant, wenn man wüsste, welche spezifische Aufgabe da durchgeführt werden soll.

CU. Jan

Wo liegt die Tabelle?
Hallo
Du musst nochmals schreiben, was Du willst!
Da gibt es nämlich eine Frage:

Ist deine Tabelle auf welche Du zugreifen möchtest eine Externe, alleinstehende, unverlinkte, Excel Tabelle, die das Präfix *.xls hat, oder
ist es eine Tabelle in Access, welche Du unter Tabellen eingefügt hast. Das ist mal die Grundlegende frage.

Und wird diese Frage beantwortet, so kann man dir Weiter helfen.

Gruss Sebastian

Weitere Erklärungen…
Hallo Jan (u. a.),

danke erstmal für die oberen Antworten, bin schon ein ganzes Stückl weiter! *freu*

Also mal zu dem, was ich eigentlich machen will:

Es geht darum, einige Analysen bzgl. der Lebensdauer von Geräten zu erstellen und dann eine Prognose zu „wagen“, wie viele der aktiven Geräte wohl im nächsten Jahr ausfallen könnten. Im Excel habe ich das alles relativ einfach lösen können, nun will ich das Ganze allerdings noch in Access umsetzen.

In meiner Tabelle habe ich folgende Datenspalten: Geräteart, Gerätetyp, Lieferdatum, Abgangsdatum und noch einige irrelevante Spalten. Ich muss als erstes unterscheiden, welche Geräte aktiv sind und welche abgegangen. Die abgegangenen Geräte haben ein Abgangsdatum, die Lebensdauer kann einfach bestimmt werden. Die Lebensdauer der aktiven Geräte soll dann variabel zu einem Betrachtungszeitpunkt bestimmt werden können. Auf Basis der durchschnittlichen Lebensdauer der abgegangenen Geräte soll nun mit Ausfallwahrscheinlichkeiten eine Prognose gemacht werden, wie viele der aktiven Geräte ausfallen werden und das in Abhängigkeit des Alters dieser aktiven Geräte.

Da das Ganze mit einigen Rechnungen versehen ist, glaube ich nicht, dass das Ganze überhaupt ohne VBA zu realisieren wäre, ODER? Ansonsten müsste ich ja berechnete Werte in die DB-Tabelle schreiben, aber wer macht denn sowas?

Ich bin momentan so weit, dass ich den Betrachtungszeitpunkt automatisiert habe und auswählen kann, welche Geräteart und/oder Gerätetyp ich auswerten will. Das Ganze kann ich in meinem Formular auswählen und ist so gestaltet, dass die Auswahlliste mit den Werten aus der DB-Tabelle gefüllt sind. Jetzt gehts an die Berechnungen…

Kann man denn in Access auch die ganzen statistischen Methoden und Verteilungen (Binomialverteilung, Normalverteilung) mit vorgefertigten Funktionen (wie in Excel) nutzen und wenn ja, wo finde ich diese?

Freue mich über Antworten!
Vielen Dank und einen schönen Tag noch!

…habe meine Tabelle aus Excel in Access importiert!

Hallo Jan (u. a.),

Schönen guten Morgen.

Es geht darum, einige Analysen bzgl. der Lebensdauer von
Geräten zu erstellen und dann eine Prognose zu „wagen“, wie
viele der aktiven Geräte wohl im nächsten Jahr ausfallen
könnten. Im Excel habe ich das alles relativ einfach lösen
können, nun will ich das Ganze allerdings noch in Access
umsetzen.

In meiner Tabelle habe ich folgende Datenspalten: Geräteart,
Gerätetyp, Lieferdatum, Abgangsdatum und noch einige
irrelevante Spalten. Ich muss als erstes unterscheiden, welche
Geräte aktiv sind und welche abgegangen. Die abgegangenen
Geräte haben ein Abgangsdatum, die Lebensdauer kann einfach
bestimmt werden. Die Lebensdauer der aktiven Geräte soll dann
variabel zu einem Betrachtungszeitpunkt bestimmt werden
können. Auf Basis der durchschnittlichen Lebensdauer der
abgegangenen Geräte soll nun mit Ausfallwahrscheinlichkeiten
eine Prognose gemacht werden, wie viele der aktiven Geräte
ausfallen werden und das in Abhängigkeit des Alters dieser
aktiven Geräte.

Kann man denn in Access auch die ganzen statistischen Methoden
und Verteilungen (Binomialverteilung, Normalverteilung) mit
vorgefertigten Funktionen (wie in Excel) nutzen und wenn ja,
wo finde ich diese?

Theoretisch ist das weitestgehend auch in Access möglich. Allerdings werden sich solch spezifische Berechnungsfunktionen wohl in irgendeiner Bibliothek verstecken, die erst einmal über Extras/Verweise eingebunden werden muss. Da ich mich damit bislang noch nicht beschäftigen musste, kenn ich auch den nötigen Verweis nicht. Denkbar wäre aber, dass man durch den Verweis auf Excel dessen Funktionen verwenden kann…

Freue mich über Antworten!
Vielen Dank und einen schönen Tag noch!

Also, d.H. Du hast in diesem Falle eine Tabelle, die in Access integriert ist, und deren Felder Inhalte Du lesen Möchtest.

Du hast gesagt, Du möchtest Dies mid Recordset tun.
Jetzt ist es so, dass meine Access Version, die nicht 97 ist den Befehl Currentdb (Currentdatabase) besitzt. Mit diesem Befeh^l bist Du dann schon mal am richtigen Ort. Vermutlich hat Dein Access aber diesen Befehl nicht, somit musst Du den Befehl irgendwie ersetzen, mit Vermutlich : Databases.Recordsets.Openrecordsets, nehme ich Mal an.
Der Baum sieht nämlich folgendermassen aus, von den Objekten:

DBEngine
Workspaces
Databases
TabelDefs
QueryDefs

Recordsets
Fields
Dieser Baum kannst Du jeweils mit einem Punkt zwischen jeder Zeile Trennen.
Jetzt zum Code:
Du brauchst als erstes mal eine Abfrage, Sortierung, ein Suchbefehl.

'Deklarationen
Dim rs As Variant
Dim i As Integer

'Abfrage nach Kundendaten öffnen.
Set rs = CurrentDb.OpenRecordset("SELECT Kunden_Nummer, Name, Firma, Strasse, Nummer, PLZ, Ort, Tel, Land " & „FROM Auftrag_Kunden ORDER BY Kunden_Nummer“) 'Öffnet die angegebene Datenbank, Kunden_Nummer ist Schlüsselfeld, alle Select Anweisungen möchte ich verändern oder Einlesen. ORDERBY, gibt an nach was geordnet wird, Reihenfolge der Abfrage.
'Als nächstes kommt das Grosse suchen mit z.B. FindFirst, suchst Du ein Datenfeld, welches deinen Vorgaben entspricht.

Dim fFirst As Boolean 'fFirst = True FindFirs, else FindNext
fFirst = True
Do While True
With rs
If fFirst = True Then
.FindFirst ("" & Suchfeld(0) & " = ‚" & Angabe(0) & "‘")
fFirst = False
Else
'Find Next wird verwendet, falls mehrere Datensätze mit gleichem Inhalt vorhanden sind.
.FindNext ("" & Suchfeld(0) & " = ‚" & Angabe(0) & "‘")
End If

If .NoMatch Then 'Beendet Loop-Schleife, wenn keine weiteren daten mehr gefunden werden
Form_Auftrag_Erfassung.lboxSuchresultat.AddItem („Keine weiteren Daten gefunden!“)
Exit Sub
Else

'Überprüft erstes Suchresultat nach Richtigkeit
Text2 = .Fields(Suchfeld(0)).Value
For i = 1 To Zahl
If Suchfeld(i) „“ Then Text2 = Text2 & „,“ & .Fields(Suchfeld(i))
Next i

'Weist erstes Resultat der lbox in FORM_Auftrag_Erfassung zu.
If Text1 = Text2 Then
Text2 = „“
'Felderinhalte werden Variablen zugeordnet.
Text2 = .Fields(„Kunden_Nummer“) & ", "
Text2 = Text2 & .Fields(„Firma“) & ", "
Text2 = Text2 & .Fields(„Name“) & ", "
Text2 = Text2 & .Fields(„Strasse“) & " "
Text2 = Text2 & .Fields(„Nummer“) & ", "
Text2 = Text2 & .Fields(„PLZ“) & ", "
Text2 = Text2 & .Fields(„Ort“) & ", "
Text2 = Text2 & .Fields(„Land“) & ", "
Text2 = Text2 & .Fields(„Tel“)
Form_Auftrag_Erfassung.lboxSuchresultat.AddItem (Text2)
End If
End If
End With
Loop
rs.Close
End Sub

Das war ein Beispiel für die Dateneinlesung.
Jetzt ein Beispiel, für das Verändern der Felder. auch hier muss wieder zuerst gesucht werden.

Public Sub Zuweisen_von_Auftrag_Kunden_Registrierung_an_Aktuellem_Datensatz()
Dim rs

Set rs = CurrentDb.OpenRecordset("SELECT Firma, Anrede, Kunden_Nummer, Name, Vorname, Strasse, Nummer, Postfach, PLZ, Ort, Land, Tel, Fax, EMail, Webseite, TelII, FaxII, EMailII, Rabatt " & "FROM Auftrag_Kunden WHERE Kunden_Nummer = " & Form_Auftrag_Kunden_Registrierung.tboxKunden_Nummer.Value) 'Öffnet die angegebene Datenbank und sucht durch WHERE, wo das Schlüsselfeld namens Kunden_Nummer gleich dem Feld Form_Auftrag_Kunden_Registrierung.tboxKunden_Nummer.Value ist.

With rs
rs.MoveFirst 'Bewegt den Lesezeiger auf den gefundenen Datensatz
.edit 'Editiert die Felder für änderungen
'Weist die Inhalte von textfeldern in der Form den Feldern (!Feld) zu
!Firma = Form_Auftrag_Kunden_Registrierung.tboxFirma.Value
!Anrede = Form_Auftrag_Kunden_Registrierung.comboxAnrede.Value
!Name = Form_Auftrag_Kunden_Registrierung.tboxName.Value
!Vorname = Form_Auftrag_Kunden_Registrierung.tboxVorname.Value
!Strasse = Form_Auftrag_Kunden_Registrierung.tboxStrasse.Value
!Nummer = Form_Auftrag_Kunden_Registrierung.tboxNummer.Value
!Postfach = Form_Auftrag_Kunden_Registrierung.comboxPostfach.Value
!PLZ = Form_Auftrag_Kunden_Registrierung.tboxPLZ.Value
!Ort = Form_Auftrag_Kunden_Registrierung.tboxOrt.Value
!Land = Form_Auftrag_Kunden_Registrierung.comboxLand.Value
!Tel = Form_Auftrag_Kunden_Registrierung.tboxTel.Value
!Fax = Form_Auftrag_Kunden_Registrierung.tboxFax.Value
!EMail = Form_Auftrag_Kunden_Registrierung.tboxE_Mail.Value
!Webseite = Form_Auftrag_Kunden_Registrierung.tboxWebseite.Value
!TelII = Form_Auftrag_Kunden_Registrierung.tboxTelII.Value
!FaxII = Form_Auftrag_Kunden_Registrierung.tboxFaxII.Value
!EMailII = Form_Auftrag_Kunden_Registrierung.tboxE_MailII.Value
!Rabatt = Form_Auftrag_Kunden_Registrierung.tboxRabatt.Value
.Update 'Speichert die Änderungen
.Close 'Schliesst das ganze
End With
End Sub

Baum:
Leider ist der Baum Saudoof gekommen.
Hier nochmal:
DBEngine
.Workspaces
…Users
…Groups
…Groups
…Users
…Databases
…TabelDefs
…Fields
…Indexes
…Fields
…QueryDefs
…Fields
…Parameters
…Recordsets
…Fields
…Relations
…Fields
usw.

Die Punkte sollten Leerschläge sein.
MFG
Sebastian