Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Werte aus For-Schleife speichern

VBA Werte aus For-Schleife speichern
10.02.2022 09:07:19
Wagner
Hallo zusammen,
über eine Listbox kann ich über Funktion fmMultiSelectMulti mehrere id´s anwählen.
Ich nächsten Schritt sucht er mir in der folgenden For-Schleifer zu jeder dieser id welche in Spalte B stehen die dazu gewünschten Werte aus deren Zeile.
Bsp: er sucht die ID welche in der Listbox gewählt wurde in Spalte B:B. Wenn die ID gefunden wurde, gibt er mir den Wert zur id aus Spalte Y aus.
Ich möchte jeden Wert der gefunden wurde hintereinander abspeichern als Vektor oder ähnliches.
Ziel ist es eine Reihe an Werte zu erhalten und diese als Bar-Chart zu plotten.

Private Sub Auswerten_Click()
Dim Diagramm As Shape
lastRow = Sheets("Messübersicht").Cells(Rows.Count, 9).End(xlUp).Row
Dim text As String
Dim i As Integer
For i = 0 To Me.ListBox_MessID.ListCount - 1
If Me.ListBox_MessID.Selected(i) Then
text = text & Me.ListBox_MessID.List(i) & vbNewLine
Set foundRng = Sheets("Messübersicht").Range("B:B").Find(Me.ListBox_MessID.List(i))
MsgBox foundRng.Address
PMWERT = Sheets("Messübersicht").Cells(foundRng.Row, foundRng.Column + 22).Value
End If
Next i
End Sub
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Werte aus For-Schleife speichern
10.02.2022 09:23:17
Rudi
Hallo,
foundRng.Column + 22 ergibt aber 24 ="X", nicht Y.

Private Sub Auswerten_Click()
Dim text As String
Dim i As Integer
Dim PMWert
Dim lastRow As Long
Dim Diagramm As Shape
lastRow = Sheets("Messübersicht").Cells(Rows.Count, 9).End(xlUp).Row
With Me.ListBox_MessID
For i = 0 To .ListCount - 1
If .Selected(i) Then
text = text & .List(i) & vbNewLine
Set foundRng = Sheets("Messübersicht").Range("B:B").Find(.List(i))
MsgBox foundRng.Address
PMWert = PMWert & vbCrLf & foundRng.Offset(, 22).Value  'Werte sammeln
End If
Next i
End With
PMWert = Split(Mid(PMWert, 2), vbCrLf)  'AusgabeArray
'Sheets(1).Cells(1, 1).Resize(, UBound(PMWert) + 1) = PMWert 'in Blatt schreiben
End Sub
Gruß
Rudi
Anzeige
AW: VBA Werte aus For-Schleife speichern
10.02.2022 09:49:27
Wagner
Sry das war ein Tippfehler von mir. Danke für denn Hinweis
warum offen? owT
10.02.2022 11:32:35
Rudi
AW: warum offen? owT
10.02.2022 11:53:05
Wagner
Hallo,
Danke für deine Antwort. Leider ist die Variable PMWert nun ein String.
Kannst du mir hier helfen das umzuwandeln, da ich die Zahlen aus PMWert über einen Bar-Chart plotten möchte
Besten Dank!
Anzeige
AW: warum offen? owT
10.02.2022 12:10:44
Rudi
Hallo,
nö, ein Array.

PMWert = Split(Mid(PMWert, 2), vbCrLf)  'AusgabeArray
Das kannst du wie gezeigt in deine Tabelle schreiben.
Gruß
Rudi
AW: warum offen? owT
10.02.2022 12:57:21
Wagner
Gibt es eine Möglichkeit die Werte untereinander zu schreiben statt wie hier gezeigt nebeneinander?
Danke dir!
Anzeige
sicher gibt es die Möglichkeit
10.02.2022 13:35:46
Rudi
Sheets(1).Cells(1, 1).Resize(UBound(PMWert) + 1) = Application.Transpose(PMWert) 'in Blatt schreiben
VBA gut?
Gruß
Rudi
AW: sicher gibt es die Möglichkeit
10.02.2022 13:47:40
Wagner
Danke !
;
Anzeige
Anzeige

