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

Forumthread: Formel zu VBA Worksheetfunction umwandeln

Formel zu VBA Worksheetfunction umwandeln
Peter.H
Hallo Excel Forum
ich bekomme die Formel
=VERWEIS(2;1/(A:A"");ZEILE(A:A))
nicht in die Form
a = Application.WorksheetFunktion.Lookup(...
umgeschrieben.
Würde mir da bitte jemand helfen...
Peter
Anzeige

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

Betreff
Benutzer
Anzeige
AW: Formel zu VBA Worksheetfunction umwandeln
28.11.2010 17:44:41
Jürgen
Hallo Peter,
schreibe einfach die Formel in eine Zelle, sagen wir B10, und wechsle in den VBA-Editor. Lass Dir das Direktfenster anzeigen (STRG+G) und gib dort
?Range("B10").formula
ein und löse mit ENTER aus - und schon wird Dir die Formel so ausgegeben, dass Du Sie übertragen kannst.
Gruß, Jürgen
Anzeige
AW: Formel zu VBA Worksheetfunction umwandeln
28.11.2010 18:19:23
Peter.H
Hallo Jürgen
danke für deine Hilfe...
Die Macroaufzeichnung sieht wie folgt aus:
Sub Makro4()
ActiveCell.FormulaR1C1 = "=LOOKUP(2,1/(C[-1]""""),ROW(C[-1]))"
End Sub
Nun die Übertragung an WorksheetFunktion:
Sub Test()
Dim a%
With Application.WorksheetFunction
a = .LOOKUP(2,1/(C[-1]""""),ROW(C[-1]))
End With
End Sub
Das funktioniert leider nicht "Syntax Fehler beim kompilieren"
Hat jemand noch andere Vorschläge...
Gruß
Peter
Anzeige
So kann das auch nicht gehen,...
28.11.2010 19:44:42
Luc:-?
…Peter,
weil die Elemente des WorksheetFunction-Objekts grundsätzlich ihrer Matrix-Funktionalität verlustig gehen! Wenn du die behalten willst, musst du die Fml so wie angezeigt Evaluieren (Auswerten, a = Evaluate(…)), ansonsten musst du eine Schleife um die PgmZeile herum aufbauen, die die variablen FmlTeile flfd austauscht, denn du willst ja wohl offensichtl die ganze Spalte A (evtl auch noch andere Spalten?) abarbeiten. Was bewirkt die OriginalFml… Mit =VERWEIS(2;1/(A:A<>"");ZEILE(A:A)) erhältst du einen #DIV/0!-Fehlerwert, wenn die Zelle leer ist, das 3.Argument, dessen Wert schließlich zurückgegeben wird, wenn das 1.Argument im Feld des 2. gefunden wird, zählt jede Zeile hoch. Das sieht mir doch sehr nach einer tricky ZellFml ala excelformeln.de aus, mit der du feststellen willst, in welcher Zeile eine 2 auftaucht. Dafür gibt's in VBA geeignetere Methoden als .LookUp(…) in einer For- oder Do-Schleife. Denn das wird in der Schleife nicht fktionieren, wenn Fehler (und ggf vorhandene Texte!) nicht abgefangen wdn!
Gruß Luc :-?
Anzeige
AW: So kann das auch nicht gehen,...
29.11.2010 08:51:54
Peter.H
Hallo Luc
danke für Deine ausführlichen Informationen.
Ja die Formel stammt aus dem Excel Zauberbuch und gibt die letzte benutzte Zelle wieder (auch wenn Leerzellen im Range vorhanden sind).
Der Versuch mit Evaluate ist mit meinen Kenntnissen gescheitert:
Sub Makro1()
Dim a
a = Application.Evaluate("=LOOKUP(2,1/(C[1]""""),ROW(C[1]))")
End Sub

'Ergebnis: a = Fehler 2015
Auch der Aufbau der Matrixfunktionalität war bis jetzt noch nicht mit Erfolg gekrönt:
Sub Test()
Dim a
Dim myRng As Range: Set myRng = Worksheets(1).Range("A:A")
With Application.WorksheetFunction
a = ".LOOKUP(2,1/" & myRng & """""),ROW(" & myRng & "))"
End With
End Sub

