Formel in Variable

Hallo,

ich möchte das Ergebnis einer Formel in einer Variable angezeigt bekommen.

Dim MERK1 as Interger
Sheets(„AUS“).Select
(nur zur Sicherheit)
MERK1=verweis(2,1/(Aus!A1:A100"";Zeile(1:100))

Wäre ja auch zu einfach gewesen, Excel-Funktionen in VBA zu übernehmen. Man muß es schon etwas komplizierter gestalten.

Nun habe ich es mit folgendem versucht :

MERK1=LOOKUP(2,1/(AUS!R[100]C1""""),ROW(AUS!R[100]))

Auch erfolglos. Irgendetwas ist verkehrt. Bloß was, das ist hier die Frage. „AUS“ ist ein Tabellenblattname. Das weiss VBA nicht und sagt mir : „Die Variable „AUS“ ist nicht definiert.“

Im folgendem Code funktioniert es :

ActiveCell.FormulaR1C1="=LOOKUP(2,1/(Druck!R1C4:R1000C4""""),ROW(Druck!C[-47]))"

Und ich will doch nur die Zeilennumer der letzten belegten Zelle der Spalte A in der Variable MERK1 !

Gruß Manne

P,S.: Wenn VBA es nicht kann, dann schreibe ich die Formel in eine Excelzelle und frage sie mit VBA ab.

Hi Manne,

ich möchte das Ergebnis einer Formel in einer Variable
angezeigt bekommen.

MERK1=verweis(2,1/(Aus!A1:A100"";Zeile(1:100))

im deutschen Excel wird in Vba der Punkt anstatt Komma benutzt, also 2.1 und nicht 2,1

Das gilt aber nicht wenn du die Formel mittels Formulalocal="=xyz" in eine Zelle schreibst, dann mußt du in xyz wieder das Komma nehmen.

Bei .Formulalocal kannst du Verweis benutzen, bei .Formula halt Lookup. Isst nur ein deutsch/englischer Unterschied.

Willst du aber „Verweis“ direkt in Vba benutzen, also nicht in eine Zelle die Formel eintragen, mußt du Lookup benutzen und zwar so:

X=Application.Worksheetfunction.Lookup(…)

Die Parameterreihenfolge in den Funktionen ist identisch mit der in Excel, nur du mußt sie in Vba-Schreibweise schreiben.

Also Worksheets(„Aus“).Range(„A1:A100“) anstatt Aus!A1:100

„“ in Excel mußt du dann in Vba so schreiben „“""

Die englischen Namen für die Funktionen findest du in der vbaliste.xls auf deinem Rechner.

Probier mal wie weit du mit diesen Infos kommst, dann melde dich wenns irgendwo noch klemmt.

Und was anderes, die letzte belegte Zelle in Aus!A:A findest du auch so:

x=worksheets(„Aus“).range(„A“ & rows.count).end(xlup).row

Gruß
Reinhard

Hallo Reinhard,

Danke für Deine Tipps. Ich habe mich stren daran gehlten, aber VBA mag mich nicht. Das mit dem Punkt stimmt nicht. Bei mir will VBA ein Komma sehen (OFF2003 SP3) . So sieht der Code jetzt aus :

**Dim MERK As Variant (Long , Integer)

MERK = Application.WorksheetFunction.Lookup(2,1/(Worksheets(„AUS“).Range(„A1:A100“)""""),Worksheets(„AUS“).Rows(1,100))**

Ich habe fast alle Variationen bzw. Kombinationen durch.

Im Netz fand ich ähnliches :

worksheetfunction.Lookup(Range(„I6“),sheets(„Daten“).range(„i17:i36“),sheets(„Daten“).range(„k17:k36“))

So änderte ich die Zeile auf:

MERK=Application.WorksheetFunction.Lookup(2,1/(Worksheets(„AUS“).Range(„A1:A100“)""""),Worksheets(„AUS“).Range(„A1:A100“))

Immer Fehler 13 : Typen unverträglich

Ich mag diese Typen nicht.

Gruß Manne

Hi Manne,

VBA mag mich nicht. Das mit dem Punkt stimmt nicht. Bei mir
will VBA ein Komma sehen (OFF2003 SP3) . So sieht der Code
jetzt aus :

deutsches Office?

Dim MERK As Variant (Long , Integer)

Was soll das sein?

Ich habe fast alle Variationen bzw. Kombinationen durch.

Poste mal bitte den kompletten Code.

Gruß
Reinhard

Nachtrag
Moin Manne,

=verweis(2,1/(Aus!A1:A100"";Zeile(1:100))

sieht mir nach einer Arrayformel aus, so oder so, funktionieren tut sie nicht in Excel.

Wie sieht denn deine in Excel funktionierende Formel aus?

Gruß
Reinhard

Salve Reinhard,

deutsches Office?

ja

Dim MERK As Variant (Long , Integer)

Was soll das sein?

Ich hab’s mal mit den verschiedenen Datentypen probiert.

Poste mal bitte den kompletten Code.

Sub MOVE5()

'So funktioniert 's :

’ EXCEL :
’ AUSWERTUNGEN!A4 = VERWEIS(2;1/(A1:A100"");ZEILE(A:A))
’ AUSWERTUNGEN!B4 = VERWEIS(2;1/(B1:B100"");ZEILE(B:B))

’ VBA :
’ 4. Letzte Formel-Zeile in AUSWERTUNG um eine Zeile verschieben, kopieren und als Werte
’ in vorherige Zeile wieder einfügen
’ Blatt AUSWERTUNGEN auswählen
Sheets(„AUSWERTUNGEN“).Select
’ letzte Zelle Spalte „A“ kopieren und in nächste Zelle Spalte „A“ einfügen
Range(„A“ & Range(„A4“)).Select
Selection.Copy
Range(„A“ & Range(„A4“) + 1).Select
ActiveSheet.Paste
’ Leer-Zellen einfügen vor letzter Zeile von Spalte „B“ bis Spalte „AF“
Range(„B“ & Range(„B4“), „AF“ & Range(„B4“)).Select
Selection.Insert Shift:=xlDown
’ letzte Zeile,Spalte B bis AE auswählen
Range(„B“ & Range(„B4“), „AF“ & Range(„B4“)).Select
Selection.Copy
’ Werte und Zahlenformate Spalte B bis AF, Zeile: letzte Zeile - 1 einfügen
Range(„B“ & Range(„B4“) - 1).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

’ Und so nicht :

Dim MERK1 As Long
Dim MERK2 As Long

’ Blatt AUSWERTUNGEN auswählen
Sheets(„AUSWERTUNGEN“).Select

MERK1 = WorksheetFunction.Lookup(2, 1 / (Sheets(„AUSWERTUNGEN“).Range(„A1:A100“) _
„“""), Sheets(„AUSWERTUNGEN“).Rows(1, 100))
MERK2 = WorksheetFunction.Lookup(2, 1 / (Sheets(„AUSWERTUNGEN“).Range(„B1:B100“) _
„“""), Sheets(„AUSWERTUNGEN“).Rows(1, 100))

’ letzte Zelle Spalte „A“ kopieren und in nächste Zelle Spalte „A“ einfügen
Range(„A“ & MERK1).Select
Selection.Copy
Range(„A“ & MERK1 + 1).Select
ActiveSheet.Paste
’ Leer-Zellen einfügen vor letzter Zeile von Spalte „B“ bis Spalte „AF“
Range(„B“ & MERK2, „AF“ & MERK2).Select
Selection.Insert Shift:=xlDown
’ letzte Zeile,Spalte B bis AE auswählen
Range(„B“ & MERK2, „AF“ & MERK2).Select
Selection.Copy
’ Werte und Zahlenformate Spalte B bis AF, Zeile: letzte Zeile - 1 einfügen
Range(„B“ & MERK2 - 1).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
End Sub

Hoffentlich siehst du meinen Fehler!

Gruß Manne

Grüezi Manne

ich möchte das Ergebnis einer Formel in einer Variable
angezeigt bekommen.

Das ist so nicht notwendig; VBA hat da noch andere Möglichkeiten.

Dim MERK1 as Interger

Wenn die VAriable eine Zeilennummer aufnehmen soll, dann musst Du sie als ‚Long‘ deklarieren, sonst kann sie maximal 32768 als WErt annahmen.

Sheets(„AUS“).Select (nur zur Sicherheit)
MERK1=verweis(2,1/(Aus!A1:A100"";Zeile(1:100))

Wäre ja auch zu einfach gewesen, Excel-Funktionen in VBA zu
übernehmen. Man muß es schon etwas komplizierter gestalten.

Das macht für die internationale Verwendung durchaus Sinn.

Und ich will doch nur die Zeilennumer der letzten belegten
Zelle der Spalte A in der Variable MERK1 !

Die folgenden zeilen sollten das Gewünschte eigentlich tun:

Public Sub Test()
Dim Merk1 As Long
 Merk1 = Worksheets("AUS").Range("A65536").End(xlUp).Row
End Sub

Der Code entspricht dem Sprung auf A65536 und dann Strg+‚Pfeil nach oben‘


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Salve Thomas,

alles steht Kopf, keiner weiß weiter, Projekt in Gefahr…und da kommt ein rettender Excel-Engel namens Thomas kurz vorbeigeflogen und verteilt die göttliche Weisheit von Bill.

Kürzer und besser geht’s nun wirklich nicht mehr. Danke. Die einfachsten Lösungen sind immer noch die Besten.

Und es ist nicht nur die gute Lösung, sondern auch eine kurze und verständliche Erklärung dazu die Dich so berühmt machen. Und wirklich überall im Internet bei jedem guten Excel-Forum zu finden. Beim Suchen nach einer Lösung des Problems mittels Google fand ich öfters Deinen Namen an verschiedenen Stellen.

Warum kann man nur einen Stern vergeben. Das Universum ist doch so unendlich groß (wie die Dummheit der Menschen). Spruch von Einstein.

Ich werde Deine Lösung uneingeschränkt so übernehmen. Aber ich hätte doch gern gewußt, warum die Lösung mit der Frank-Kabel-Formel (LOOKUP) in einer Variable nicht funktioniert.

Gruß aus Thüringen in die Schweiz von Manne

Moin, moin Reinhard,

=verweis(2,1/(Aus!A1:A100"";Zeile(1:100))

Da waren wieder die Finger schneller als der Kopf !

Richtig (in funktionierenden Programmen) :

=VERWEIS(2 ; 1/(AUS!A1:A100"");ZEILE(A:A))

=VERWEIS(2 ; 1/($C$1:blush:C$65535=1);ZEILE(C:C))
=VERWEIS(2 ; 1/(Druck!$D$1:blush:D$1000"");ZEILE(Druck!D:smiley:))
=VERWEIS(2 ; 1/($J$1:blush:J$60035=„Tod“);ZEILE(A:A))
=VERWEIS(2 ; 1/($N$1:blush:N$60035=„SG3“);ZEILE(A:A))

Auch genannt nach Erfinder : Die „Frank-Kabel-Formel“ (leider tot)

Im Objektkatalog unter Klasse „WorksheetFunktion“ Elemente von ‚WorksheetFunktion‘ : „Lookup“.
Ganz unten der Syntax : Funktion Lookup (Arg1 , Arg2 , Arg3])

Gruß Manne

P.S.: Ich bin nicht der Auskenner, aber ich hab’ mir mal was gutes abgegoogt und wenn ich mal was weiß, dann setze ich es immer ein. Denn viel mehr weiß ich nicht.

Hallo Manne,

alles steht Kopf, keiner weiß weiter, Projekt in Gefahr…und
da kommt ein rettender Excel-Engel namens Thomas kurz
vorbeigeflogen und verteilt die göttliche Weisheit von Bill.

nein, Thomas sagt wie man trotz Bills Weisheiten mit Excel was machen kann.

Kürzer und besser geht’s nun wirklich nicht mehr.

Quark, so ist das viel kürzer:

Public Sub Test()
Dim M As Long
M = Worksheets(„AUS“).Range(„A65536“).End(xlUp).Row
End Sub

*grins*

einfachsten Lösungen sind immer noch die Besten.

Ja, immer.

Ich werde Deine Lösung uneingeschränkt so übernehmen. Aber ich
hätte doch gern gewußt, warum die Lösung mit der
Frank-Kabel-Formel (LOOKUP) in einer Variable nicht
funktioniert.

Wenn Frank Kabel derjenige ist den sie bei excelforum.de betraueren, dann wird seine Formel sicher funktionieren.

Zeige die Formel die du meinst und ich setze sie in Vba um, aber bitte nicht wieder so Spielchen daß du 2,1 schreibst während du 2;1 meinst, das hat mich auf eine völlig falsche Fährte gelockt.

Gruß
Reinhard

Grüezi Manne

alles steht Kopf, keiner weiß weiter, Projekt in Gefahr…und
da kommt ein rettender Excel-Engel namens Thomas kurz
vorbeigeflogen und verteilt die göttliche Weisheit von Bill.

Reinhard hat es schon angedeutet - Excel ist für mich ein Tool, das ich dann effizient und wirkungsvoll einsetzen kann, wenn ich dessen Haken und Ösen kenne. :smile:

Und es ist nicht nur die gute Lösung, sondern auch eine kurze
und verständliche Erklärung dazu die Dich so berühmt machen.
Und wirklich überall im Internet bei jedem guten Excel-Forum
zu finden. Beim Suchen nach einer Lösung des Problems mittels
Google fand ich öfters Deinen Namen an verschiedenen Stellen.

Danke für die Blumen, es freut mich, wenn meine Beiträge weiterhelfen.

Ich werde Deine Lösung uneingeschränkt so übernehmen. Aber ich
hätte doch gern gewußt, warum die Lösung mit der
Frank-Kabel-Formel (LOOKUP) in einer Variable nicht
funktioniert.

LOOKUP() ist eigentlich eine Funktion, die im Tabellenblatt mit Zellbezügen funktioniert. Wenn Du diese in VBA anwenden willst musst Du ein paar Handstände mache, da der ‚Aufhänger‘ (also die Zelle in der die Formel steht) hier dann fehlt.

Daher gibt es in VBA eininge andere Methoden, die effizienter zum Ziel führen als eine adaptierte Zellenformel.

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Salve Reinhard,

nein, Thomas sagt wie man trotz Bills Weisheiten mit Excel was
machen kann.

Dir sitzt der Schalk auch gut im Nacken ! „Und das ist auch gut so !“
Das Leben ist zu kurz, um immer ernst zu bleiben. Spaß lockert alles ein wenig auf.

Tut mir leid, ich habe mich doch für die zweitkürzeste Variante von Thomas entschieden. Wenn ich nicht weiter wußte, taucht in jedem Forum aus dem Nirgendwo (Schweiz) Thomas auf und rettet mich aus meinem Dilemma.

Und es funktioniert !

aber bitte nicht wieder so Spielchen

Für das Spielchen entschuldige ich mich m*c2-mal !

Gruß und gute Nacht Manne

Und immer ein

*grins*

auf den Lippen und im Forum !

Salve Thomas,

für Hand- und Kopfstände bin ich zu alt.

[Win XP Pro SP-2 / xl2003 SP-3]

Mal 'ne persönliche Frage dazu. Du nutzt nicht XPSP3. Hat dies einen guten Grund ? Bei mir hat SP3 einiges (vertrautes) verändert. Was alles noch Hintergrund anders abläuft, kann ich nicht beurteilen.
Andere berichten nichts Gutes über SP3 (Subjektive und gefühlte Aussagen ohne großen Beweiswerrt).

Gruß Manne

P.S.: Und vergiß nicht die Blumen zu gießen !

Grüezi Manne

[Win XP Pro SP-2 / xl2003 SP-3]

Mal 'ne persönliche Frage dazu. Du nutzt nicht XPSP3. Hat dies
einen guten Grund?

Faulheit…!?

SinXP-SP3 ist ja erst seit dem 12.08.2008 offiziell verfügbar und ich warte einfach bis es übers automatische Update angeboten wird ohne mich da aktiv danach umzutun.

Bei mir hat SP3 einiges (vertrautes) verändert.

Was sind denn das für Punkte (auch gern dazulernen will)?

Andere berichten nichts Gutes über SP3 (Subjektive und
gefühlte Aussagen ohne großen Beweiswerrt).

Das ist wohl immer und bei jedem SP und Updte der Fall - Unkenrufe gehören zu diesem Bereich des ‚Lebens‘ einfach mit dazu.

P.S.: Und vergiß nicht die Blumen zu gießen !

Keine Bange, das besorgt hier der Regen gleich selbst… :wink:

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]