Infobox / Tutorial

VBA Werte aus For-Schleife speichern und darstellen


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. UserForm mit ListBox erstellen:

    • Füge eine ListBox zu deinem UserForm hinzu und stelle den MultiSelect-Modus auf fmMultiSelectMulti.
  3. Code einfügen:

    • Füge den folgenden VBA-Code in das UserForm ein, um die Werte zu sammeln und in einer Array-Variable zu speichern.
Private Sub Auswerten_Click()
    Dim PMWert As Variant
    Dim lastRow As Long
    Dim i As Integer
    Dim foundRng As Range

    lastRow = Sheets("Messübersicht").Cells(Rows.Count, 9).End(xlUp).Row
    Dim text As String
    text = ""

    With Me.ListBox_MessID
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                text = text & .List(i) & vbNewLine
                Set foundRng = Sheets("Messübersicht").Range("B:B").Find(.List(i))
                If Not foundRng Is Nothing Then
                    PMWert = PMWert & vbCrLf & foundRng.Offset(, 22).Value  'Werte sammeln
                End If
            End If
        Next i
    End With

    PMWert = Split(Mid(PMWert, 2), vbCrLf)  'AusgabeArray
    Sheets(1).Cells(1, 1).Resize(UBound(PMWert) + 1) = Application.Transpose(PMWert) 'in Blatt schreiben
End Sub
  1. Diagramm erstellen:
    • Erstelle ein Diagramm, um die gesammelten Werte aus dem Array darzustellen.

Häufige Fehler und Lösungen

  • Problem: Variable PMWert ist ein String.

    • Lösung: Stelle sicher, dass du die Werte mit Split in ein Array umwandelst, wie im obigen Code gezeigt.
  • Problem: Werte werden nebeneinander statt untereinander geschrieben.

    • Lösung: Verwende Application.Transpose(PMWert), um die Werte in einer Spalte anzuzeigen.

Alternative Methoden

  • Verwendung von Collections: Anstelle eines Arrays kannst du eine Collection verwenden, um die Werte zu speichern. Dies bietet mehr Flexibilität, da Collections dynamisch wachsen können.
Dim PMCollection As New Collection
  • Datenbankmethoden: Wenn du mit großen Datenmengen arbeitest, könnte es sinnvoll sein, eine Datenbank wie Access zu verwenden, um die Daten effizienter zu verwalten und zu visualisieren.

Praktische Beispiele

  • Beispiel 1: Wenn du IDs aus einer ListBox hast und die entsprechenden Werte in Spalte Y (22 Spalten nach B) abfragen möchtest, kannst du den oben angegebenen Code verwenden.

  • Beispiel 2: Um die gesammelten Werte in einem Bar-Chart darzustellen, gehe zu Einfügen -> Diagramm und wähle Balkendiagramm aus. Die Datenquelle kannst du auf den Bereich setzen, in dem die Werte geschrieben wurden.


Tipps für Profis

  • Fehlerbehandlung: Implementiere Fehlerbehandlung mit On Error Resume Next, um zu verhindern, dass das Makro bei einem nicht gefundenen Wert abbricht.

  • Performance: Deaktiviere die Bildschirmaktualisierung während des Ausführens des Codes mit Application.ScreenUpdating = False, um die Performance zu verbessern.

Application.ScreenUpdating = False
'... dein Code ...
Application.ScreenUpdating = True

FAQ: Häufige Fragen

1. Wie kann ich die Werte in einer bestimmten Zeile starten? Du kannst den Zielbereich für die Ausgabe ändern, indem du Cells(1, 1) anpasst, um die Zeile und Spalte zu ändern.

2. Was kann ich tun, wenn die ListBox keine Werte anzeigt? Überprüfe, ob die ListBox richtig mit Daten gefüllt wurde und ob der MultiSelect-Modus korrekt eingestellt ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige