2016-12-21 11 views
-1

私はスプレッドシートに貼り付ける必要がある2つの配列を持っています。各宛先が列なので、私はそうのように、トランスポーズのコマンドを使用しています:Excel VBA:日付の配列を転置できますか?

Selection = WorksheetFunction.Transpose(arr1) 

これは、アレイの1つのために動作しますが、他は私に無効なプロシージャ呼び出し(エラー5)が得られます。どちらの配列も同じサイズです:arr(1〜79)。

"良い"配列のすべての値がVariant/Stringであり、 "不良"配列の値のほとんどがVariant/Dateであることがわかります。

実際に違いはありますか?もしそうなら、後者の配列の値を変換する方法はありますか?適切に次のコード化された

+0

これをテストすると 'WorksheetFunction.Transpose'と' Application.Transpose'メソッドの両方が正常に動作します。あなたのコードとサンプルデータの多くを表示できますか? –

+0

@DavidZemensは1次元配列を転置していますか? –

+0

@ Mat'sMugはい、たとえば「Dim arr1(2)As Variant」と入力し、「Date」型の値で埋めます。 –

答えて

0

が動作するはずです:

Sub DepositArrays() 
    Dim ary1(1 To 2) As String, ary2(1 To 2) As Date 

    ary1(1) = "James" 
    ary1(2) = "Ravenswood" 
    ary2(1) = DateSerial(1945, 1, 20) 
    ary2(2) = Date 

    With Application.WorksheetFunction 
     Range("A1:A2") = .Transpose(ary1) 
     Range("B1:B2") = .Transpose(ary2) 
    End With 
End Sub 

収量:TRANSPOSE()なし

enter image description here

を、コードが実行されますが、正しい結果は得られません。

0

なぜrangeを使用しない:

Private Sub Test() 

Dim arr(79) As Variant 
For i = o To UBound(arr) 
    arr(i) = Now 
Next 

Dim rng As Range 
Set rng = Range(Cells(2, 2), Cells(81, 2)) 
rng = WorksheetFunction.Transpose(arr) 

End Sub 

また別のオプションは、アレイトラフ、ワークシートにデータを移入反復する単純なループです:

Private Sub Test2() 

Dim arr(79) As Variant 
For i = o To UBound(arr) 
    arr(i) = Now 
Next 

For i = o To UBound(arr) 
    Cells(i + 1, 1) = arr(i) 
Next 

End Sub 
+0

I * am *範囲を使用しています。 (実際には、ListObjectの列)。簡単にするために、私はSelectionでそれをテストし、同じエラーが出たので、それは私が投稿したものです。 –

+1

ループを使用すると、プロシージャのクロールが遅くなります。配列ははるかに高速です。 (彼らが働いているとき) –

+1

私は理由が効率だと思っていましたが、配列内に多くのインデックスがない場合は、 'application.ScreenUpdating'プロパティをFalseに設定し、' Application.Calculation'をxlCalculateManualに設定することができます。実行を劇的にスピードアップします(あなたがそれに精通していない場合に備えて) – jonathana

0

どちらの方法は、私のために働きます、私がをApplicationクラスまたはWorksheetFunctionクラスのメンバーとして使用しているかどうか。配列のいずれかの要素に255文字以上の文字列が含まれていると、型の不一致エラーが発生しますが、を複製できません。エラーです。

これを空のブックでテストできますか?

Sub foo() 
Dim arr1(79), vals, rng As Range 
Dim i As Long 

For i = LBound(arr1) To UBound(arr1) 
    arr1(i) = DateAdd("d", i, #1/1/2016#) 
Next 

Set rng = Range("A1:A80") 
rng = Application.Transpose(arr1) 
vals = arr1 

Set rng = rng.Offset(, 1) 
rng = Application.WorksheetFunction.Transpose(arr1) 

'Both methods work even if the destination range is the wrong size: 
Set rng = rng.Offset(, 1).Resize(100) 
rng = Application.Transpose(arr1) 

Set rng = rng.Offset(, 1).Resize(50) 
rng = Application.WorksheetFunction.Transpose(arr1) 


End Sub 
関連する問題