2016-07-28 9 views
2
Sub Lottery() 
Dim A As Long 
Dim B As Long 
Dim C As Long 
Dim D As Long 
Dim E As Long 
Dim N As Long 
Dim xLot() As String 

N = 0 
ReDim xLot(1 To 169911) 
For A = 1 To 27 
    For B = A + 1 To 28 
     For C = B + 1 To 29 
      For D = C + 1 To 30 
       For E = D + 1 To 31 
        N = N + 1 

        xLot(N) = A & "-" & B & "-" & C & "-" & D & "-" & E 
        'Debug.Print xLot(N), N 
        'Range("a" & N).Value = xLot(N) 

       Next E 
      Next D 
     Next C 
    Next B 
Next A 

Range("A1:A169911").Resize(169911, 1).Value = Application.WorksheetFunction.Transpose(xLot) 

End Sub 

転置実行時エラー13型の不一致。私は65535以上の細胞に書き込むことができない別のブログを読みました。別の例では、行38840〜169911(組み合わせの数)の後、セルは#N/Aを有する。私は即時のウィンドウでそれを実行し、配列のすべての組み合わせのアカウント。どんな助けでも大歓迎です。1列に1次元配列を書き込むときにエラーが発生する

答えて

2

転置の上限は約65kです。

あなたの代わりに

ReDim xLot(1 To 169911, 1 to 1) 
'.... 
xLot(N, 1) = A & "-" & B & "-" & C & "-" & D & "-" & E 
'... 

あなたは移調する必要がない場合:

Range("A1:A169911").Value = xLot 
+0

提案された変更を反映するようにコードを調整しました。これで、「範囲外のスクリプト」が表示されましたが、ReDim xLot(1〜169911,1〜1)の2次元が必要になると思います。私はそれを直接シートに書いていますが、約7分かかります。私のマシンで。 – floatpilot99

+0

皆さんよ、ロック!!!!!!!!!!!!!!!!!! soooooooooooo多くありがとうございました。 – floatpilot99

+0

上記の私の答えに書いたコードは、実行するのに2秒もかかりません。なぜ7分かかるのかわかりません。コピーして貼り付けてみましたか?また、これらの回答の1つを「回答」してください。 –

4

転置への列の範囲を変換するのであなたは65535の以上の値のためにトランスポーズ機能を使用するカント行の範囲(およびその逆)、Excelワークシートには65535列しか存在できません。あなたは、配列に二次元を与えることによって、トランスポーズ機能をバイパスし、そうするREDIMステートメントを変更することができます:

ReDim xLot(1 To 169911,0) 

とあなたの代入文:

xLot(N,0) = A & "-" & B & "-" & C & "-" & D & "-" & E 

...とまで最終的にあなたの範囲の声明:

Range("A1:A169911").Resize(169911, 1).Value = xLot 

編集:ちょうどそれをテストし、このコードは私の仕事:

Sub Lottery() 
    Dim A As Long 
    Dim B As Long 
    Dim C As Long 
    Dim D As Long 
    Dim E As Long 
    Dim N As Long 
    Dim xLot() As String 

    N = 0 
    ReDim xLot(1 To 169911, 0) 
    For A = 1 To 27 
     For B = A + 1 To 28 
      For C = B + 1 To 29 
       For D = C + 1 To 30 
        For E = D + 1 To 31 
         N = N + 1 

         xLot(N, 0) = A & "-" & B & "-" & C & "-" & D & "-" & E 
         'Debug.Print xLot(N), N 
         'Range("a" & N).Value = xLot(N) 

        Next E 
       Next D 
      Next C 
     Next B 
    Next A 

    Range("A1:A169911").Resize(169911, 1).Value = xLot 
End Sub 
+0

2番目のディメンションを最初の1ベースのものにすることはできますか? – ThunderFrame

+0

もしあなたが好きなのであれば可能ですが、一般的に0以外の場所で配列を開始するのは悪いことです。VBAではメモリオーバーヘッドがわずかに増加します。私はこれが配列の各要素に当てはまるかどうかについてのデータはありませんので、6桁の数字がある場合はlboundを使用して運命を誘惑したくないと思います。それはとにかく問題ではありませんが、このコードはマイクロ秒単位で実行されます。 –

+1

できるだけベース0を使用することで合意しましたが、*ミキシングベースはベース1、IMOより悪いです。両方を基数0にする方が良いかもしれません。 – ThunderFrame

関連する問題