ich möchte in Excel Tabellen im ASCII-Format einlesen. Diese Tabellen sind immer gleich aufgebaut, aber unterschiedlich groß. Nun möchte ich mit einem Makro die Gesamtanzahl Zeilen feststellen, diesen Wert in einer Variablen abspeichern um ihn anschließend für weitere Berechnungen zu benutzen. Ich kann zwar den Wert feststellen und in einer Zelle auslesen (mit der Anweisung: anz = „=COUNTA(C[1])“), aber sobald ich diese Variable für weitere Berechnungen einsetzen möchte, bringt mir VBA einen Laufzeitfehler. Wer kann mir weiterhelfen, was mache ich falsch? Vielen Dank schon mal! Bernhard
Lass mal Code sehen …
Ich weiß nicht recht, was Du da gemacht hast. Ich habe den Eindruck, daß Du irgendwie Excel-Code mit VBA-Code vermischt hast. Ist „anz“ eigentlich als Integer oderso definiert, also mittels Dim anz As Integer?
Was ist das eigentlich für eine Funktion, dieses COUNTA? Ich habe hier ´ne Deutsche Version und kann nichts passendes finden.
mit dem VBA-Code
Range(„A1“).Select
ActiveCell = „=counta(c[1])“
Range(„A1“).Select
kann ich die Excel-Formel „=ANZAHL2(B:B)“ in die Zelle A1 schreiben. Ich kann den Wert auch auslesen (mit ActiveCell.Value) und dann weiter verarbeiten, aber ich kann ihn nicht in einer Variablen abspeichern. Vielleicht lieg ich mit diesem Ansatz auch total daneben; wenn du eine andere Lösung weißt, wie ich die Gesamtanzahl an Zeilen von einem Dokument ermitteln kann, um diese für weitere Berechnungen zu benutzen, wäre dies auch toll!
also eigentlich ist der Code in Ordnung, und bei mir funktioniert er auch. Ich habe mal meine Prozedur hier angehängt. Statt mit ActiveCell arbeite ich lediglich direkt mit dem Range, was auf´s selbe rauskommt. Und das „FormulaR1C1“ ist auch nicht unbedingt notwendig, aber wenn man das als Makro aufnehmen würde, käme das auch so. Die Variablen r und s habe ich lediglich der größeren Felxibilität wegen eingebaut. So kann man schneller die Zelle bzw. Spalte wechseln.
Achso, die Variable n nimmt die Zeilenzahl auf. Die kann maximal 65536 sein, so daß der Datentyp Long angebracht ist. Bei s für die Spalte reicht Byte, da es nur 256 sein können.
Sub Test()
Dim r As String
Dim s As Byte
Dim n As Long
r = "A1"
s = 1
Range(r).FormulaR1C1 = "=CountA(c[" & s & "])"
n = Range(r).Value
MsgBox n, vbInformation, "Hier ist die Zeilenanzahl in Spalte " & s & ":"
End Sub 'Test
vielen Dank für Deine Hilfe, ist ja genial - ich glaube jetzt, ich weiß, wo mein Fehler lag. Der Ansatz ist aber dennoch nicht ganz richtig, weil mir so VBA in die Zelle A1 die Excel-Formel „ANZAHL2()“ reinschreibt. Da aber die 1. Zeile meistens die Überschriftenzeile ist, wird mir die 1. Zelle überschrieben, was unerwünscht ist. Habe auch noch ein bisschen rumprobiert und folgende Lösung gefunden, die dieses Problem umgeht (klappt wunderbar):
Sub Zaehlen()
Dim zeilen As Integer
Range(„A1“).Select
zeilen = Selection.CurrentRegion.Rows.Count
MsgBox "Anzahl Zeilen: " & zeilen, vbOKOnly, „ZEILENANZAHL“
Probier’s mal aus, ist eigentlich recht einfach. Danke - Bernhard
Sub Zaehlen()
Dim zeilen As Integer
Range(„A1“).Select
zeilen = Selection.CurrentRegion.Rows.Count
MsgBox "Anzahl Zeilen: " & zeilen, vbOKOnly, „ZEILENANZAHL“
Du mußt hier aber beachten, daß der Bereich keine Löcher in Form von leeren Spalten oder in diesem Fall hier Zeilen hat. CurrentRegion umschließt ja nur die Zellen, die miteinander zusammenhängen. Außerdem muß der Cursor den betreffenden Bereich zumindest berühren, aber das machst Du ja mit Range(„A1“).Select.
Ist aber ein interessantes Objekt, das CurrentRegion. Kannte ich noch nicht.
Achso, und falls Du wirklich mal mehr als 32767 Zeilen haben solltest, mußt Du, wie gesagt, den Datentyp Long statt Integer verwenden, weil´s sonst eine Überlauf gibt.
Achso, und das vbOKOnly ist bei MsgBox default, muß also nicht angegeben werden