'Ergebnis: Laufzeitfehler 13 Typen unverträglich
Hast du lust mir da noch weiter auf die Sprünge zu helfen...
Gruß
Peter
Anzeige
Demnächst in diesem Theater... Gruß owT
30.11.2010 02:54:35
Luc:-?
:-?
So, mal sehen,...
01.12.2010 19:15:38
Luc:-?
…Peter…
1. Evaluate:
a = Evaluate("lookup(2,1/(A:A<>""""),row(A:A))") mag die Methode evtl lieber. Wenn nicht, kannst du diesen Weg ausschließen.
2. Pgm-Schleife → anders lässt sich eine „Matrix­fktionalität“ kaum nachgestalten. Aber das ist hier bei Zweck der Fml und deinen Bedingungen kaum nötig…
Versuch's doch mal mit Set myRng = Worksheets(1).UsedRange.Columns(1): a = myRng.Cells.Count
Das sollte die letzte benutzte Zelle=Zeile in Spalte A liefern, wenn nicht in einer anderen Spalte darüber hinaus Werte vorhanden sind oder waren (XL merkt sich das! → Abhilfe: ausreichend anschließende und vermeintl leere Zeilen physisch löschen).
Wenn andere Spalten mehr Zeilen haben, kannst du das auch mit myRng.Rows(myRng.Rows.Count + 1).End(xlUp).Row lösen. Bspp dafür finden sich im Herber-Archiv zuhauf…
Gruß Luc :-?
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
Anzeige

Infobox / Tutorial

Excel-Formel in VBA umwandeln: Eine Anleitung


Schritt-für-Schritt-Anleitung

  1. Formel in eine Zelle eingeben: Schreibe die gewünschte Excel-Formel in eine Zelle, z.B. =VERWEIS(2;1/(A:A<>"");ZEILE(A:A)) in die Zelle B10.

  2. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Direktfenster nutzen: Aktiviere das Direktfenster mit STRG + G. Gib den folgenden Befehl ein und drücke ENTER:

    ?Range("B10").Formula

    So erhältst du die korrekte Formel, um sie in VBA zu verwenden.

  4. Formel umwandeln: Verwende die folgende Struktur, um die Formel in VBA zu integrieren:

    Dim a As Variant
    a = Application.WorksheetFunction.Lookup(2, 1 / (Range("A:A") <> ""), Row(Range("A:A")))

Häufige Fehler und Lösungen

  • Syntaxfehler beim Kompilieren: Wenn du einen Syntaxfehler erhältst, überprüfe, ob du die Klammern und Argumente korrekt gesetzt hast. Eine häufige Fehlerquelle ist das Fehlen des Application. vor WorksheetFunction.

  • VBA Fehler 2015: Dieser Fehler tritt auf, wenn die Formel nicht korrekt evaluiert werden kann. Stelle sicher, dass du die Formel in der richtigen Syntax verwendest:

    a = Application.Evaluate("=LOOKUP(2,1/(A:A<>""""),ROW(A:A))")
  • Laufzeitfehler 13 (Typen unverträglich): Achte darauf, dass die Variablen korrekt deklariert sind und dass du die richtigen Datentypen verwendest.


Alternative Methoden

  1. Evaluate-Funktion: Anstelle von WorksheetFunction kannst du die Evaluate-Funktion nutzen, um die Formel auszuwerten:

    a = Application.Evaluate("LOOKUP(2,1/(A:A<>""""),ROW(A:A))")
  2. Schleifen verwenden: Wenn du mit einer großen Datenmenge arbeitest, kann es sinnvoll sein, eine Schleife zu verwenden, um die letzte benutzte Zelle zu finden:

    Dim i As Long
    For i = Rows.Count To 1 Step -1
       If Not IsEmpty(Range("A" & i)) Then
           a = i
           Exit For
       End If
    Next i

Praktische Beispiele

  • Letzte benutzte Zeile finden:

    Dim lastRow As Long
    lastRow = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
  • Direktbereich-Variable ausgeben: Um eine Variable aus einem direkt angesprochenen Bereich auszugeben, kannst du folgendes verwenden:

    Dim myRng As Range
    Set myRng = Worksheets(1).Range("A:A")
    MsgBox myRng.Address

Tipps für Profis

  • Verwende Named Ranges: Um die Lesbarkeit zu erhöhen, kannst du benannte Bereiche verwenden, statt direkt auf die Zellen zuzugreifen.

  • Debugging: Nutze das Direktfenster ausgiebig, um Variablenwerte während der Laufzeit zu überprüfen und Fehler schnell zu identifizieren.

  • Code optimieren: Verwende die Option Explicit-Anweisung am Anfang deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind.


FAQ: Häufige Fragen

1. Wie kann ich eine Excel-Formel in VBA umwandeln?
Um eine Excel-Formel in VBA umzuwandeln, schreibe die Formel in eine Zelle und benutze dann den VBA-Editor, um sie als WorksheetFunction oder Evaluate zu verwenden.

2. Was ist der Unterschied zwischen WorksheetFunction und Evaluate?
WorksheetFunction ist nützlich für viele Excel-Funktionen, während Evaluate für komplexere Formeln verwendet wird, die mehrere Zellen oder Bereiche erfordern.

3. Wie kann ich einen Fehler in meiner VBA-Formel beheben?
Überprüfe die Syntax und stelle sicher, dass die richtigen Datentypen verwendet werden. Verwende das Direktfenster, um Variablenwerte zu überprüfen und Fehler zu identifizieren.

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