Hallo Zusammen,
ich kenne mich mit VBA noch nicht so richtig aus und benötige deshalb Eure Hilfe!
Ich habe Formblätter erstellt, auf denen jeweils "Schaltflächen" vorhanden sind. Je nach Formblatt kann die Anzahl unterschiedlich sein. Auch kann es sein, dass in der Reihenfolge eins fehlt (z. B. obj02 wird nicht benötigt). Bei den vorhanden Schaltflächen soll ein Bild angezeigt werden. Bisher habe ich das folgendermaßen umgesetzt:
Private Sub Form_Load()
Dim strSchaltflaeche As String
strSchaltflaeche = DLookup("PfadSchaltflaeche", "tblDaten001", "Daten001ID=1")
Me!obj01.Picture = strSchaltflaeche
Me!obj02.Picture = strSchaltflaeche
Me!obj03.Picture = strSchaltflaeche
Das funktioniert wunderbar. Allerdings möchte ich das ganze ein wenig dynamischer gestalten. Ich dachte, da an eine Prüfung, wenn obj vorhanden, dann Bild.
Ich habe schon ein wenig mit der IF-Anweisung rum gedoktert, aber es nicht wirklich hinbekommen.
Bitte helft mir!
Hallo,
es ist unklar, was Du da überhaupt machst und meinst...
--Was sind "Formblätter"?
-- sind "Schaltflächen" Bild-Steuerlemente?
-- "dass in der Reihenfolge eins fehlt (z. B. obj02 wird nicht benötigt). " Warum existiert es dann überhaupt?
Quick&dirty (nach meiner Interpretation):
Private Sub Form_Load()
Dim varSchaltflaeche As Variant, i as Long
Const MaxBildAnzahl = 10
varSchaltflaeche = DLookup("PfadSchaltflaeche", "tblDaten001", "Daten001ID=1")
If Not Isnull ( varSchaltflaeche ) Then
If Dir(varSchaltflaeche) <> "" Then
On Error Resume next
For i=1 to MaxBildAnzahl
Me("obj" & i ).Picture = CStr(varSchaltflaeche) 'Benennung der Steuerelemente: obj1 ... obj10
Next
End If
End If
End Sub
Hallo,
Danke für die schnelle Antwort.
Meine Formblätter sind Formulare und die "Schaltflächen" sind Bild-Steuerelemente.
Ich kopiere die Formulare und bei einigen werden verschiedene "Schaltflächen" halt nicht benötigt.
Dein Interpretation war schon ganz richtig.
Allerdings sind meine Steuerelemete alle zweistellig benannt worden (obj01, obj02, ...).
Mit deinem Code werden erst ab obj10 alle angezeigt.
Wie muss ich den Code anpassen, damit die anderen auch angezeigt werden?
Oder muss ich alle Steuerelemente einstellig benennen?
Ich würde keine führenden Nullen einbauen, entweder mit "1" beginnen, oder (wenn es Sinn macht, die Länge der Objektbezeichner (zumindest für 90 Stück) immer gleich lang zu haben) bei "10" anfangen........
Dann muss im Code aber auch mit "i = 10" angefangen werden.
Ok, dann werde ich wohl die Steuerelemente umbenennen.
Aber jetzt nochmal eine andere Frage:
Wenn jetzt jedes Steuerelement sein eigenes Bild hätte, könnte man den Code anpassen, dass die ID (vom DLookup) entsprechend der Steuerelementnummer wäre?
Beispiel:
obj1 => ID=1
obj2 => ID=2
Ist das möglich? Wenn ja, wie würde der Code aussehen?
Hallo,
zur Benennung hatte ich doch einen Kommentar geschrieben...
"jedes Steuerelement sein eigenes Bild":
Private Sub Form_Load()
Dim varSchaltflaeche As Variant, i as Long
Const MaxBildAnzahl = 10
On Error Resume next
For i=1 to MaxBildAnzahl
varSchaltflaeche = DLookup("PfadSchaltflaeche", "tblDaten001", "Daten001ID=" & i)
If Not Isnull ( varSchaltflaeche ) Then
If Dir(varSchaltflaeche) <> "" Then
Me("obj" & i ).Picture = CStr(varSchaltflaeche) 'Benennung der Steuerelemente: obj1 ... obj10 ....
Else
Me("obj" & i ).Picture = ""
End If
End If
Next
End Sub
DANKE!
Hallo Zusammen,
nun ist ein neues Problemchen hinzugekommen:
Der obige Code funktioniert im Formular einwandfrei. Nun wollte ich das heute allerdings global einsetzen, nun wird über das "Me" gemeckert.
Wie muss ich "Me" im Modul ersetzen, um trotzdem flexibel zu bleiben?
Ich habe schon einiges gegoogles und getestet, aber klappt nicht so richtig.
Hi,
im Anhang ist ein mini-Beispiel, wie der Formularname und der Name vom Steuerelement an das Modul übergeben werden und dort ausgewertet werden.
Im Formular sind beim Befehl1 die VBA-Zeilen im Formular,
beim Befehl2 im Modul.
Harald
[Anhang gelöscht durch Administrator]
Danke Harald!
Aber ich stelle mich ein zu dämlich an, ich bekomme das nicht auf den obigen Code transferiert!
Bitte um Hilfe!
Hi qmb,
im Modul:
Public Sub Pruefen(Formular As String)
Dim varSchaltflaeche As Variant, i As Long
Const MaxBildAnzahl = 10
On Error Resume Next
For i = 1 To MaxBildAnzahl
varSchaltflaeche = Nz(DLookup("PfadSchaltflaeche", "tblDaten001", "Daten001ID=" & i), "")
' varSchaltflaeche = "E:\Data\Bilder\Bild.bmp" ' diente zum Testen
If varSchaltflaeche > "" Then
If Dir(varSchaltflaeche) <> "" Then
Forms(Formular).Form("obj" & i).Picture = CStr(varSchaltflaeche) 'Benennung der Steuerelemente: obj1 ... obj10 ....
Else
Forms(Formular).Form("obj" & i).Picture = ""
End If
End If
Next
End Sub
im Formular im Ereignis "Beim Laden":
Call Pruefen(Me.Name)
Harald
PS
"QMB" bedeutet Qualitätsmanagement Beauftragter?
[Anhang gelöscht durch Administrator]
Hallo Harald,
Danke für die Hilfe, hat funktioniert und eigentlich habe ich das auch verstanden. Dachte ich zumindest.
Es ergibt sich gleich das nächste Hindernis:
Ich habe über die einzelnen Bild-Steuerelemente (obj) nun Textfelder (txtA) gelegt. Diese wollte ich nach dem gleichen Prinzip mit Daten füllen, aber das klappt natürlich nicht.
Werde langsam wahnsinnig, deswegen bitte nochmal helfen!
PS.: Richtig, QMB bedeutet Qualitätsmanagementbeauftragter
Hier mein Versuch:
Dim strDatenA As String, k As Long
strDatenA = Nz(DLookup("QMDatei1", "tblqma0000001", "QMID=" & k), "")
Const MaxDatenAnzahlA = 30
For k = 1 To MaxDatenAnzahlA
If Not IsNull(strDatenA) Then
If Dir(strDatenA) <> "" Then
Forms(Formular).Form("txtA" & k).Value = CStr(strDatenA)
Else
Forms(Formular).Form("txtA" & k).Value = ""
End If
End If
Next
Hi,
wenn ich das richtig verstanden habe, kommst Du zum Ziel (eine Beschriftung im Formular anzupassen) mit:
Forms(Formular).Form("txtA" & k).Caption
Zitat von: QMB am Januar 15, 2013, 16:18:58
Werde langsam wahnsinnig, deswegen bitte nochmal helfen!
... um wahnsinnig zu werden, muss man doch nicht access einsetzen:
... QMB reicht doch dafür ;D
Harald
Guten Morgen,
ich habe das nun auch mal mit Bezeichnungsfeldern und "Caption" getestet. Klappt aber auch nicht.
Bisher hatte ich mir die Daten in die Textfelder immer so geholt:
[txtA1].Value = DLookup("QMDatei1", "tblqma0000001", "QMID=1")
[txtA2].Value = DLookup("QMDatei1", "tblqma0000001", "QMID=2")
...
[txtA30].Value = DLookup("QMDatei1", "tblqma0000001", "QMID=30")
Ich hatte gedacht nach dem obigen Prinzip, würde das auch funktionieren.
Was mache ich falsch? Jemand eine Idee?
Hi
die obige dlookup-Anweisung entspricht der weiter oben aufgeführten.
Soll bei dem Text wirklich das gleiche stehen wie bei der Bildzuordnung?
Zitat von: QMB am Januar 16, 2013, 08:06:24
Klappt aber auch nicht.
Definiere bitte, was nicht klappt.
Ansonsten noch mal das Angebot, eine von Dir hochgeladenen Datenbank zu betrachten.
Harald
Hallo,
erstmal herzlichen Dank für die Hilfe und die Geduld mit mir.
Ich versuche es mal ein wenig zu erklären was ich überhaupt vorhabe:
Also, es existierte eine Datenbank mit Frontend und Backend (Access). Das Backend wurde nun aus Performance- und Zugriffstechnischen Gründen in eine MySQL-Datenbank verlegt.
Die Anwendung ist mit Formularen als Benutzeroberfläche aufgebaut. Zwecks "corporate identity" sind entsprechend Logos und farbige Schaltflächen eingebaut. Diese liegen in einem Ordner vor (z. B.: Logo.jpg, Formular.png, Schaltfläche.png) und sind nur verknüpft.
Auf den einzelnen Formularen sind unterschiedlich viele Buttons zum Öffnen weiterer Formulare, Berichte und Excel-Dateien. Die "Buttons" bestehen aus einem Bildsteuerungselement (wegen der farblichen Schaltfläche!) und einem Textfeld zur Beschriftung. Der Inhalt wird aus einer Tabelle geholt.
Bisher so:
[txtA1].Value = DLookup("QMDatei1", "tblqma0000001", "QMID=1")
[txtA2].Value = DLookup("QMDatei1", "tblqma0000001", "QMID=2")
...
[txtA30].Value = DLookup("QMDatei1", "tblqma0000001", "QMID=30")
Hinter jedem Formular lag einen ellenlanger VBA-Code. Und beim Anlegen eines neuen Formulars musste der gesamte Code umgeschrieben werden. Teilweise musste auch Code gestrichen werden, da z. B. auf dem neuen Formular nur 25 "Buttons" waren.
Da ich eine faule Socke bin, habe ich gerne alles ein wenig flexibler.
Zuerst habe ich erstmal den Code ausgelagert.
Mit Eurer Hilfe habe ich mir dann flexibel die "farbigen Schaltflächen" anzeigen lassen:
ZitatHi qmb,
im Modul:
Code: (vb) In Zwischenablage kopieren
Public Sub Pruefen(Formular As String)
Dim varSchaltflaeche As Variant, i As Long
Const MaxBildAnzahl = 10
On Error Resume Next
For i = 1 To MaxBildAnzahl
varSchaltflaeche = Nz(DLookup("PfadSchaltflaeche", "tblDaten001", "Daten001ID=" & i), "")
' varSchaltflaeche = "E:\Data\Bilder\Bild.bmp" ' diente zum Testen
If varSchaltflaeche > "" Then
If Dir(varSchaltflaeche) <> "" Then
Forms(Formular).Form("obj" & i).Picture = CStr(varSchaltflaeche) 'Benennung der Steuerelemente: obj1 ... obj10 ....
Else
Forms(Formular).Form("obj" & i).Picture = ""
End If
End If
Next
End Sub
im Formular im Ereignis "Beim Laden":
Code: (vb) In Zwischenablage kopieren
Call Pruefen(Me.Name)
Harald
PS
"QMB" bedeutet Qualitätsmanagement Beauftragter?
Das funktioniert auch einwandfrei.
Nun wollte ich das neuerworbene Wissen transferieren und wollte nach dem gleichen Prinzip die Textfelder füllen. Dafür habe ich aus ".Picture"".Value" gemacht und die Tabelle für die Datenherkunft angepasst.
Hier nochmal mein Versuch:
Dim strDatenA As String, k As Long
strDatenA = Nz(DLookup("QMDatei1", "tblqma0000001", "QMID=" & k), "")
Const MaxDatenAnzahlA = 30
For k = 1 To MaxDatenAnzahlA
If Not IsNull(strDatenA) Then
If Dir(strDatenA) <> "" Then
Forms(Formular).Form("txtA" & k).Value = CStr(strDatenA)
Else
Forms(Formular).Form("txtA" & k).Value = ""
End If
End If
Next
Aber das funktioniert nicht. Warum nicht? Mein Code-Verständnis war wohl doch nicht richtig.
Ich hoffe das war deutlich und verständlich geschildert!? Ansonsten muss ich wohl doch ein Beispiel zusammenbasteln.
Hallo,
schreib mal:
Dim k As Long
Const MaxDatenAnzahlA = 30
On Error resume next
For k = 1 To MaxDatenAnzahlA
Forms(Formular)("txtA" & k).Value = DLookup("QMDatei1", "tblqma0000001", "QMID=" & k)
Next
DANKE, hat funktioniert!