Microsoft Excel

Herbers Excel/VBA-Archiv

Schreiben Von Arrays in die Tabelle - Verwirrung

Betrifft: Schreiben Von Arrays in die Tabelle - Verwirrung von: Robert
Geschrieben am: 03.09.2014 15:19:24

Hallo zusammen,

ich versuche grade mich den arrays ein wenig anzunähern, und stoße dabei immer wieder auf Hürden.
z.B. Beim Wiedereinfügen von Arraywerten in eine Range.

rngZiel = arrWerte

funktioniert nicht. Es gibt zwar keine Fehlermeldung, aber Werte werden auch nicht eingefügt.
rngZiel.Select
Selection = arrWerte

Funktioniert wunderbar!

Und jetzt bin ich irgendwie mit meinem Latein am Ende und die Verwirrung ist groß.

Kompletter Code:
Set rngOutputPartNo = .Range(.Cells(3, 4), .Cells(.UsedRange.SpecialCells(xlCellTypeLastCell). _
Row, 4))
arrOutputPartNo = rngOutputPartNo
For x = LBound(arrOutputPartNo) To UBound(arrOutputPartNo)
    arrOutputPartNo(x, 1) = Left(arrOutputPartNo(x, 1), 12)
Next x
rngOutputPartNo = arrOutputPartNo

Es werden Teilenummern auf die ersten 12 Stellen gekürzt. Hatte den Code (vorher eine Schleife über alle Zeilen, ohne Array) als meinen ersten Umbauversuch ausgesucht.

Hoffe auf Hilfe!

viele Grüße
Robert

  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Rudi Maintaire
Geschrieben am: 03.09.2014 15:29:15

Hallo,
der Code ist OK.

Gruß
Rudi


  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Daniel
Geschrieben am: 03.09.2014 15:29:44

Hi

eines der grossen Mysterien von VBA ist, dass bei der Verwendung von Select manchmal Dinge tut und automatsich ergeänzt, die man ohne Select selber hinschreiben muss (insbesonder wer schonmal bei Grafikobjekten versucht hat, Select-frei zu arbeiten weiss was ich meine)

Grundsätzlich zu deinem Problem:
rngZiel ist ein Range-Objekt und Objekte zeichnen sich dadurch aus, dass sie nicht nur einen Wert haben sondern viele viele Eigenschaften (eine Range bespw die Zellwerte, die Formeln, die Hintergrundfarben, die Rahmenfarben, die Zahlenformate).
Wenn wir nun mit den Objekten arbeiten und nicht ganze Objekt verwenden sondern nur eine der vielen Eigenschaften, dann sollten wir VBA auch mitteilen, welche dieser Eigenschaften wir verwenden wollen und es nicht der VBA-Automatik überlassen sich eine der vielen Eigenschaften auszusuchen:

heißt konkrekt:


rngZiel.Value = arrWerte

Set rngOutputPartNo = .Range(.Cells(3, 4), .Cells(.UsedRange.SpecialCells(xlCellTypeLastCell).  _
_
Row, 4))
arrOutputPartNo = rngOutputPartNo.value
For x = LBound(arrOutputPartNo) To UBound(arrOutputPartNo)
    arrOutputPartNo(x, 1) = Left(arrOutputPartNo(x, 1), 12)
Next x
rngOutputPartNo.value = arrOutputPartNo

Gruß Daniel


  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Rudi Maintaire
Geschrieben am: 03.09.2014 15:58:18

Hallo,
rngZiel.Value = arrWerte
das ist in dem Fall überflüssig, da die Default-Eigenschaft des Range-Objekts .Value ist.
Schadet aber auch nicht,

Wie schon gesagt, läuft der Code bei mir auch ohne .Value.

Gruß
Rudi


  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Luschi
Geschrieben am: 03.09.2014 20:00:37

Hallo Rudi,

ich bin ja ein Verfechter der Vollständigkeit im Vba-Code, also auch die Eigenschaften/Methoden nennen, die von Hause aus als Standard definiert sind.
Da ich z.Z. wieder verstärkt VSTO mit C# & VB.Net mache, um Office-Addins zu erstellen, bin ich dazu auch gezwungen, da sonst der Compiler dumm tut.
Außerdem läßt sich der Vba-Code dann nach einer gewissen Zeit doch leichter nachvollziehbar kontrollieren.

Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Robert
Geschrieben am: 05.09.2014 12:42:33

Hallo nochmal.

Um die Verwirrung komplett zu machen:

zielrng = arrWerte funktioniert nicht
range(zielrng.address) = arrWerte funktioniert
zielrng.value = arrWerte funktioniert

Ich nehm das jetzt einfach so hin.

Vielen Dank euch!


  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Daniel
Geschrieben am: 05.09.2014 13:28:34

Hi

die automatische Verwendung der Default-Eigenschaft des Objektes funktioniert nur, wenn VBA den Objektyp eindeutig erkennen kann.

