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

Achtung Anfänger: Kleines VBA If-Then dynam Array

Forumthread: Achtung Anfänger: Kleines VBA If-Then dynam Array

Achtung Anfänger: Kleines VBA If-Then dynam Array
21.08.2019 11:34:12
F
Hallo zusammen,
ich habe mich vor einigen Tagen an das Thema VBA rangesetzt und kann die Beispiele, die ich mir bisher angeschaut habe, gut nachvollziehen. Aber beim ersten eigenen Makro hakt es leider ein wenig.
In der ganzen Spalte Z soll Excel nach den Begriff "Angebotspreis" suchen. Steht dieser Begriff in einer Zeile, soll der Wert in Spalte Q neu berechnet werden als Differenz aus den Spalten S - T. Konkret: steht in Z5 "Angebotspreis", soll Q5 als S5-T5 neu berechnet werden.
Leider erhalte ich bei meinen Makro die Ausgabe "Laufzeitfehler" und kann mir keinen Reim drauf machen, was Excel stört.
In meinen Makro taucht die Spalte AA auf, da ich diese immer gefüllt ist und keine leeren Zellen in dieser existieren. Somit wollte ich diese als "Hilfsspalte" zur Ermittlung der Arraygröße benutzen.
Sub WertderVorperiodekorrigieren()
Dim size As Integer
Dim i As Integer
Dim Wert_Vorperiode()
'Anzahl der Einträge in Spalte AA ermitteln und der Variablen size zuweisen
size = WorksheetFunction.CountA(Worksheets("Datenbank-WGM").Columns(27))
'Größe des Arrays festlegen
ReDim Wert_Vorperiode(size - 1)
'Wenn in Spalte Z "Angebotspreis" steht, so soll in Spalte Q der Wert neu berechnet werden
For i = 1 To size
If Cells(i, 26).Value = "Angebotspreis" Then
Wert_Vorperiode(i, 17) = (Cells(i, 19) - Cells(i, 20))
Else
Wert_Vorperiode(i, 17) = Cells(i, 17)
End If
Next i
End Sub

