Visual Basic Problem

Liebe/-r Experte/-in,
Vielleicht kannst Du mir ja helfen.

Ich habe für eine Anwendung die ich in Access geschrieben ein Update gemacht.
Dazu habe ich aus dem Netz einen Codeschnipsel ein mein Programm eingebaut und nach meinem Wissen abgeändert.
Ich bin gerade dabei Visual Basic zu lernen.

In meinem Programm habe ich in der Datenbank „Settings.mdb“ die ich mit dem Programm verknüpft habe in der Tabelle Backend ein Feld „Pfad“, in dem ich hinterlegt habe wo sich das Backend befindet.

Nun möchte ich folgende Zeile

Pfad = Application.CurrentProject.Path & „\datenneu.mdb“

so abändern, das er sich den Pfad aus diesem Feld selber holt.

Falls das schwierig ist, kann auch wahlweise der Pfad aus dem geöffneten Formular geholt werden.

Wie müsste die Zeile heissen damit es funktioniert ? Muss ich auch noch irgendwelche Variablen Dimensionieren ?

Für eine kurze Hilfe wäre ich sehr dankbar.

Private Sub Befehl0_Click()
On Error GoTo Fehler
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim td As DAO.TableDef
Dim fld As New DAO.Field
Dim Pfad As String, PfadOK As String, SQL As String
’ Hier den Pfadnamen und Dateiname mit .mdb eingeben
Pfad = Application.CurrentProject.Path & „\datenneu.mdb“

’ Prüfen ob Pfad vorhanden, wenn nicht Abbruch
PfadOK = Dir(Pfad)
If Pfad = „“ Then
MsgBox („Pfad oder Dateiname falsch. ABBRUCH“)
Exit Sub
End If

Set db = OpenDatabase(Pfad)
Set td = db.TableDefs(„importdatei“)
With td
’ Anlegen eines Textfeldes, 50 Zeichen lang xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fld.Name = „ortsteil“
fld.Type = dbText
fld.Properties(„Size“) = 50
.Fields.Append fld
.Fields.Refresh
End With
Set fld = Nothing
Set td = Nothing
Set db = Nothing

Hallo Alena,

mit Access VBA kenne ich mich leider nicht aus.

Generell musst Du aber nur eine Abfrage auf die bestehende Tabelle und das Feld machen (zB ein SQL Query in der Form „SELECT Pfad FROM settings“).

Eine schnelle Google Suche brachte das:
http://msdn.microsoft.com/en-us/library/office/bb208…

Schau einfach dass Du das Feld ausgelesen bekommst und nutze diese Angabe dann statt deinem fest kodierten Pfad.

Grüße

Hallo,

ich habe zwar nicht wirklich Ahnung von VBA, aber so in etwa müsste es gehen:

Pfad = DFirst("Pfad", "Backend") //Erster Eintrag der Spalte Pfad aus Tabelle Backend

Wenn die Datenbank extern liegt, könnte es sein, dass du das noch irgendwie spezifizieren musst. Da weiß ich aber nicht wie.

Nico

Hallo,

Pfad = Application.CurrentProject.Path & „\datenneu.mdb“

ist ja schon fast die Lösung. Der Inhalt des Datenbankfelds muss nur anstelle von „/datenneu.mdb“ gesetzt werden.

Grüße

Leider bin ich mit den Access-spezifischen VBA-Befehen nicht vertraut.

Hallo Alena

Ich weiss nicht ob ich Sie richtig verstanden habe, Sie haben in einer DAtenbank, wo immer diese liegt eine Tabelle Backend und ein Feld Pfad, in dem der Pfad des Backend liegt, Soweit richtig ?
Dann hilft Ihnen der nachfolgende Code villeicht weiter

Private Sub Befehl0_Click()
Dim db As Database
Dim tb As Recordset
Dim Pfad As String, PfadOK As String, SQL As String
Dim BackendPfad As String

On Error GoTo Fehler

'Tragen SIe hier den kompletten Pfad der Datenbank Settings.mdb an z.B.: „C:\Database\Settings.mdb“
Pfad = „Laufwerk:\kompletterPfad\Settings.mdb“
’ Prüfen ob Pfad vorhanden, wenn nicht Abbruch
PfadOK = Dir(Pfad)
If Pfad = „“ Then
MsgBox („Pfad oder Dateiname falsch. ABBRUCH“)
Exit Sub
End If

