Anzeige
Archiv - Navigation
1940to1944
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array als debug print ausgeben.

Array als debug print ausgeben.
24.08.2023 09:20:27
sternbj
Mein Code macht nicht was er soll.
Es soll für alle werte die in der Textbox txt_mp stehen den Wert in Spalte A suchen, dann je nachdem welcher Wert in der Combobox ausgewählt wird den Wert aus spalte 4 oder 5 nehmen. Danach soll nach diesem Wert gefiltert werden und alle Zeilen in ein Array geschrieben werden. Das gleich soll für alle folgenden Werte aus txt_mp geschehen. Zum schluss möchte ich das gesammte Array in eine Tabelle schreiben und mittelwerte aus den Daten berechnen. Irgendwie hab ich aber einen bug drin. Ich finde ihn allerdings nicht und würde gerne den inhalt des Arrays als debug.Print anweisung sichtbar machen, denn offensichtlich ist da irgendwo der Käfer drin. Ich habe es allerdings nicht geschaft.

Konkret geht es um diesen Abschnitt:

        ' Schleife durch die gefilterten Zeilen

Dim row As Range
For Each row In ws.UsedRange.Offset(1, 0).Resize(ws.UsedRange.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows
' Gesammelte Werte in die Arrays einfügen (ganze Zeile)
For col = 1 To numCols
Debug.Print ("numCols (Anzahl der Spalten)= " & numCols & " Zellenwerte = " & row.Cells(1, col).value & "col = " & col)
collectedValues(rowIndex, col) = row.Cells(1, col).value
Next col
rowIndex = rowIndex + 1
Debug.Print ("rowIndex = " & rowIndex)
Next row
Next i


der Kontext als das gesamte Sub sieht so aus:

Public Sub FilterAndComputeValues(originalWorkbook As Workbook, cmb_mp As Object, txt_pos As Object, txt_mp As Object)

Dim ws As Worksheet
Set ws = originalWorkbook.Sheets(2)

' Debug: Arbeitsblatt
Debug.Print "Arbeitsblatt: " & ws.Name

' Anzahl der befüllten Zeilen und Spalten ermitteln
Dim numRows As Long
Dim numCols As Long
numRows = ws.Cells(Rows.Count, 1).End(xlUp).row
numCols = ws.Cells(1, Columns.Count).End(xlToLeft).Column

' Debug: Anzahl der Zeilen und Spalten
Debug.Print "Anzahl der Zeilen: " & numRows & "; Anzahl der Spalten: " & numCols

' Einsetzen der spezifischen Werte
ws.Cells(1, 1).value = "Messpunkt"
ws.Cells(1, 2).value = "Layoutvariante"

' Erste Zeile fixieren
ws.Rows("2:2").Select
ActiveWindow.FreezePanes = True

' Filter setzen
ws.Rows("1:1").Select
Selection.AutoFilter

' Extrahieren der Komma separierten Werte
Dim mp_values() As String
mp_values = Split(txt_mp.value, ",")
' Debug: Komma separierte Werte
Debug.Print "Komma separierte Werte: " & Join(mp_values, ", ")

' Arrays zum Speichern der Werte
Dim collectedValues() As Variant
ReDim collectedValues(1 To numRows, 1 To numCols) ' Verwenden Sie numCols für die maximale Größe

Dim rowIndex As Long
rowIndex = 1

' Schleife über die Werte
For i = LBound(mp_values) To UBound(mp_values)
Debug.Print "i= " & i & "; mp_values(i)= " & mp_values(i)
Dim searchRow As Long
On Error Resume Next
searchRow = Application.WorksheetFunction.Match(CLng(Trim(mp_values(i))), ws.Columns("A"), 0)
Debug.Print ("searchrow= " & searchRow)
On Error GoTo 0

If searchRow = 0 Then
MsgBox "Messpunkt " & Trim(mp_values(i)) & " nicht gefunden.", vbCritical
Exit Sub
End If

Dim searchValue As Variant
If cmb_mp.value = "Flat oben oder unten" Then
searchValue = ws.Cells(searchRow, 4).value
ws.Range("1:1").AutoFilter Field:=4, Criteria1:=searchValue
ws.Range("1:1").AutoFilter Field:=2, Criteria1:=CLng(txt_pos.value)
ElseIf cmb_mp.value = "Flat links oder rechts" Then
searchValue = ws.Cells(searchRow, 5).value
ws.Range("1:1").AutoFilter Field:=5, Criteria1:=searchValue
ws.Range("1:1").AutoFilter Field:=2, Criteria1:=CLng(txt_pos.value)
End If

' Schleife durch die gefilterten Zeilen
Dim row As Range
For Each row In ws.UsedRange.Offset(1, 0).Resize(ws.UsedRange.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows
' Gesammelte Werte in die Arrays einfügen (ganze Zeile)
For col = 1 To numCols
Debug.Print ("numCols (Anzahl der Spalten)= " & numCols & " Zellenwerte = " & row.Cells(1, col).value & "col = " & col)
collectedValues(rowIndex, col) = row.Cells(1, col).value
Next col
rowIndex = rowIndex + 1
Debug.Print ("rowIndex = " & rowIndex)
Next row
Next i


' Filter entfernen
ws.AutoFilterMode = False

' Erstellen eines neuen Arrays mit der richtigen Anzahl von Zeilen
Dim newCollectedValues() As Variant
ReDim newCollectedValues(1 To rowIndex - 1, 1 To numCols)

' Kopieren Sie die Werte aus dem alten Array in das neue
For i = 1 To rowIndex - 1
For j = 1 To numCols
newCollectedValues(i, j) = collectedValues(i, j)

Next j
Next i

' Weisen Sie das neue Array dem alten Variablennamen zu
collectedValues = newCollectedValues

' Fügen Sie ein neues Arbeitsblatt mit dem Namen "ausgewertete Messdaten" hinzu
Dim newWs As Worksheet
Set newWs = originalWorkbook.Worksheets.Add(After:=originalWorkbook.Worksheets(originalWorkbook.Worksheets.Count))
newWs.Name = "ausgewertete Messdaten"

' Kopieren der ersten Zeile aus Sheet(2)
ws.Rows(1).Copy Destination:=newWs.Rows(1)


' Array in das neue Arbeitsblatt einfügen, beginnend ab Zeile 3
newWs.Range(newWs.Cells(2, 1), newWs.Cells(rowIndex + 1, numCols)).value = collectedValues ' Verwenden Sie numCols

' Mittelwerte der Spalten des Arrays berechnen und in das Arbeitsbuch eintragen
originalWorkbook.Sheets(1).Cells(5, 3).value = Application.WorksheetFunction.Average(ws.Columns(6).SpecialCells(xlCellTypeVisible))
originalWorkbook.Sheets(1).Cells(6, 3).value = Application.WorksheetFunction.Average(ws.Columns(7).SpecialCells(xlCellTypeVisible)) / 1000
originalWorkbook.Sheets(1).Cells(7, 3).value = Application.WorksheetFunction.Average(ws.Columns(8).SpecialCells(xlCellTypeVisible))
originalWorkbook.Sheets(1).Cells(8, 3).value = Application.WorksheetFunction.Average(ws.Columns(9).SpecialCells(xlCellTypeVisible))
originalWorkbook.Sheets(1).Cells(9, 3).value = Application.WorksheetFunction.Average(ws.Columns(10).SpecialCells(xlCellTypeVisible)) / 1000000
originalWorkbook.Sheets(1).Cells(10, 3).value = Application.WorksheetFunction.Average(ws.Columns(11).SpecialCells(xlCellTypeVisible))
originalWorkbook.Sheets(1).Cells(11, 3).value = Application.WorksheetFunction.Average(ws.Columns(12).SpecialCells(xlCellTypeVisible))
originalWorkbook.Sheets(1).Cells(12, 3).value = (Application.WorksheetFunction.Average(ws.Columns(14).SpecialCells(xlCellTypeVisible)) - Application.WorksheetFunction.Average(ws.Columns(13).SpecialCells(xlCellTypeVisible))) / 1000000

Dim cellValue As String
cellValue = ws.Cells(1, 13).value

' Debug: Zellwert
Debug.Print "Zellwert (1, 13): " & cellValue

If Len(cellValue) > 0 Then
originalWorkbook.Sheets(1).Cells(12, 2).value = "Bandbreite@" & Left(cellValue, 4) & " Rx [MHz]"
Else
originalWorkbook.Sheets(1).Cells(12, 2).value = "Bandbreite@----Rx [MHz]" ' Alternativer Text, wenn die Zelle A14 leer ist oder keinen Text enthält
End If

' Debug: Prozedur beendet
Debug.Print "Prozedur FilterAndComputeValues beendet."
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array als debug print ausgeben.
24.08.2023 09:26:17
sternbj
Sorry, vielleicht gibt es gar keinen Fehler. Ich muss es nochmal checken.
AW: Array als debug print ausgeben.
24.08.2023 09:29:49
Der Steuerfuzzi
Hallo,

warum möchtest Du den inhalt des Arrays mit Debug.Print ausgeben? Das Direktfenster ist vom Platz und Komfort eher "begrenzt" und es gibt andere Möglichkeiten, z.B.:
- Ausgabe in eine Tabelle
- Durchsicht der Werte im "Lokal-Fenster"

Grüße
Michael
Array als debug print ausgeben.
24.08.2023 11:04:04
daniel
Hi
für eindimensionale Arrays kann man JOIN verwenden:
Debug.Pring JOIN(arr, ", ")


bei zweidimensionalen Arrays braucht man eine Schleife über die Einzelwerte. Ein JOIN für zweidimenisionale Arrays kenne ich nicht.

dim z as long, s as long

for z = lbound(arr, 1) to ubound(arr, 1)
for s = lbound(arr, 2) to ubound(arr, 2)
debug.print arr(z, s), 'Werte einer Zeile mit TAB getrennt
next
debug.print 'neue Zeile
next


Gruß Daniel
Anzeige
Wie kann man eine ausgabe in einer tablle machen?
24.08.2023 09:48:03
sternbj
Vielen Dank für den Hinweis, das habe ich noch nie genutzt. Das Problem hat sich als kein Problem herausgestellt, alles funktioniert perfekt, aber ich würde mich interessieren wie man das nutzen kann. Ich habe auch nie das lokalfenster verwendet.
Ich kann nicht gut Coden. Ich kann einiges lesen, aber selber schreiben eher schlecht. Hab alles mit Chat GPT gemacht. was manchmal relativ gut funktioniert.
AW: Wie kann man eine ausgabe in einer tablle machen?
24.08.2023 10:34:22
Der Steuerfuzzi
Hm, ich dachte, Du wüsstest wie das geht, da Du im ersten Post geschrieben hast:
Zum schluss möchte ich das gesammte Array in eine Tabelle schreiben und mittelwerte aus den Daten berechnen.

Das Lokalfenster kannst Du (wenn es nicht schon angezeigt wird) im Menü unter "Ansicht" - "Lokal Fenster" einblenden. Wenn Du dann z. B. Haltepunkte im Code setzt oder den Code im Einzelschrittmodus durchgehst, kannst Du dort die Werte der Variablen ansehen.

Auch wenn ChatGPT teilweise ganz gute Ergebnisse liefert, ist es ratsam, sich so gut wie möglich mit der Materie auszukennen (Grundlagen Programmierung, Objekte in Excel, etc). Wenn Du also öfter in Excel programmieren willst, würde ich Dir raten, Dich damit zu beschäftigen. Kurse und Informationen gibt es genug im Netz. Wenn Du lieber Videos schaust, gibt es viel auf YouTube ansonsten gibt es auch ganz gute Online Kurse oder Bücher.

Hier mal ein ganz guter Einstieg, der auch den VBA-Editor ein wenig erklärt:
https://www.vba-tutorial.de/

Wie man ein zweidimensionales Array in die Tabelle schreibt hättest Du zwar ChatGPT fragen können, aber ich fürchte er hätte es mit einer (langsamen) Schleife gemacht. So kannst Du das machen (Voraussetzung ist, dass die Indizes des Arrays bei 1 beginnen, wenn sie bei 0 beginnen musst Du innerhalb von Resize jeweils 1 hinzuaddieren):
Sheets("Name des Blatts").Range("A1").Resize(UBound(MeinArray, 1), UBound(MeinArray, 2)).Value = MeinArray


Gruß
Michael
Anzeige
Wie kann man eine ausgabe in einer tablle machen?
24.08.2023 14:47:31
sternbj
Vielen Dank für den Beitrag,

ich habe schon vor ChatGPT Makros geschrieben, aber da ich das immer nur sporadisch mache vergesse ich immer wieder alles. Wie gesagt, lesen geht meist besser aber ich benötige es immer nur dann und wann, daher ist es schwierig sich tiefere Kenntnisse anzueignen.

Vielen Dank
Gruß
Jonathan

Links zu Excel-Dialogen

Anzeige

Infobox zum Thema

EXCEL - Array als Debug Print ausgeben


Inhaltsverzeichnis


Die Fragestellung


Du möchtest den Inhalt eines Arrays in VBA zur Fehlersuche in das Immediate-Fenster (Sofortfenster) ausgeben.


Erläuterung des Problems {#erläuterung-des-problems}


Beim Debuggen von VBA-Code kann es hilfreich sein, den aktuellen Inhalt eines Arrays zu sehen, um zu verstehen, wie sich die Daten während der Ausführung des Codes verändern.


Lösung des Problems {#lösung-des-problems}


Um ein Array in VBA zu debuggen und seinen Inhalt im Immediate-Fenster auszugeben, kannst du folgende Schritte durchführen:

Sub PrintArrayContent()
    Dim arr As Variant
    Dim i As Long
    Dim j As Long

    ' Ein Beispielarray
    arr = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9))

    ' Durch das Array iterieren und den Inhalt ausgeben
    For i = LBound(arr) To UBound(arr)
        For j = LBound(arr(i)) To UBound(arr(i))
            Debug.Print "Element [" & i & "][" & j & "]: " & arr(i)(j)
        Next j
        Debug.Print "----------" ' Trennlinie für die Übersichtlichkeit
    Next i
End Sub

Dieser Code geht davon aus, dass du ein zweidimensionales Array hast, bei dem jede "Zeile" ein eigenes Array ist. Die LBound- und UBound-Funktionen werden verwendet, um über alle Elemente des Arrays zu iterieren. Die Debug.Print-Anweisung gibt den Inhalt jedes Elements im Immediate-Fenster aus.


Anwendungsbeispiele aus der Praxis


  • Fehlerbehebung: Überprüfen der Werte in einem Array während der Laufzeit, um Fehler in der Logik zu finden.
  • Datenüberprüfung: Sicherstellen, dass die Daten korrekt in das Array geladen wurden, bevor weitere Operationen durchgeführt werden.

Tipps


  • Öffne das Immediate-Fenster in der VBA-Entwicklungsumgebung mit Strg+G, um die Ausgabe zu sehen.
  • Passe den Code an die Dimension deines Arrays an. Wenn du ein eindimensionales Array hast, entferne die innere Schleife.

Verwandte Themenbereiche


  • VBA-Debugging-Techniken
  • Arbeit mit Arrays in VBA
  • VBA-Entwicklungswerkzeuge

Zusammenfassung


Das Ausgeben des Inhalts eines Arrays im Immediate-Fenster ist eine nützliche Methode, um während der Entwicklung und Fehlersuche in VBA einen Einblick in die Datenstruktur zu erhalten. Der gezeigte Code kann als Basis dienen und je nach Bedarf und Komplexität des Arrays angepasst werden.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige