Microsoft Excel

Herbers Excel/VBA-Archiv

VBA

Betrifft: VBA von: Kopsch
Geschrieben am: 15.09.2020 08:53:47

Hallo,
ich möchte in Excel VBA einen Vektor transponieren
Leider bekomme ich die Fehlermeldung: " keine Zuweisung zum Datenfeld möglich"

Dim a(5) As Double
Dim b(5) As Double
For i=0 To 5
a(i)=i
Next i
b=Application.Transpose(b)

Vielen Dank für die schnelle Hilfe

Betrifft: AW: VBA
von: Yal
Geschrieben am: 15.09.2020 09:22:54

Hallo Kopsch,

Transpose ist keine VBA sondern eine Worksheet-Funktion. So wird es abgerufen:
b = Application.WorksheetFunction.Transpose(a)

Jedoch sind die eindimensionale Array in VBA "ungerichtet". Es muss mindestens zweidimensional sein, sodass der Transpose eine Wirkung hat.

Viel Erfolg
Yal

Betrifft: Falsch, ...
von: Luc:?
Geschrieben am: 15.09.2020 19:42:20

…Yal:
1. Es gibt 2 AufrufMethoden für WorksheetFunctions, die sich in ihrem Ergebnis etwas unterscheiden können, aber sonst den gleichen Bedingungen folgen → Application.~ und WorksheetFunction.~, wobei letzteres mit Application.WorksheetFunction.~ identisch ist.
2. 1dimensionale Arrays sind in VBA nicht ungerichtet, sondern sind 1stufigen Tensoren(0,1)* gleich, die Kovektoren entsprechen. Ein 1maliges .Transpose erzeugt daraus folglich ein 2dimensionales VBA-Array, das einem Vektor entspricht.
3. Der Fehler liegt woanders, was auch aus der F-Meldung ersichtlich ist: Man kann einem dimensionierten Datenfeld kein Array als Ganzes zuweisen, sondern nur seinen EinzelElementen oder die Werte des anderen Arrays eben einzeln, wobei es hier eben auch 2dimensional angelegt sein müsste, sonst wäre das wirkungslos. Daraus folgt, dass das Transponieren bei dieser Methode gar nicht erforderlich wäre.
Man kann aber b als Variant dimensionieren und dann klappt diese Zuweisung auch so wie ursprüngl vorgesehen.
* Vgl auch diesen Thread!
Gruß, Luc :-?

„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Nichtsdestotrotz Durchblick verbessern mit …


Betrifft: AW: Falsch, ...
von: Kopsch
Geschrieben am: 16.09.2020 06:50:55

Danke für die Antwort,
b als Variant zu definieren hat geklappt und funktioniert
siehe auch Antwort von Nepumuk

Betrifft: Bitte sehr, war aber an Yal gerichtet! owT
von: Luc:?
Geschrieben am: 16.09.2020 20:10:14

:-?

Betrifft: Habe was gelernt, Vielen Dank. owT
von: Yal
Geschrieben am: 18.09.2020 11:52:45

Also b als Variant definieren, weil 2Dimesionierung ohne Lange vorher zu festlegen nicht geht.

Betrifft: Da du owT im Betreff geschrieben hattest, ...
von: Luc:?
Geschrieben am: 19.09.2020 16:57:02

…Yal,
hatte ich mit keinem weiteren Text gerechnet.
Wenn man eine Variable zB As Long deklariert, kann diese genau einen Wert und kein Array aufnehmen. Soll sie vom DatenTyp Long sein und ein Array aufnehmen, muss sie auch als Array dimensioniert wdn. Dann kann aber nur jedes Element genau einen Wert aufnehmen. Diese Einzelwerte müssen den Array-Elementen dann per Schleife übergeben wdn.
Ist der DatenTyp einer Variable aber Variant, kann sie alles aufnehmen, Einzelwerte, Arrays und sogar Objekte. Deshalb haben wir das hier vorgeschlagen.
Luc :-?

Betrifft: AW: VBA
von: max.kaffl@gmx.de
Geschrieben am: 15.09.2020 10:16:45

Hallo Kopsch,

so:

Public Sub Test()
    Dim a(5) As Double
    Dim b As Variant
    Dim i As Long
    For i = 0 To 5
        a(i) = i
    Next i
    b = Application.Transpose(a)
End Sub

Gruß
Nepumuk

Betrifft: AW: VBA
von: Kopsch
Geschrieben am: 15.09.2020 13:47:12

Vielen dank,
es funktioniert wie gewünscht

Betrifft: AW: VBA
von: Kopsch
Geschrieben am: 15.09.2020 13:47:26

Vielen dank,
es funktioniert wie gewünscht