'Adressieren der Datenbank
Set db = OpenDatabase(Pfad)

'Erstellen der SQL zum Auslesen des Feldes Pfad
SQL = „Select Pfad From Backend“
Set tb = db.OpenRecordset(SQL, dbOpenSnapshot)

If Not tb.EOF Then
'Durch MsgBox wird der Inhalt des Feldes tb(„Pfad“) ausgegeben
MsgBox tb(„Pfad“)
'Sie können den Inhalt auch einer Variablen zuweisen
BackendPfad = tb(„Pfad“)
End If
tb.Close
Set tb = Nothing
db.Close
Set db = Nothing

Fehler:
Select Case Err.Number
Case 0
'kein Fehler
Case Else
MsgBox „Fehler bei Befehl0_Click :“ & Err.Number & " " & Err.Description
'Wenn Sie eine Fehlermeldung erhalten, können SIe mit Strg und Unterbrechen hierhin springen und mit F8 den Befehl Resume ausführen, der Sie
'zur Fehlerzeile bringt.
'Sollten Sie die nächste Zeile nach der Fehlerzeile ausführen wollen, können Sie den Befehländern in Resume Next
Resume
End Select

End Sub

Ich hab noch ein paar Kommentarzeilen hinzugefügt.

Sollten doch Probleme auftauchen können Sie mir auch Mailen unter [email protected], dann können wir einfacher kommunizieren

Gruß
Willi

Hallo Alena,

in welcher Entwicklungsumgebung schreibst du denn deinen Code? Das wäre noch hilfreich zu wissen.

Ansonsten musst du eine Connection auf die Datenbank Settings.mdb aufmachen (mit dem passenden Connectionstring), einen neuen Command anlegen über den du ein Select-Statement auf die Tabelle Backend abschießt, mit dem du den Inhalt aus der Spalte Pfad holst (z.B. select pfad from backend).

Da ich aber nicht weiß, in welcher Umgebung du entwickelst, kann ich dir nichts genaueres sagen.

Viele Grüße
René

Hallo,

Ich fürchte da kann ich nicht helfen, befass dich damit Werte aus einer Datenbank auszulesen. Aber ein kleiner Tipp: Die zweite Zeile hier ist falsch:

PfadOK = Dir(Pfad)
If Pfad = „“ Then

Da fragst du Pfad statt PfadOK ab - die Variable ist aber ohnehin überflüssig, mach es einfach so:

If Dir(Pfad) = „“ Then

Jemrija

Hallo Alena,

Bitte entschuldige die späte Antwort. Die Frage passt leider nicht ganz in meinen Bereich. Ich bin als VB.NET-Experte eingetragen, die Frage betrifft aber Access/VBA. In dem Bereich kenne ich mioh leider nur vage aus.

Ich kann daher nur allgemein antworten.

Wenn in einen Pfad ein Teil eingesetzt werden soll, der aus dem Feld einer Datenbank stammt, würde ich in den Pfad eine Funktion einsetzen, die diesen Teil aus der Datenbank ausliest und einsetzt:

Also:

Pfad = Application.CurrentProject.Path & GetPfadDB()

GetPfadDB ist eine Function, die auf das Feld der Datenbank zugreift:

Function GetDBPfad() As String

Pfad =

GetDBPfad = Pfad
End Function

Grundsätzlich ist VBA (Visual Basic) nicht schwer. Ein Vorteil ist, dass man alle Befehle im Direktfenster ausprobieren kann und damit schnell dahinter kommt wie ein Befehl funktioniert.

Aber damit sage ich vermutlich nichts Neues:wink:

Es tut mir leid, dass ich nicht konkreter helfen kann (wenn ich ab und zu Fragen bekomme, dann sind es immer Fragen, die ich deswegen nicht beantworten kann weil VBA und VB.NET nicht dasselbe sind).

Viele Grüße,
Peter

Private Sub Befehl0_Click()
On Error GoTo Fehler
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim td As DAO.TableDef
Dim fld As New DAO.Field
Dim Pfad As String, PfadOK As String, SQL As String

Dim rsRS as DAO.Recordset 'Unter Extras-Verweise muß die Microsoft DAO 3.x Object Library vorhanden sein

SQL = „SELECT * FROM Backend“ 'Tabelle muß verknüpft sein und so heißen
'SQL = „SELECT Pfad FROM Backend“ 'Alternativ, dann wird nur das eine Feld geholt
SET rsRS = codeDB.OpenRecordset(SQL)
if not rsRS.EOF then
Pfad = nz(rsRS!Pfad,"")
Endif
rsRS.Close
SET rsRS = nothing

