Bilder einblenden! Newbie braucht Hilfe!

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von timseN.

    Bilder einblenden! Newbie braucht Hilfe!

    Hallo ihr Experten,
    ich bin ein VBA-Beginner und habe folgendes Problem bzw. mir fällt nicht ein wie ich das machen kann ;) :

    Ich habe ein Zufallskartengeber erstellt (dies habe ich mithilfe eines CommandButtons gemacht) und möchte zusätzlich die Karten auch graphisch darstellen bzw. nur graphisch. D.h. wenn ich auf mein CommandButton klicke und ich da z.B. eine 7 bekomme, dann möchte ich, dass das Spielkartenbild erscheint.

    Ich bedanke mich schonmal im vorraus :D

    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „timseN“ ()

    Hi,
    riesen Danke schonmal!! Boah damit hast du mir echt geholfen, ich hätte da aber noch ein, zwei Fragen zu ;)

    Der Sub:

    Visual Basic-Quellcode

    1. Sub TestInsertPicture()

    gilt als Bestimmung wo das Bild gelagert ist, richtig?

    Der Sub:

    Visual Basic-Quellcode

    1. Sub InsertPicture()

    gilt als Bestimmung wo das Bild dargestellt wird, richtig?

    Der 2te Sub bewirkt ja, dass das Bild in Excel eingefügt wird..Aber ich verstehe die zwischenschritte nicht, warum das so ist ^^

    Visual Basic-Quellcode

    1. If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub
    2. If Dir(PictureFileName) = "" Then Exit Sub
    3. ' import picture


    Dieser Teil ist dazu da, um die Position und Größe zu bestimmen, aber welche Werte muss ich ändern, damit sich die Größe ändert? Und die Position ist doch aber schon im Sub TestInsertPicture oder nicht?

    Visual Basic-Quellcode

    1. Set p = ActiveSheet.Pictures.Insert(PictureFileName)
    2. ' determine positions
    3. With TargetCells
    4. t = .Top
    5. l = .Left
    6. w = .Offset(0, .Columns.Count).Left - .Left
    7. h = .Offset(.Rows.Count, 0).Top - .Top
    8. End With
    9. ' position picture
    10. With p
    11. .Top = t
    12. .Left = l
    13. .Width = w
    14. .Height = h
    15. End With
    16. Set p = Nothing


    Meine zweite Frage wäre:
    Könnte ich das nicht vereinfachen und in einem Sub schreiben? Indem ich das TestInsertPicture weglasse und gleich InsertPicture so deklariere, dass dort die Bildlagerung angegeben wird (so spare ich ja eigentlich einen Sub)?

    Eine kommt noch ;)
    Und was ist, wenn ich das mit einem anderen Sub verknüpfen möchte? Ich habe ja mein Kartengeber mit einem CommandButton erzeugt.. wenn ich die Subs verknüpfen möchte muss ich doch ein If-Befehl nutzen oder?

    Gruß und nochmals Danke
    InsertPicture ist die Routine, die das Bild einfügt.
    TestInsertPicture ist die Routine, die InsertPicture aufruft und mit Parametern füttert.

    Natürlich kannst du alles in eine Routine packen, aber das ist kontraproduktiv.

    Du hast die Grundlagen der modularen Programmierung nicht verstanden.
    Es geht nicht darum, möglichst viele Subs zu sparen, sondern universellen Code zu erzeugen, den du mit wenig Aufwand mehrfach verwenden kannst.

    An deiner Stelle würde ich InsertPictureInRange nehmen.
    Die Routine kannst du blind übernehmen und musst beim Aufruf nur die Bilddatei und die Zellpositionen angeben.
    Beispiel: InsertPictureInRange("c:\PikAs.gif", Range("F3:J8"))
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Tut mir echt Leid das ich mich so dumm anstelle^^

    So wenn ich das jetzt mache kommt "Fehler beim kompilieren"
    Bzw. muss ich ein eigenen Sub machen oder kann ich das als If-Anwendung machen?

    EDIT: Ah ok einen eigenen Sub muss ich erstellen... Wie oben schon geschrieben mit einem "Sub TestInsertPictureInRange()" und einem "Sub InsertPictureInRange()", du sagtest die daten kann ich einfach übernehmen =) Und in TestInsertPictureInRange() setze ich alle meine vorhandenen Bilder rein oder?
    schon wieder DANKE DANKE
    Aber die Verknüpfung zu dem CommandButton setze ich jetzt im InsertPictureInRange() Sub (If-Anwendung, quasi If f=1 Then) oder?

    Mein Kartengeber sieht momentan so aus

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. Dim Wert As Integer
    3. Dim f As Integer
    4. Dim fall(1 To 5) As String
    5. Dim i As Integer
    6. fall(1) = "Ass"
    7. fall(2) = "König"
    8. fall(3) = "Dame"
    9. fall(4) = "Bube"
    10. For i = 1 To 10
    11. Randomize
    12. Wert = Int((13 - 2 + 1) * Rnd + 2)
    13. If Wert = 13 Then
    14. f = 1
    15. Else
    16. If Wert = 12 Then
    17. f = 2
    18. Else
    19. If Wert = 11 Then
    20. f = 3
    21. Else
    22. If Wert = 10 Then
    23. f = 4
    24. Else
    25. f = 5
    26. fall(5) = Wert
    27. End If
    28. End If
    29. End If
    30. End If
    31. Worksheets("Tabelle1").Cells(1, 2).Value = fall(f)
    32. Next i
    33. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „timseN“ ()

    Irgendwie habe ich das Gefühl, dass dir jegliche Grundlagen der Programmierung noch fehlen.
    Willst du nicht lieber mit einem ganz einfachen Programm anfangen und nebenbei noch ein paar Grundlagen-Bücher reinziehen?

    An der Stelle wo du dein Bild einfügen willst, rufst du InsertPictureInRange auf. Meinetwegen in der Button_Click-Routine.
    Die TestInsertPictureInRange benötigst du überhaupt nicht.

    Falls du es je schaffst, wird dann deine nächste Frage sein, warum deine Datei immer grösser wird, weil du bei jedem Klick im Sheet ein neues Bild integrierst, ohne das alte zu löschen.
    Solange du nicht verstanden hast, was im Code abgeht, wirst du mit der Programmierung nicht glücklich werden.

    Sorry.



    Nachtrag:
    Ich habe eben festgestellt, dass die Funktion zumindest in Excel 2007 auch wesentlich einfacher geht:

    Visual Basic-Quellcode

    1. Public Function AddPictureIntoRange(ByVal PictureFile As String, ByVal Target As Range) As Shape
    2. Set AddPictureIntoRange = Target.Worksheet.Shapes.AddPicture(PictureFile, msoFalse, msoTrue, Target.Left, Target.Top, Target.Width, Target.Height)
    3. End Function


    Aufruf mit

    Visual Basic-Quellcode

    1. Set MyPic=AddPictureIntoRange("c:\Test.jpg",Range("A3:G7"))


    Danach kannst auf das Bild alle Methoden und Eigenschaften des Shape-Objekts anwenden. Zum Beispiel mit

    Visual Basic-Quellcode

    1. MyPic.Visible=False
    ausblenden usw.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()