Dazu muss aber der Variablen im Deklarationsteil ein eindeutiger Objekttyp zugewiesen worden sein.
Bei einer Variant-Variablen oder wenn du undeklarierte Variablen einsetzt (diese sind dann immer vom Typ Variant) funktioniert diese Objekttyperkennung nicht und die Default-Eigenschaft kann nicht eingesetzt werden.
Dh. bei Variantvariablen gibt es keine Default-Eigenschaft deswegen muss man bei ihnen immer die zu verwendende Eigenschaft angeben:

dh:

Dim zielrng as Range
zielrng = arrWerte '-> funktioniert, .value wird bei Range-Objekten automatisch ergänzt
Dim zielrng '(oder deklaration fehlt)
zielrng.Value = arrWerte '-> bei Variant-Variablen ist die Angabe der Eigenschaft erforderlich
range(zielrng.address) = arrWerte '-> funktioniert, weil über den ausdruck RANGE der Objektyp klar definiert ist und die Default-Eigenschaft eingesezt werden kann
also nicht verwirrend, sondern eingentlich ganz logisch.

Gruß Daniel


  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Robert
Geschrieben am: 05.09.2014 13:40:21

Wäre logisch, allerdings habe ich alle Ranges als eben solche deklariert. und zwar nicht in der Sub, sondern global direkt nach Option Explicit

Dim rngOutputPartNo, rngOutputVolumes, rngOutputRevEur, rngOutputRevCom, rngOutputRevDoc As Range



  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Luschi
Geschrieben am: 05.09.2014 18:05:11

Hallo Robert,

mit 'Dim' ist die Variable nur in dem Modul/Klassenmodul bekannt, in dem sie definiert wurde.
Noch ein altbekannter Irrtum:

Dim rngOutputPartNo, rngOutputVolumes, rngOutputRevEur, rngOutputRevCom, rngOutputRevDoc As Range
Bei dieser Definition ist NUR!!! die Variable 'rngOutputRevDoc' vom Typ 'Range' - der Rest ist 'Variant'.
Um Variablen 'GLOBAL' bekannt zu machen , muß man 'Public' statt 'Dim' benutzen.

Gruß von Luschi
ausw klein-Paris



  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Robert
Geschrieben am: 08.09.2014 09:02:39

Hallo Luschi,

Das mit dem Public vs. Dim war mir bekannt, hatte eben die Variablen am Anfang von ThisWorkbook definiert (ich versuche wenn möglich immer alles in ThisWorkbook abzuhandeln)

Die Zweite Sache allerdings, tja da hast du mich erwischt.
Ich muss also für jede Variable as Range schreiben?

Gibt es da nicht eine Möglichkeit mehrere Variablen gleichzeitig zu definieren?
Oder vllt sogar eine Funktion, die die Variablen je nach Namen automatisch definiert?

also z.B. rngZelle wird automatisch zu Range, lngZähler automatisch Long und intSpalte automatisch Integer?

Wie geht ihr vor, wenn ihr ein großes Projekt habt mit 100 Variablen oder ähnlichem?

Viele Grüße
Robert


  

Betrifft: AW: Schreiben Von Arrays in die Tabelle - Verwirrung von: Daniel
Geschrieben am: 08.09.2014 10:09:57

Hi

Ja, du musst jede Variable einzeln ihren Typ zuweisen.
Du kannst zwar in einer Zeile mehrere Variablen deklarieren, aber nach jeder muss mit AS der Typ folgen.
Was andererseits den Vorteil hat, dass du in einer Zeile unterschiedliche Typen zuweisen kannst.

Es gibt zwar die Möglichkeit mit Abkürzungen zu arbeiten:
dim DeinText$ anstelle von dim DeinText as String
Aber wenn man mit den Abkürzungen nicht Vertraut ist, macht es die Deklaration nur schwerer lesbar.

Gruß Daniel


  

Betrifft: Rudi und Luschi liegen wohl richtig, denn ... von: Luc:-?
Geschrieben am: 08.09.2014 02:39:45

…die Default-Eigenschaft .Value ist tatsächlich idR überflüssig, Robert!
Der eigentl Grund wird wohl eine nicht ausreichende Deklarierung der Variablen rngZiel sein, wenn gar nichts passiert. Wird nur der 1.Wert von arrWerte oder mehrere, aber nicht alle, bzw der 1. mehrfach ausgegeben, repräsentiert rngZiel nicht den vollständigen Bereich bzw die Richtung von arrWerte stimmt nicht mit der von rngZiel überein (speziell bei Vektoren, sonst ggf verdreht).
Ein weiterer Grund für die NichtFkt kann sein, dass arrWerte eine nicht-abbildbare Form hat, was mir hier aber wenig wahrscheinlich scheint, da die anderen Varianten ja fktionieren.
Gruß, Luc :-?


 

Beiträge aus den Excel-Beispielen zum Thema "Schreiben Von Arrays in die Tabelle - Verwirrung"