’ Hier den Pfadnamen und Dateiname mit .mdb eingeben
'Pfad = Application.CurrentProject.Path & „\datenneu.mdb“

’ Prüfen ob Pfad vorhanden, wenn nicht Abbruch
PfadOK = Dir(Pfad)
If Pfad = „“ Then
MsgBox („Pfad oder Dateiname falsch. ABBRUCH“)
Exit Sub
End If

Set db = OpenDatabase(Pfad)
Set td = db.TableDefs(„importdatei“)
With td
’ Anlegen eines Textfeldes, 50 Zeichen lang xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fld.Name = „ortsteil“
fld.Type = dbText
fld.Properties(„Size“) = 50
.Fields.Append fld
.Fields.Refresh
End With
Set fld = Nothing
Set td = Nothing
Set db = Nothing
… mehr auf http://www.wer-weiss-was.de/app/query/display_query?..

Gruß
Ingo

Hallo Alena,

Eine VB-Applikation direkt in Access zu basteln ist nicht gerade der Königsweg. Besser wäre es Du würdest Dir eine „echte“ Vb-Lizenz beschaffen, so was kann man gebraucht manchmal ganz günstig erstehen.

Meine Lösung bezieht sich also eigentlich auf ein „Echtes“ Visual Basic 6. Mit Access als Programmierumgebung arbeite ich nicht.

Übrigens ist in Deiner Prozedur Befehl0_Click noch ein anderer Fehler enthalten: Du erzeugst in der angegebenen Datenbank dann ein Feld Ortsteil. Wenn du diese Prozedur mit einer Datenbank aufrufst, die das Feld bereits enthält, fliegt Dir das Ding um die Ohren! Du musst vor dem Erzeugen des Feldes prüfen, ob es eventuell schon existiert!

Sven

Das Andere ist eigentlich ganz einfach, Du bastelst Dir eine Funktion, die den Pfad aus der Settings.MDB herausfischt . Das geht in VB6 so:

Public Function GetDatabasePath(PfadZurSteuerdatenbank As String) As String
’ – Datenbank öffnen
Dim DB As Database
Set DB = OpenDatabase(PfadZurSteuerdatenbank)
’ – Tabelle öffnen
Dim rs As Recordset
Set rs = DB.OpenRecordset(„Backend“, dbOpenDynaset)

’ – passenden Datensatz suchen
rs.FindFirst („Feldname = Wert“) 'Satz in Tabelle Backend suchen
’ – Wenn gefunden, dann verwenden, sonst Default
If Not rs.NoMatch Then
PfadZurSteuerdatenbank = rs.Fields(„Pfad“).Value
Else
PfadZurSteuerdatenbank = „Hier sollte ein Defaultwert stehen“
End If

End Function

Deine aufrufende Prozedur sieht dann so aus:

> Private Sub Befehl0_Click()
> On Error GoTo Fehler
> Dim ws As DAO.Workspace
> Dim db As DAO.Database
> Dim td As DAO.TableDef
> Dim fld As New DAO.Field
> Dim Pfad As String, PfadOK As String, SQL As String
> ’ Hier den Pfadnamen und Dateiname mit .mdb eingeben
> Pfad = Application.CurrentProject.Path & „\datenneu.mdb“
>
> ’ Prüfen ob Pfad vorhanden, wenn nicht Abbruch
> PfadOK = Dir(Pfad)
> If Pfad = „“ Then
> MsgBox („Pfad oder Dateiname falsch. ABBRUCH“)
> Exit Sub
> End If
>
>
> Set db = OpenDatabase(Pfad)
> Set td = db.TableDefs(„importdatei“)
> With td
> ’ Anlegen eines Textfeldes, 50 Zeichen lang
> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
> fld.Name = „ortsteil“
> fld.Type = dbText
> fld.Properties(„Size“) = 50
> .Fields.Append fld
> .Fields.Refresh
> End With
> Set fld = Nothing
> Set td = Nothing
> Set db = Nothing

Ich habe einen Fehler bei der Antwort gemacht. Die Zeile

Pfad = Application.CurrentProject.Path & „\datenneu.mdb“

sollte lauten:

Pfad = GetDatabasePath( „Hier muss der Pfad zur Steuerdatenbank stehen!“)

Sorry!