Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zeilennummer in Array einlesen

Forumthread: Zeilennummer in Array einlesen

Zeilennummer in Array einlesen
19.10.2019 16:40:40
Theo
Hallo,
ich habe ein weiteres Problem. Und zwar will ich wenn eine Bedingung erfüllt ist die Aktuelle Zeile in ein array schreiben. Anschließend dann zu einem späteren Zeitpunkt in Spalte I (9) aller im Array gespeicherten Zeilen "0" einfügen und das Array wieder leeren.
Also ungefähr so:

Sub Auswerten()
**Array Leeren**
For Zeile = 1 To 1000
If Cells(Zeile, 2).Value = "Wahr" Then
**Füge Zeilennummer (Variable Zeile) in ein Array hinzu**
End If
Next Zeile
End Sub
Sub Späterer Zeitpunkt()
Cells(**Zeilen aus Array**, 9).Value = "0"
**Array Leeren**
End Sub

Wäre sehr dankbar um Hilfe! Danke!
Gruß,
Theo


		
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilennummer in Array einlesen
19.10.2019 17:05:49
Nepumuk
Hallo Theo,
teste mal:
Option Explicit

Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" ( _
    ByRef psa() As Any) As Long

Private mlngArray() As Long

Sub Auswerten()
    Dim Zeile As Long, ialngIndex As Long
    Dim avntTemp As Variant
    Erase mlngArray
    avntTemp = Range(Cells(1, 2), Cells(1000, 2)).Value
    For Zeile = 1 To 1000
        If avntTemp(Zeile, 1) Then
            Redim Preserve mlngArray(ialngIndex)
            mlngArray(ialngIndex) = Zeile
            ialngIndex = ialngIndex + 1
        End If
    Next Zeile
End Sub

Sub Späterer_Zeitpunkt()
    Dim ialngIndex As Long
    If SafeArrayGetDim(mlngArray) Then
        For ialngIndex = LBound(mlngArray) To UBound(mlngArray)
            Cells(mlngArray(ialngIndex), 9).Value = 0
        Next
        Erase mlngArray
    Else
        Call MsgBox("Keine Daten im Array.", vbExclamation, "Hinweis")
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: Zeilennummer in Array einlesen
19.10.2019 17:19:08
Theo
Hallo,
danke schon einmal für die Lösung!
Jedoch kommt die Fehlermeldung:
Der Code in diesem Projekt muss für die Verwendung auf 64-bit-Systemen aktualisiert werden. Überarbeiten und aktualisieren sie die Declare-Anweisungen, und markieren Sie sie mit dem PtrSafe-Attribut.
Er markiert die 3. und 4. Zeile in deinem Code rot. Also Declare Function
oleaut32.dll zu oleaut64.dll ändern funktioniert auf alle fälle nicht was ja fast zu erwarten war
Anzeige
AW: Zeilennummer in Array einlesen
19.10.2019 17:25:54
Nepumuk
Hallo Theo,
ändere die Importfunktion:
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" ( _
ByRef psa() As Any) As Long

so:
Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32.dll" ( _
ByRef psa() As Any) As Long

Gruß
Nepumuk
Anzeige
AW: Zeilennummer in Array einlesen
19.10.2019 17:39:03
Theo
Hallo,
Oke der Fehler wäre gelöst
Das Makro läuft zwar ab und der ialngIndex zählt hoch, aber es passiert nichts wenn ich die Sub Späterer Zeitpunkt aufrufe .
Was mach denn die Variant "avntTemp" genau ?
AW: Zeilennummer in Array einlesen
19.10.2019 17:41:01
Theo
Hab grad bemerkt ich habe einen anderen Fehler gemacht! Also funktioniert jetzt alles!
Viel Dank!
Gruß,
Theo
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Zeilennummer in Array einlesen und verarbeiten


Schritt-für-Schritt-Anleitung

  1. Makro zur Auswertung erstellen: Erstelle ein neues VBA-Modul und füge den folgenden Code ein, um die Zeilennummern in ein Array zu speichern.

    Sub Auswerten()
       Dim Zeile As Long, ialngIndex As Long
       Dim avntTemp As Variant
       Dim mlngArray() As Long
    
       Erase mlngArray
       avntTemp = Range(Cells(1, 2), Cells(1000, 2)).Value
    
       For Zeile = 1 To 1000
           If avntTemp(Zeile, 1) Then
               ReDim Preserve mlngArray(ialngIndex)
               mlngArray(ialngIndex) = Zeile
               ialngIndex = ialngIndex + 1
           End If
       Next Zeile
    End Sub
  2. Makro für den späteren Zeitpunkt erstellen: Füge den folgenden Code in dasselbe Modul ein, um die gespeicherten Zeilen in Spalte I mit "0" zu beschriften.

    Sub Späterer_Zeitpunkt()
       Dim ialngIndex As Long
    
       If SafeArrayGetDim(mlngArray) Then
           For ialngIndex = LBound(mlngArray) To UBound(mlngArray)
               Cells(mlngArray(ialngIndex), 9).Value = 0
           Next
           Erase mlngArray
       Else
           Call MsgBox("Keine Daten im Array.", vbExclamation, "Hinweis")
       End If
    End Sub
  3. Anpassung für 64-bit-Systeme: Falls Du auf einem 64-bit-System arbeitest, musst Du die Importfunktion anpassen. Ändere die Funktion wie folgt:

    Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32.dll" ( _
    ByRef psa() As Any) As Long

Häufige Fehler und Lösungen

  • Fehlermeldung bei 64-bit Systemen: Wenn Du eine Fehlermeldung bezüglich der Declare-Anweisung erhältst, stelle sicher, dass Du das PtrSafe-Attribut hinzufügst, wie oben beschrieben.

  • Das Makro gibt keine Werte aus: Überprüfe, ob die Bedingung für die Zeilennummer (in Spalte B) korrekt ist. Achte darauf, dass die Werte in der richtigen Range liegen.


Alternative Methoden

Eine alternative Methode, um Zeilenangaben in Excel zu verarbeiten, kann die Verwendung von Array-Formeln in Kombination mit Excel-Funktionen wie FILTER oder INDEX sein. Diese Methoden benötigen kein VBA und sind in Excel-Versionen ab 2019 verfügbar.


Praktische Beispiele

Hier ist ein praktisches Beispiel, wie Du die oben genannten Makros verwenden kannst:

  1. Setze in Spalte B einige Werte auf "Wahr".
  2. Führe das Makro Auswerten aus. Es speichert die Zeilennummern der "Wahr"-Werte in mlngArray.
  3. Rufe das Makro Späterer_Zeitpunkt auf und beobachte, dass in Spalte I (9) die entsprechenden Zellen mit "0" gefüllt werden.

Tipps für Profis

  • Verwende die Funktion SafeArrayGetDim, um die Dimensionen des Arrays zu überprüfen, bevor Du auf die Werte zugreifst. Dies stellt sicher, dass Du keine Laufzeitfehler bekommst.
  • Dokumentiere Deinen Code gut, insbesondere wenn Du mit Arrays arbeitest, um die Lesbarkeit und Wartbarkeit zu erhöhen.

FAQ: Häufige Fragen

1. Was ist avntTemp im Code?
avntTemp ist eine Variant-Variable, die die Werte aus Spalte B speichert. Sie ermöglicht es, die Werte einfach zu überprüfen und in das Array zu übertragen.

2. Kann ich das Array in eine andere Spalte schreiben?
Ja, Du kannst die Zielspalte in der Späterer_Zeitpunkt-Subroutine anpassen, indem Du die Zahl in Cells(..., 9) änderst.

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