Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: AMB am Januar 02, 2013, 13:54:50

Titel: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 02, 2013, 13:54:50
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!
   
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: DF6GL am Januar 02, 2013, 14:13:37
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
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 02, 2013, 14:39:27
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?
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: 69bruno am Januar 02, 2013, 15:23:06
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.
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 02, 2013, 15:51:50
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?
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: DF6GL am Januar 02, 2013, 17:29:31
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
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 03, 2013, 07:43:15
DANKE!
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 15, 2013, 10:21:39
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.
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: bahasu am Januar 15, 2013, 11:50:30
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]
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 15, 2013, 12:42:46
Danke Harald!

Aber ich stelle mich ein zu dämlich an, ich bekomme das nicht auf den obigen Code transferiert!

Bitte um Hilfe!
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: bahasu am Januar 15, 2013, 13:28:47
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]
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 15, 2013, 16:18:58
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
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 15, 2013, 16:20:13
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
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: bahasu am Januar 15, 2013, 17:20:54
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
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 16, 2013, 08:06:24
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?
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: bahasu am Januar 16, 2013, 08:44:12
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
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 16, 2013, 09:54:35
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.


Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: DF6GL am Januar 16, 2013, 20:34:24
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
Titel: Re: Prüfung ob Steuerelemet existiert
Beitrag von: AMB am Januar 17, 2013, 08:04:45
DANKE, hat funktioniert!