2017-01-04 5 views
0

Wie ich jetzt bewusst bin, Array in Excel haben zwei Arten von Darstellung:Konvertieren eines VBA-Array in einer "Spalte" Array

{1,2,3,4} also known as "one-dimensional horizontal array" 

und

{1;2;3;4} also known as "one-dimensional vertical array" 

Ich habe eine VBA-Funktion, gebe ein Array zurück, aber wenn ich es in einer Funktion verwende, die Arrays benötigt (SUMPRODUCT), zeigt Excel es mit Kommas an. Es wird also immer als horizontales Array interpretiert. Es ist in Ordnung, wenn ich das Produkt mit einem anderen horizontalen Array haben möchte, aber es funktioniert nicht, wenn ich es mit einem vertikalen Array versuche.

VBA:

Function MyRange() 
    Dim output(2) 
    output(0) = 1 
    output(1) = 1 
    output(2) = 1 
    MyRange = output 
End Function 

Excel

=SUMPRODUCT(MyRange();{1,1,1}) works 
=SUMPRODUCT(MyRange();{1;1;1}) is not working 

Meine Frage?

Wie kann ich Excel haben, um {1; 1; 1} anstelle von {1,1,1} im ersten Array anzuzeigen?

enter image description here

+3

'= SUMMENPRODUKT (TRANSPOSE (MyRange()); {1; 1; 1})'? –

+0

@ScottCraner Wenn Sie eine Antwort erstellen möchten. Ich werde es akzeptieren. Danke vielmals ! –

+1

oder vielleicht 'INDEX ({1; 1; 1}, 0,1)' oder 'MyRange = Application.Transpose (Ausgabe)' in VBA – Slai

Antwort

2

Verwenden Transponierung es wechseln:

=SUMPRODUCT(MyRange();TRANSPOSE({1;1;1})) 
+0

Wirklich seltsam. Es sieht perfekt im Funktionsassistenten aus, aber Excel gibt immer noch #VALUE zurück! wenn ich auf OK klicke! –

+0

Ich setze die TRANSPOSE auf den anderen Part '= SUMMENPRODUKT (MyRange(); TRANSPOSE ({1; 1; 1}))' und es funktioniert jetzt! Danke vielmals ! –

+0

Schließlich, und leider für mich, scheint TRANSPOSE nur auf "hardcoded" Array zu arbeiten. Wenn ich eine andere EXCEL-Funktion anstelle von TRANSPOSE (- (WEEKDAY (D3: D1257,3) <5)) oder '- (TRANSPOSE (WEEKDAY (D3: D1257,3)) <5)', den Assistenten zeige es richtig, aber nicht in der Zelle :( –

1

Eine weitere etwas schnelle Option ist es, eine "vertikale" Anordnung (nicht getestet) zu verwenden:

Function MyRange() 
    Dim output(1 To 3, 1 To 1) 
    output(1, 1) = 1 
    output(2, 1) = 2 
    output(3, 1) = 3 
    MyRange = output 
End Function 

oder ein bisschen langsamer (auch nicht getestet):

Function MyRange() 
    MyRange = [{1;2;1}] 
    MyRange(3, 1) = 3 
End Function 
Verwandte Themen