Ich hoffe ich habe nicht kompletten Mist ins Makro geschrieben und ihr könnt mir helfen :)
Beste grüße
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Kleines VBA If-Then dynam Array
21.08.2019 12:13:02
Bernd
Servus F,
für was ein Array bei dieser einfachen Berechnung? Einfacher geht`s ohne Array:

Sub test()
Dim i As Integer
Dim intLZ As Integer
With Sheets("Tabelle1")
intLZ = .Cells(Rows.Count, 19).End(xlUp).Row
For i = 2 To intLZ
If .Cells(i, 26).Value = "Angebotspreis" Then .Cells(i, 17).Value = .Cells(i, 19).Value - . _
Cells(i, 20).Value
Next i
End With
End Sub
Grüße, Bernd

Anzeige
AW: Achtung Anfänger: Kleines VBA If-Then dynam Array
22.08.2019 08:20:49
Matthias
Moin!
Ich habe grad kein Excel zum Testen. Deshalb nur mal ein Hinweise, was den Laufzeitfehler auslösen konnte. Deine Variable Wert_Vorperiode ist eindimensional. In der For Schleife behandelst du sie aber wie eine zweidimensionales Array. Da sollte nur i als Index stehen. Bei deinem Schleifen aufbau läufst du dann aber in einen neuen Fehler. Dein i geht von 1 to size. Dein Array ist aber nur size -1 groß. Beim letzten Wert kommt also ein Fehler. Dimensioniere dein Array dann lieber so Wert_Vorperiode(1 to size).
VG
Anzeige
AW: Achtung Anfänger: Kleines VBA If-Then dynam Array
23.08.2019 13:55:20
F
Okay, schonmal vielen Dank für eure Hilfe.
Mit den Code ohe Array hat es auch einwandfrei funktioniert. Merci. Ich dachte, es funktioniert einfach besser mit einen Array, sodass ich es so probiert habe.
@ Matthis, danke für deine Info bzl. den Laufzeitfehler. Ich schaue mir das gleich mal an und versuche den Fehler rauszubekommen.
Auch wenn ich meine Excel mit den Code so bearbeiten konnte, wie gewollt, will ich das gerne auch nochmal mit einen Array hinbekommen. Bin ich da denn mit meinen Code grundsätzlich auf den richtigen Weg oder ist das eher Quatsch, was ich da mache bzw es gibt einen simpleren Weg das Array zu basteln?
Beste grüße
manuel
Anzeige
AW: Achtung Anfänger: Kleines VBA If-Then dynam Array
25.08.2019 14:30:39
Matthias
Moin!
Also grundsätzlich bist ja auf dem richtigen Weg (Array anlegen und dimensionen bzw. drauf zugreifen). Es gibt aber einige Punkte, wo ich mir nicht sicher bin warum bzw. was man noch ändern könnte.
Dein Array wird zwar befüllt (wenn du die letzten angesprochenen Punkte behebst) aber was machst du dann damit. Da würde das zurückschreiben noch fehlen. Da du ein eindimensionales Array hast, müsstest du es noch transponieren (also drehen). Außer du legst es gleich 2 dimensional an. bspw. redim myarray(1 to size,1 to 1). Dass könnstest du dann ohne drehen wieder einfügen.
Dann ist die Frage, warum ein Array. Wenn du es aus SChnelligkeitsgründen brauchst, solltest du alles in ein Array packen. Also den Bereich Q1:AA100 (beispielsweise). Dann könntest du auf den ganzen Bereich zugreifen und sparst dir die einzelnen Blattzugriffe mit cells (das kostet viel Zeit). Das kannst du dann wie eine Tabelle mit Zeile, Spalte ansprechen.
Simplerer Weg für das Array? Du könntest auch gleich den Berech aus dem Blatt einer Variablen zuweisen. bspw. myarr = Range("Q1:Q" & letzteZeile) Dann hast du auch ein Array - ist dann aber gleich zweidimensional (auch wenn es nur aus einer Spalte ist). Nimmt sich aber nicht viel.
Wenn du noch Fragen hast, einfach melden.
VG
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Dynamische Arrays in Excel VBA: Ein Leitfaden für Anfänger


Schritt-für-Schritt-Anleitung

Um ein einfaches VBA-Skript zu erstellen, das mit dynamischen Arrays und der If-Then-Anweisung arbeitet, folge diesen Schritten:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu, indem du mit der rechten Maustaste auf "VBAProject (DeineDatei)" klickst und "Einfügen" > "Modul" auswählst.
  3. Kopiere den folgenden Code in das Modul:
Sub WertderVorperiodekorrigieren()
    Dim size As Integer
    Dim i As Integer
    Dim Wert_Vorperiode() As Variant

    ' Anzahl der Einträge in Spalte AA ermitteln
    size = WorksheetFunction.CountA(Worksheets("Datenbank-WGM").Columns(27))

    ' Größe des Arrays festlegen
    ReDim Wert_Vorperiode(size - 1)

    ' Wenn in Spalte Z "Angebotspreis" steht, wird der Wert in Spalte Q neu berechnet
    For i = 1 To size
        If Cells(i, 26).Value = "Angebotspreis" Then
            Wert_Vorperiode(i - 1) = (Cells(i, 19).Value - Cells(i, 20).Value)
        Else
            Wert_Vorperiode(i - 1) = Cells(i, 17).Value
        End If
    Next i

    ' Rückschreiben in die Zellen (Optional)
    For i = 1 To size
        Cells(i, 17).Value = Wert_Vorperiode(i - 1)
    Next i
End Sub
  1. Schließe den VBA-Editor und kehre zu Excel zurück.
  2. Führe das Makro aus, indem du ALT + F8 drückst, das Makro auswählst und auf "Ausführen" klickst.

Häufige Fehler und Lösungen

  • Laufzeitfehler: Überprüfe, ob der Index des Arrays korrekt ist. Wenn du ein eindimensionales Array verwendest, sollte der Index i - 1 sein, da VBA-Arrays standardmäßig bei 0 beginnen.
  • Falsche Verwendung von Zellen: Stelle sicher, dass die Zellenreferenzen korrekt sind. Wenn du Cells(i, 17) verwendest, beziehe dich auf die richtige Spalte.
  • Arrays nicht dimensioniert: Achte darauf, dass das Array mit der richtigen Anzahl an Elementen dimensioniert wird, bevor du darauf zugreifst.

Alternative Methoden

Wenn du keine Arrays verwenden möchtest, kannst du die Berechnung auch direkt in den Zellen durchführen. Hier ist ein Beispiel:

Sub BerechnungOhneArray()
    Dim i As Integer
    Dim intLZ As Integer
    With Sheets("Tabelle1")
        intLZ = .Cells(Rows.Count, 19).End(xlUp).Row
        For i = 2 To intLZ
            If .Cells(i, 26).Value = "Angebotspreis" Then
                .Cells(i, 17).Value = .Cells(i, 19).Value - .Cells(i, 20).Value
            End If
        Next i
    End With
End Sub

Diese Methode ist einfacher und benötigt kein Array.


Praktische Beispiele

Hier sind einige Beispiele, wie du If-Then-Anweisungen und Arrays kombinieren kannst:

  1. Berechnung mit Arrays:
    • Wenn du mehrere Bedingungen prüfen möchtest, kannst du die If-Then-Anweisung erweitern:
If Cells(i, 26).Value = "Angebotspreis" And Cells(i, 19).Value > Cells(i, 20).Value Then
    Wert_Vorperiode(i - 1) = (Cells(i, 19).Value - Cells(i, 20).Value)
End If
  1. Nutzung von mehrdimensionalen Arrays:
    • Um ein mehrdimensionales Array zu verwenden, könntest du den Code wie folgt anpassen:
ReDim Wert_Vorperiode(size - 1, 1)

Tipps für Profis

  • Vermeide unnötige Cells-Zugriffe: Speichere Werte in einem Array, um die Leistung zu verbessern, insbesondere bei großen Datenmengen.
  • Nutze Option Explicit: Dies hilft dir, Variablen zu deklarieren und Fehler zu vermeiden.
  • Transponiere bei Bedarf: Wenn dein Array mehrdimensional ist, denke daran, es zu transponieren, bevor du es zurückschreibst.

FAQ: Häufige Fragen

1. Was ist der Vorteil von Arrays in VBA?
Arrays ermöglichen eine effizientere Verarbeitung von Daten, da sie den Zugriff auf Zellwerte minimieren und die Leistung verbessern.

2. Wie dimensioniere ich ein Array richtig?
Verwende ReDim und achte darauf, die Größe des Arrays korrekt festzulegen, z.B. ReDim myArray(1 To size).

3. Kann ich If-Then-Anweisungen in Arrays verwenden?
Ja, du kannst If-Then-Anweisungen verwenden, um Bedingungen zu überprüfen, während du durch die Elemente eines Arrays iterierst.

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