Microsoft Excel

Herbers Excel/VBA-Archiv

Range in Array füllen, Problem bei Cells.Count = 1 | Herbers Excel-Forum


Betrifft: Range in Array füllen, Problem bei Cells.Count = 1 von: Andreas Hanisch
Geschrieben am: 22.02.2010 16:20:31

Hallo VBA Freunde,

ich habe es heute zum ersten mal angewandt, ein Array nicht mit einer Schleife, sondern gleich als einen Block zu füllen. Dank Renee konnte ich auch den Fehler beheben, daß ich mein Array nur eindimensional eingerichtet hatte.
Also für Ranges mit mehr als 1 Zelle funktioniert es. Nun habe ich den Code aber eingesetzt und in bestimmten Konstellationen habe ich nur eine Zelle, die verarbeitet werden soll. Und da stürzt der Code ab. „Typen unverträglich“. Ich verstehe leider nicht warum dieser Fehler kommt. 4 Zellen untereinander sind ein Range. Aber eine einzelne Zelle ist doch genauso ein Range?! D.h. das Einlesen ins Array und anschließende Duplikate löschen und sortieren müßte alles glatt durchlaufen. OK, Duplikate und Sortierung sind in dem Fall überflüssig, aber ich will nicht noch eine IF Prüfung vorschalten, die auf .Cells.Count = 1 prüft.
Range ist Range (?) und daher interessiert es mich sehr, warum es nicht funktioniert.

https://www.herber.de/bbs/user/68173.xls

Es wäre toll, wenn ein interessierter Forumsteilnehmer einen Blick darauf werfen könnte.

Dank und Gruß, Andreas Hanisch

  

Betrifft: AW: Range in Array füllen, Problem bei Cells.Count = 1 von: Tino
Geschrieben am: 22.02.2010 16:33:21

Hallo,
dies liegt daran das arrTest vom Typ Variant ist und bei einer Zelle nur den Wert der Zelle bekommt
und somit kein Array daraus wird.
Wenn Du nicht sicher stellen kannst ob Dein Bereich aus mehreren Zellen besteht,
kannst Du dies so abfangen.

Sub ArrayEinleseTest()
Dim rgArrTest2 As Range
Dim arrTest As Variant

Set rgArrTest2 = ThisWorkbook.Names("rgArrTest2").RefersToRange

arrTest = rgArrTest2.Value

If IsArray(arrTest) Then
 Debug.Print arrTest(1, 1)
Else
 Debug.Print arrTest
End If

End Sub
Gruß Tino


  

Betrifft: AW: Range in Array füllen, Problem bei Cells.Count = 1 von: Andreas Hanisch
Geschrieben am: 22.02.2010 16:43:07

Hey Tino,

vielen Dank. So geht es! Deine Erklärung hilft dem Verständnis sehr gut!

Hab noch einen schönen Nachmittag/ Abend.

Viele Grüße, Andreas


  

Betrifft: AW: Range in Array füllen, Problem bei Cells.Count = 1 von: Rudi Maintaire
Geschrieben am: 22.02.2010 16:36:13

Hallo,

Aber eine einzelne Zelle ist doch genauso ein Range?! 

Das schon. Ergibt aber kein Array, da überflüssig.
Du könntest dein Array ja testen, ob es eins ist: If IsArray(arrTest) Then...
Oder ein Array erzwingen:
arrTest=rgArrTest2.resize(,2): Redim Preserve arrTest(1 to Ubound(arrTest), 1 to 1)
(Also erst mal 2-spaltig einlesen und dann die 2.Spalte wegwerfen, nicht sehr elegant)

Das Entfernen der Duplikate würde ich über ein Dictionary-Objekt machen.

Gruß
Rudi


  

Betrifft: Habe deine Datei mal mit OO geöffnet,... von: Luc:-?
Geschrieben am: 22.02.2010 16:48:17

...Andreas,
um mir die Makros anzusehen. Sofort hat OO einen VBA-Syntax-Fehler gemeldet! Du hast bei den Debug-Befehlen ein unzulässiges Semikolon verwendet! Müsste sich doch eigentl auch VBE melden!? Dann fiel mir noch auf, dass du explizit nach einem 2-dimensionalen Feld (Array) verlangst. Normalerweise ist das auch für Ranges richtig, aber nicht, wenn du wie du schreibst nur 1 (eine) Zelle in das Array lädst. Dann gibt's keine 2.Dimension → also wirst du wohl „in den sauren Apfel beißen“ müssen... ;-)
Weil ich bei meinen udF idR auch Ergebnisse aus der Berechnung von Ausdrücken als Argument zulasse (machen ja auch die meisten xlStddFktt!) und deshalb idR nicht als Range, sondern als Variant deklariere, weshalb dann auch 1dimensionale Felder (Zeilenvektoren) auftreten können, muss ich das regelmäßig abfragen. Wenn On Error Resume Next am PgmAnfang steht, ist das auch kein Hit: If IsError(Ubound(xyz, 2)) Then
Zuvor lese ich idR auch Ranges in allgemeine Feldvariable (Variants) mit 2maliger Anwendung von WorksheetFunction.Transpose. Dadurch sind Zeilenvektoren immer 1dimensional, Spaltenvektoren immer 2dimensional. Einzelne Werte gehören dabei natürlich zu Ersteren. Man kann natürlich aus Spaltenvektoren auch Zeilenvektoren machen (1x .Transpose). Alle Matrizen bleiben quasi unverändert, nur kann man danach generell mit L/UBound arbeiten und muss nicht …Cells.Count verwenden.
Gruß Luc :-?


  

Betrifft: AW: Habe deine Datei mal mit OO geöffnet,... von: Andreas Hanisch
Geschrieben am: 24.02.2010 12:16:09

Hallo Luc, hi Rudi,

danke Euch auch für Eure Hinweise. Ich habe es mit der Prüfung und der Erklärung von Tino schon realisieren können. Ich habe mir den Thread aber noch einmal ausgedruckt, um in Ruhe zu überdenken, ob ich - gerade auch mit den Hinweisen von Luc - die Sache etwas cleverer lösen könnte.

Viele Grüße, Andreas


  

Betrifft: Na dann - toi-toi-toi! Gruß owT von: Luc:-?
Geschrieben am: 24.02.2010 16:27:31

:-?


Beiträge aus den Excel-Beispielen zum Thema "Range in Array füllen, Problem bei Cells.Count = 1"