Forum: PC-Programmierung VBA Excel Arraygröße abfragen / Fehler abfangen


von VBAler (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit VBA in Excel.
Bei der folgenden Funktion wird die Arraygröße in Excel ermittelt.
Wenn ich die Funktion mit einem Bereich aufrufe (z.B. "=test(A1:A2)") 
erhalte ich als korrekte Lösung 2.
Ich möchte aber auch wenn ich nur eine Zelle markiere ("=test(A1)") die 
korrekte Lösung (1) erhalten.
Es erscheint jedoch "#Wert".

1
Function test(a As Variant) As Double
2
3
test = UBound(Application.Transpose(a), 1)
4
5
End Function

Hat jemand eine Lösung?

Danke!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Transpose erwartet als Argument ein array. In Deinem Fall mit nur 
einer Zelle wird aber kein Array übergeben.

http://office.microsoft.com/en-us/excel-help/transpose-function-HP010069834.aspx


Du könntest den Typ des Arguments bestimmen und den Aufruf von Transpose 
sein lassen, wenn es kein Array ist (denn ohne Array ist das reichlich 
sinnlos).

von Rainer V. (rudi994)


Lesenswert?

Die Anzahl Zellen in Bereichen der Tabelle liefert die Eigenschaft Count 
des Range-Objektes, das die Zellen umfaßt. Die Bereiche müssen nicht 
aneinandergrenzen und werden als Liste übergeben. Bsp.:

With Worksheets("Tabelle1")
  anz1 = .Range("A1:A3").Count  ' 3 Zellen
  anz2 = .Range("A1:B3").Count  ' 6 Zellen
  anz3 = .Range("A1:B3, D2:D5").Count  ' 10 Zellen
  anz4 = Union(.Range("A1:B3"), .Range("D2:D5")).Count  ' 10 Zellen
  Zeilen = .Range("A1:B3").Rows.Count  ' 3 Zeilen
  Spalten = .Range("A1:B3").Columns.Count  ' 2 Spalten
End With

Es kann auch Cells(Zeile, Spalte) anstatt "..." angegeben werden:
  anz2 = .Range(.Cells(1, 1), .Cells(3, 2)).Count  ' 6 Zellen

Bei Cells() für mehrfache Bereiche muß es aufgegliedert werden:
  anz3 = .Range(.Cells(1, 1), .Cells(3, 2)).Count + _
           .Range(.Cells(2, 4), .Cells(5, 4)).Count ' 10 Zellen


UBound() liefert den Index der Obergrenze eines Array, LBound() liefert 
den Index der Untergrenze, Array-Größe ist UBound()-LBound()+1.

Das 1. Argment darf auch ein Zellenbereich sein. Ein Test ergab, daß aus 
einer Liste mehrerer Bereiche wohl nur der zuerst genannte ausgewertet 
wird, die übrigen nicht gelten und daß es u.U. zu Fehlern kommen kann.
Eine einzelne Zelle ist kein Array, Range("A1:A1") gilt nicht.

Ist das 1. Argument ein Zellenbereich, dann sind als 2. Argument für die 
Dimension die Werte 1 und 2 möglich. UBound() und LBound() geben für den 
Wert 1 einen Zeilenindex, für Wert 2 einen Spaltenindex zurück. Index-
Untergrenze ist 1, da Tabellen in der 1. Zeile und 1. Spalte beginnen.

: Bearbeitet durch User
von Rainer V. (rudi994)


Lesenswert?

Rainer V. schrieb:
> Index-Untergrenze ist 1, da Tabellen in 1. Zeile u. 1. Spalte beginnen

Korrektur: Index-Untergrenze ist immer 1, unabhängig davon, welche 
Zeilen- bzw. Spaltennummern im ausgewählten Zellenbereich tatsächlich 
auftreten, und unabhängig davon, welcher Array-Basis-Index durch die 
Anweisung "Option Base" eingestellt ist. Es hat also nichts mit dem 
Tabellenanfang in der 1. Zeile und 1. Spalte zu tun.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.