aximand
Goto Top

Bilddatei aus Userform oder Datenbank über string zusammensetzten

Hallo zusammen,

ich habe keine Ahnung wie ich mein Problem in der Überschrift genau beschreiben soll. Die ausführliche Problemstellung hier:

Es gibt ein Unserform in dem jede Menge Bilder liegen, die einfach img1 - x benannt wurden.
Jetzt möchte ich diese BIlder aus dem Userform in ein Bild, das IMG genannt wird, im Tabellenblatt unterbringen.
Prinzipiell also:

Tabelle1.IMG.Picture = usrfrmBild.img1 .Picture

Das funktioniert sogar soweit.

Nun liegen im Userform ja Bilder 1 - X

Über eine Datenbankabfrage ergibt sich nun, dass für den Anwendungsfall Bild Nummer 4 genommen werden soll:

Tabelle1.IMG.Picture = usrfrmBild.img4  .Picture


In der Datenbank ist jedoch nur die BildID (1-X) hinterlegt.

Ich muss nun also irgendwie mit der über ein Recordset abgegriffenen BildID 4 das Userform-Bild abgreifen:

Tabelle1.IMG.Picture = usrfrmBild.img & rst.Fields("BildID").value  

Ich habe versucht den rechten Teil als String zusammen zu führen - geht auch logischerweise (strImage = "usrfrmBild.img" & rst.Fields("BildID").value &" .Picture"), aber die Zuweisung an Tabelle1.IMG.Picture schlägt damit fehl.

Natürlich könnte ich jetzt eine Case Anweisung oder zig IF's nehmen, ich wollte das aber irgendwie eleganter lösen, weil beim hinzufügen von BildID's in der Datenbank (x+1), bzw. dann auch in dem Userform die realen Bilder (IMG x+1) dann auch jedesmal die nachfolgende Anweisung mit ausgebaut werden müsste, was den Code im Laufe der Zeit immer länger werden lässt.

IF  rst.Fields("BildID").value = 1 then   
Tabelle1.IMG.Picture = usrfrmBild.img1 .Picture
ElseIf rst.Fields("BildID").value = 2 then  
Tabelle1.IMG.Picture = usrfrmBild.img2 .Picture
ElseIf rst.Fields("BildID").value = X then  
Tabelle1.IMG.Picture = usrfrmBild.imgX .Picture
ElseIf rst.Fields("BildID").value = X+1 then  
Tabelle1.IMG.Picture = usrfrmBild.imgX+1 .Picture

...

Ich hoffe ich konnte mein Problem verständlich beschreiben und ihr habt eine Lösung...


Danke sehr für eure Mühe!

Content-Key: 373017

Url: https://administrator.de/contentid/373017

Printed on: April 19, 2024 at 20:04 o'clock

Member: Friemler
Friemler May 04, 2018 at 08:29:37 (UTC)
Goto Top
Moin,

meine Glaskugel sagt, das es sich um Access-VBA handelt. In dem Fall schau Dir mal die EVAL-Funktion an.

Grüße
Friemler
Member: SlainteMhath
SlainteMhath May 04, 2018 at 10:00:15 (UTC)
Goto Top
Moin.

EVAL... pfui :P

Schau mal hier: http://www.ozgrid.com/VBA/control-loop.htm

wenn ich mich recht Erinnere kannst du auch direkt über Me.Controls["ControlName"] auf das Control im Form zugreifen.

lg,
Slainte
Member: Friemler
Friemler May 04, 2018 at 12:25:34 (UTC)
Goto Top
Zitat von @SlainteMhath:

EVAL... pfui :P

face-smile

Schon klar, EVAL ist Quick 'n Dirty und wenn Fehler im auszuführenden Code sind wird es haarig. Aber um einen Einzeiler auszuführen ist das doch wohl tolerabel... face-wink

Grüße
Friemler
Member: SlainteMhath
SlainteMhath May 04, 2018 at 12:48:51 (UTC)
Goto Top
Schon klar, EVAL ist Quick 'n Dirty und...
Kennst du den kleinen Bobby Tables? Das ist der Neffe vom Eval face-smile
Member: Friemler
Friemler May 04, 2018 at 12:57:45 (UTC)
Goto Top
Kenn' ich, aber der Vergleich hinkt etwas. Beim guten Bobby wird User Input in eine SQL-Anweisung "injiziert", beim hiesigen Anwendungsfall wird das Ergebnis einer Datenbankabfrage zur Erzeugung von VBA-Code verwendet. Wenn die Datenbank natürlich "bösartigen" VBA-Code als Ergebnis für die Abfrage eine Bild-ID zurückliefert, hat man als Entwickler sowieso etwas falsch gemacht...
Member: Aximand
Aximand May 25, 2018 at 06:15:32 (UTC)
Goto Top
Hallo, komme erst jetzt darauf zurück, da ich das nicht hauptberuflich mache und ich auch kein Entwickler bin und mir das irgendwie selbst beibringen muss. Bzw. euch fragen.

Es handelt sich um Excelm nicht Access. Das mit dem Control verstehe ich derzeit noch nicht, was damit gemeint ist.


If rst.Fields("BilddateiID").Value = 1 Then  
visuelleDarstellung.ImgAbHa.Picture = frmAbHaBilder.img1.Picture
ElseIf rst.Fields("BilddateiID").Value = 2 Then  
visuelleDarstellung.ImgAbHa.Picture = frmAbHaBilder.img2.Picture
ElseIf rst.Fields("BilddateiID").Value = 3 Then  
visuelleDarstellung.ImgAbHa.Picture = frmAbHaBilder.img3.Picture
ElseIf rst.Fields("BilddateiID").Value = 4 Then  

Ich dachte, wenn ich aus der Datenbank die Bildnummer als Ziffer bekomme könnte ich das angesprochene Element irgendwie zusammenschustern:

Wenn rst.(XX).Value = Z dann irgendwas = Formular.BildZ.Picture
Member: Friemler
Friemler May 25, 2018 updated at 13:34:33 (UTC)
Goto Top
Hallo,

in Excel gibt es keine EVAL-Anweisung, die mit der von Access vergleichbar wäre. Du musst also die Lösung von @SlainteMhath nehmen.

Ich mache nicht viel mit VBA und kann somit nicht sagen, ob folgendes funktioniert. Ansonsten mal auf der von @SlainteMhath verlinkten Seite stöbern.
visuelleDarstellung.ImgAbHa.Picture = usrfrmBild.Controls("img" & rst.Fields("BildID").value).Picture

Evtl. muss
usrfrmBild.Controls("img" & rst.Fields("BildID").value)
zuerst noch per Typecast in den passenden Datentyp konvertiert werden, damit Du die Picture-Eigenschaft auch benutzen kannst.

Erklärungsversuch: In der Form gibt es eine Collection Controls, über die alle Bedien- bzw. Steuerelemente (eben die Controls) per Name angesprochen werden können (der Name kann als Index für die Collection verwendet werden). Da der Name als String angegeben werden muss, kann er dynamisch zur Laufzeit "zusammengebaut" werden.

Grüße
Friemler