3 Zellen auslesen und weiterverarbeiten

  • Excel

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Andyvankenandy.

    3 Zellen auslesen und weiterverarbeiten

    Hallo Ihr!
    Gut das es dieses Forum gibt!

    245 4000 50 1

    300 4000 63 2

    420 4000 63 3

    Das ist eine Tabelle, die Kommas trennen die Zeilen in Spalten.
    Die ersten 3 Spalten sind über eine Dropbox einstellbar. Die 4. Spalte ist das Produkt, dass ich zum einen als Name in ein bestimmtes Feld auftauchen lassen möchte, zum anderen möchte ich eine Grafik erscheinen lassen. Wie mache ich das am Besten? Wie kann ich die Grafiken/Tabellen die ich habe, auf einem anderen Blatt ablegen? Möchte die Grafiken/Tabellen nicht auf dem selben Blatt(Worksheet heißt das glaub ich) haben.

    Mit einer Variablen(linke Spalte) krieg ich das hin:



    Private Sub ComboBox1_Change()
    'Application.ScreenUpdating = False
    Range("A25").Select
    anzahl = ActiveCell.Value

    Select Case anzahl
    Case "245":
    Shapes("Bild 1").Visible = True
    Shapes("Bild 2").Visible = False
    Shapes("Bild 3").Visible = False
    Case "300":
    Shapes("Bild 1").Visible = False
    Shapes("Bild 2").Visible = True
    Shapes("Bild 3").Visible = False
    Case "420":
    Shapes("Bild 1").Visible = False
    Shapes("Bild 2").Visible = False
    Shapes("Bild 3").Visible = True
    Case Else:
    MsgBox "Diese Kombination der Werte ist unzulässig!"
    End Select


    End Sub

    In Feld A25 hab ich über die Dropbox den Wert reingeschrieben. Jetzt fehlen mir die anderen beiden Spalten. Kann ich das irgendwie über ne IF-Funktion machen?

    Edit by ~blaze~:
    Falsches Unterforum
    -->*Thema aus Grundlagen verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Andyvankenandy“ ()

    Willkommen im Forum. :thumbup:
    Wenn Du möchtest, dass Dir geholfen wird, musst Du Dein Problem so beschreiben, dass wir es auch so verstehen, wie Du es meinst.
    Wo also liegt das Problem?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    :) Ja, ich dachte das Makro würde mein Anliegen besser beschreiben, als ich es beschreiben kann. Aber ich versuch es gerne nochmal. Das Tool ist eine Hilfestellung über Parameter das richtige Produkt auszusuchen. Ich habe 3 Dropboxen in denen ich Werte auswählen kann. Wenn sie in einer gewissen Kombination zueinander stehen, z.B. 245, 4000, 50, dann soll eine Grafik(von dem Produkt1) die auf einem anderen Blatt/Register hinterlegt ist, auftauchen. Wenn es eine ungültige Kombination ist, soll eine Messagebox auftauen. Dann möchte ich zusätzlich noch den Namen des Produktes einblenden. So besser?
    Ja, besser.
    Nun beschreib, was Du hast, wie es gehen soll und was passiert bzw. nicht passiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry, wenn ich hier im falschen Forum bin. Ich weiß auch nicht wo ich sonst hin soll :)

    Also, ne einfache if funktion zwischen den Werten schaffe ich:

    If Range("A25") = "245" And Range("A27") = "4000" And Range("A29") = "50" Then
    Tabelle3.Range("C20").Interior.ColorIndex = 28
    End If

    Aber wie ich dann eine Grafik auftauchen lasse, bekomme ich nicht hin. Und es funktioniert nur einmal und lässt sich nicht wiederholen. Also brauche ich den if-Befehl in der Kombination mit dem Select-Befehl. Den Select-Befehl habe ich ja schon in der Prozedur: Private Sub ComboBox1_Change(), siehe oben. Das Zahlenwirrwar im ersten Beitrag soll eine Tabelle sein, vielleicht habe ich da schon die Verwirrung reingebracht.

    Parameter 1, Parameter 2, Parameter 3, Produkttyp

    245, 4000, 50, 1

    300, 4000, 63, 2

    420, 4000, 63, 3


    Jetzt klar?
    Hallo Leute! Was genau fehlt euch bei der Überlegung? Bei anderen Beiträgen wird doch auch rege geantwortet. Für einen Experten ist die Anforderung doch ein Klacks. Fragt mich doch bitte welche Infos fehlen, jeder Anfänger tut sich schwer das zu beschreiben - was er will. Vielleicht gehe ich auch den falschen Weg, und Exel kann das anders besser?

    Ich versuch es noch mal zu beschreiben: Das (Exel-)Tool soll für den User eine Hilfe bei der Wahl des richtigen Produktes sein. Wenn er das Tool aufmacht, muss er 3 verschiedene Werte(Parameter 1/Parameter 2/Parameter3) über Tropbox einstellen. Es gibt 6 gültige Kombination der 3 Werte, das heißt 6 Produkte. Für jede gültige Einstellung der 3 Dropboxen, soll das jeweilige Produkt grafisch und textmäßig dargestellt werden. Wie kann ich das machen?

    Andyvankenandy schrieb:

    Bei anderen Beiträgen wird doch auch rege geantwortet.

    [...]

    Andyvankenandy schrieb:

    und Exel

    Gelle?

    Wir haben nicht SO viele VBA/Excel Experten wie wir VB.Net "Experten" haben. Hauptsächlich sind das ein paar "Oldies" (kein Stein, da selber einer), die aber manchmal nicht ganz so "aktiv" sind wie die "youngsters". Kommt noch dazu dass du im falschen Forum angefangen hast und somit bei einigen evtl nicht auf dem Radar warst, als dein Thread "neu" war. Na jedenfalls tauchst du jetzt "oben" und im richtigen Forum auf. Also: Geduld ;)
    Moin, Moin.
    Frage: Wieso 3 Dropboxen mit diversen Verschiedenen Werten, wenn ja doch nur 6 Werte benötigt werden?
    Das könnte man doch zusammen streichen?
    Ansonsten würde sich evt ein Dictonary anbieten?

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub MontagIstEinSchönerTag()
    3. Dim dicKey, dicObj As Object
    4. Dim i As Integer
    5. Set dicObj = CreateObject("Scripting.Dictionary")
    6. dicObj.Add "245 4000 50", "Produkt Hamster"
    7. dicObj.Add "300 4000 63", "Produkt SadoMasoSex"
    8. dicObj.Add "420 4000 63", "Krüger ist was ich möchte!"
    9. dicKey = dicObj.keys
    10. For i = 0 To dicObj.Count - 1
    11. MsgBox (dicKey(i))
    12. MsgBox (dicObj.Item(dicKey(i)))
    13. Next
    14. End Sub

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

    Vielen Dank für die Antwort!

    Der Ansatz ist super. Aber ich muss dem Anwender die Möglichkeit geben die 3 Parameter auszuwählen(will ich jetzt nicht näher ausführen). Außerdem gibt es immer noch Sonderfälle und es sollen noch im 2. Schritt zusätzliche Produktmerkmale aufgezeigt werden. Leider versteh ich dein Makro nicht und kann es jetzt nicht auf meine Bedürfnisse umschreiben. So ganz einfach ist das nicht möglich?:

    Ist Dropbox 1 = Wert xx und Dropbox 2 = Wert xy und Dopbox 3 = xz dann Grafik 1 = True

    oder

    Ist Dropbox 1 = Wert yx und Dropbox 2 = Wert yy und Dopbox 3 = yz dann Grafik 2 = True

    oder usw.

    Und das ganze in eine Schleife, das er ständig abfragt....

    Edit: Ich glaub du hast jetzt nur ein Objekt deglariert und wirfst es nach und nach aus. Aber eine Abfrage nach den Wertebereichen(z.B. 245 4000 50) ist da nicht enthalten?

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

    Ja das ist ja mit dem dictonary möglich ;)
    Du erstellst am Anfang dein Dictonary mit den Produkten (Kombinationen) die es gibt.. in deinem Fall halt die 6 Stück.. denen ordnest du dann... ka zum beispiel den Pfad zu der Grafik zu.
    Dann erstellst du halt bei auswahl der werte der Komboboxen eine Variable aus den 3 werten. z.B im ChangeEvent der Combobox

    Visual Basic-Quellcode

    1. DeinKey = Combobox1 + Combobox2 + Combobox3

    das is dein Key... danach suchte dann in deinem Dictonary und weist der Grafik dann entsprechend die grafik zu die du da findest ;)
    Puh, nach dem Moto: Ich kenne die Worte aber ich erkenne den Sinn nicht.

    Genau das was du da beschreibst brauch ich. :) Aber wie das Makro dazu aussieht, kann ich mir nur in meinen Träumen ausmalen. Ich habe jetzt versucht mir das selbst zu erarbeiten, aber ich stoß da an meine Grenzen. Kannst du mir vielleicht mal den Ansatz des Makros schreiben, die Fleißarbeit mach ich dann selbst? Da wäre ich dir sehr dankbar für!
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim dicKey, dicObj As Object
    3. Private Sub ComboBox1_Change()
    4. Call SetPicturePath
    5. End Sub
    6. Private Sub ComboBox2_Change()
    7. Call SetPicturePath
    8. End Sub
    9. Private Sub ComboBox3_Change()
    10. Call SetPicturePath
    11. End Sub
    12. Sub SetPicturePath()
    13. Dim aktAuswahlKey As String
    14. aktAuswahlKey = ComboBox1.Text & ComboBox2.Text & ComboBox3.Text
    15. Dim i As Integer
    16. For i = 0 To dicObj.Count - 1
    17. If aktAuswahlKey = dicKey(i) Then
    18. Label1.Picture = LoadPicture(dicObj.Item(dicKey(i)))
    19. Label1.Caption = ""
    20. Exit Sub
    21. End If
    22. Next i
    23. Label1.Picture = Nothing 'nix passendes gefunden
    24. Label1.Caption = "Kein passendes Produkt"
    25. End Sub
    26. Private Sub UserForm_Initialize()
    27. Set dicObj = CreateObject("Scripting.Dictionary")
    28. dicObj.Add "245400050", "Bild1.jpg"
    29. dicObj.Add "300400063", "Bild2.jpg"
    30. dicObj.Add "420400063", "Bild3.jpg"
    31. dicKey = dicObj.keys
    32. With ComboBox1
    33. .AddItem "245"
    34. .AddItem "300"
    35. .AddItem "420"
    36. End With
    37. With ComboBox2
    38. .AddItem "4000"
    39. End With
    40. With ComboBox3
    41. .AddItem "50"
    42. .AddItem "63"
    43. End With
    44. End Sub

    Die Bilder musste natürlich noch auf dein Bilder (mit Pfad natürlich) anpassen. etc...
    Wow! Das is ja Hammer!

    Ich versuch es gerade mal nach zu vollziehen. Ich versteht nicht ganz, wieso die definierten Bild1/Bild2/Bild3 in der Dictonary, nicht in der For-Schleife auftauchen. Meine erstes Bild heißt Grafik 1 und liegt testweise einfach mit auf dem richtigen Blatt. Wo muss ich das reinschreiben? Sorry, für meine Dummheit.
    Ein Dictionary ist ein "Nachschlagewerk" mit der einfachen Zuordnung von einem Key (in diesem fall deiner Zahlenkombi) und einem dazu gehörigem Item (in diesem Fall der Pfad zu einem Bild).
    In der Schleife taucht das ganze nicht auf, damit du keine kilometerlange If..then..else..elseif oder select..case abfrage basteln musst. sondern nur einen kurzen Code hast, der einfach deine Eingabe mit den Keys deines Dictonary vergleicht und dann das passende Item zurückgibt.
    Hat den großen Vorteil: Wenn du später Zahlenkombis hinzufügen willst, brauchste das nur am Anfang des Programms zu machen, also ne neue zeile hinzufügen mit nem neuen Key und Item und fertig...
    Soweit ich weiß kannste als picture bei VBA nur Bilder laden... schau mal in der Hilfe nach.. aber ich meine Grafiken ausm Worksheet geht nicht.
    Option Explicit

    Dim dicKey, dicObj As Object

    Private Sub ComboBox1_Change()
    Call SetPicturePath
    End Sub

    Private Sub ComboBox2_Change()
    Call SetPicturePath
    End Sub

    Private Sub ComboBox3_Change()
    Call SetPicturePath
    End Sub

    Sub SetPicturePath()
    Dim aktAuswahlKey As String
    aktAuswahlKey = ComboBox1.Text & ComboBox2.Text & ComboBox3.Text
    Dim i As Integer
    For i = 0 To dicObj.Count - 1
    If aktAuswahlKey = dicKey(i) Then
    Shapes("Grafik i").Visible = True

    Exit Sub
    End If
    Next i
    MsgBox "Diese Kombination der Werte ist unzulässig!"

    End Sub

    Private Sub UserForm_Initialize()
    Set dicObj = CreateObject("Scripting.Dictionary")
    dicObj.Add "245400050", "Grafik 1" '8DN9-2
    dicObj.Add "300400063", "Grafik 2" '8DN9-6
    dicObj.Add "420400063", "Grafik 2" '8DQ1-6
    dicObj.Add "420500063", "Grafik 3" '8DQ1-1
    dicObj.Add "550500063", "Grafik 3" '8DQ1-1
    dicObj.Add "420500080", "Grafik 4" '8DQ1-8
    dicObj.Add "420630080", "Grafik 4" '8DQ1-8
    dicKey = dicObj.keys
    With ComboBox1
    .AddItem "245"
    .AddItem "300"
    .AddItem "420"
    .AddItem "550"
    End With
    With ComboBox2
    .AddItem "4000"
    .AddItem "5000"
    .AddItem "6300"
    End With
    With ComboBox3
    .AddItem "50"
    .AddItem "63"
    .AddItem "80"
    End With
    End Sub



    Hab mal getan wie ich gedacht habe, Laufzeitfehler 91 ;). Hab einfach gedacht ich könnte das Label ersetzten mit Grafik i. Ganz oben das erste Makro/Beitrag, da hat es so funktioniert...

    Vielen Dank für deine Erklärungen...
    Du könntest anstatt ein Dictionary-Objekt eine Collection verwenden.
    Der kannst du auch Objekte unterjubeln.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim Images as New Collection
    3. Private Sub ComboBox1_Change()
    4. If Not SetPicturePath Then MsgBox "kein Bild vorhanden"
    5. End Sub
    6. Private Sub ComboBox2_Change()
    7. If Not SetPicturePath Then MsgBox "kein Bild vorhanden"
    8. End Sub
    9. Private Sub ComboBox3_Change()
    10. If Not SetPicturePath Then MsgBox "kein Bild vorhanden"
    11. End Sub
    12. Function SetPicturePath() As Boolean
    13. Dim aktAuswahlKey As String
    14. aktAuswahlKey = ComboBox1.Text & ComboBox2.Text & ComboBox3.Text
    15. On Error Resume Next
    16. Label1.Picture = Images(aktAuswahlKey)
    17. SetPicturePath= (Err.Number=0)
    18. End Sub
    19. Private Sub UserForm_Initialize()
    20. Images.Add Image1, "245400050" 'Picture-Objekt
    21. Images.Add Image2, "300400063"
    22. ... weitere Bilder
    23. ... Combobox füllen wie oben
    24. End Sub

    Nur so als Anhaltspunkt.
    Noch besser ist, im Fehlerfall ein Standardbild zu laden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Fühl mich echt dumm wie Brot.

    Wenn ich : Shapes("Grafik 1").Visible = True - schreibe, dann is das für mich absolut verständlich wie das funktioniert. Aber ich bekomme das nicht in die Schleife gebettet. Ich versteh das so, die Schleife zählt um i hoch, und dann wird das Label mit der Grafik i gefüllt? Aber was passiert bei ...caption? Warum sag ich dann nicht nach "Next i" einfach: MsgBox "Diese Kombination der Werte ist unzulässig!" Warum muss ich hier wieder mit Label arbeiten?