メむンコンテンツぞスキップ
プログラミング_VBA_ヘッダヌ_s

[プログラミング: ExcelVBA] Transpose関数で入れ替えられる芁玠数を怜蚌しおみた

     お疲れ様です (  'ω')ノ

     VBAでは、2次元配列の䞭身を行方向、列方向の入れ替えをするずきにTranspose関数が䟿利です。

     Transpose関数は、セルをコピヌしお貌り付けする際に䜿甚する
    ”行/列の入れ替え (T)” をVBAで行うための関数です。

    xl_行列の入れ替え

     この関数はシヌト䞊に出力するずきだけでなく、2次元配列に察しおも有効です。
     しかし、このTranspose関数に぀いおは明蚘されおいない制限があるようで、ハッキリず”○行×○列に察しお有効”ずか”2次元配列の芁玠数が○個たでは入れ替えができる”ずは蚘述が無いようです。

     そこで、独自にどれぐらいたで䜿えるのかを怜蚌しおみたした。

     怜蚌環境 

    OS環境

    Excel環境


     怜蚌甚のコヌド 

    Sub WF_Transpose_test()
    '===== 倉数宣蚀 =======================================================
     Dim i As Long, j As Long
     Dim varSample As Variant
     Dim lngAryYCnt As Long, lngAryXCnt As Long
     Dim lngAryCnt As Long
    '====================================================================
     
     '----- 配列の芁玠数を指定
     lngAryYCnt = 100                       '行の芁玠数を指定
     lngAryXCnt = 290800                    '列の芁玠数を指定
     lngAryCnt = lngAryYCnt * lngAryXCnt    '芁玠数の合蚈
     
     '----- 配列を再宣蚀
     ReDim varSample(1 To lngAryYCnt, 1 To lngAryXCnt)
     
     '----- 詊す
     On Error GoTo ErrLine
     varAft = WorksheetFunction.Transpose(varSample)
     
    ErrLine:
     If Err.Number = 0 Then
       Debug.Print _
          "芁玠数" & Format(lngAryCnt, "#,##0") _
          & Format(lngAryYCnt, "(#,##0") & "*" & Format(lngAryXCnt, "#,##0)") _
          & vbTab & "正垞終了"
     Else
       Debug.Print _
          "芁玠数" & Format(lngAryCnt, "#,##0") _
          & Format(lngAryYCnt, "(#,##0") & "*" & Format(lngAryXCnt, "#,##0)") _
          & vbTab & Err.Number & vbTab & Err.Description
     
       Err.Clear
     End If
    End Sub
    

     簡単に䞊蚘の説明をするず、lngAryYCnt に配列の行にあたる芁玠数を指定し、lngAryXCnt に列にあたる芁玠数を指定したす。
     配列に入れる倀の倧きさによっお結果のバラツキが出ないように配列の各芁玠の䞭には䜕も代入しおいたせん。
     そしお、そのたたコヌドを実行するずむミディ゚むトりィンドりに配列の芁玠数合蚈(行芁玠数×列芁玠数)ず”正垞終了” たたは ゚ラヌ番号ず゚ラヌメッセヌゞが出力されたす。

     実行結果 

     実行結果は、以䞋の通りです。

    芁玠数27,000,000(1,000*27,000) 正垞終了
    芁玠数28,000,000(1,000*28,000) 正垞終了
    芁玠数29,000,000(1,000*29,000) 正垞終了
    芁玠数30,000,000(1,000*30,000) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,000,000(1,000*29,000) 正垞終了
    芁玠数30,000,000(1,000*30,000) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,500,000(1,000*29,500) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,800,000(1,000*29,800) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,300,000(1,000*29,300) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,000,000(1,000*29,000) 正垞終了
    芁玠数29,200,000(1,000*29,200) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,100,000(1,000*29,100) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,050,000(1,000*29,050) 正垞終了
    芁玠数29,080,000(1,000*29,080) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,070,000(1,000*29,070) 正垞終了
    芁玠数29,075,000(1,000*29,075) 正垞終了
    芁玠数29,078,000(1,000*29,078) 正垞終了
    芁玠数29,079,000(1,000*29,079) 正垞終了
    芁玠数29,080,000(1,000*29,080) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,079,500(100*290,795) 正垞終了
    芁玠数29,079,800(100*290,798) 正垞終了
    芁玠数29,079,900(100*290,799) 正垞終了
    芁玠数29,080,000(100*290,800) 正垞終了
    芁玠数29,080,000(1,000*29,080) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,080,000(1,000*29,080) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,080,000(29,080*1,000) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,080,000(290,800*100) 1004 WorksheetFunction クラスの Transpose プロパティを取埗できたせん。
    芁玠数29,080,000(100*290,800) 正垞終了

     厳密に゚ラヌになるか、ならないかの閟倀ずなる芁玠数を1぀ず぀探したわけではありたせん。
     ただ、結果ずしおは行×列の芁玠数が 29,080,000個ずなるあたりで゚ラヌが発生しおいたす。

     しかし、出力された結果を䞊から芋おいくず 芁玠数29,080,000個 でも
    行1,000 × 列:29,080 の堎合ず 行:100 × 列:290,800 の堎合でぱラヌが発生するかどうかが違うようです。
     さらに 行:100 × 列290,800 でぱラヌになりたせんでしたが、
    行:290,800 × 列:100 でぱラヌになっおいたす。

     因みに䞋がコヌド実行䞭の゚ラヌになる盎前のタスクマネヌゞャヌです。

    xl_行列の入れ替え_task

     䞀時的にではありたすが、Excelのプロセスでメモリが2,504MB䜿甚されおいたす。
     Excelファむルを開いおいるだけだず60数MBだったので、2,400MB前埌もコヌドの実行に䜿甚されおいるようでした。

     あず、画像は残しおいたせんでしたが、䞊で蚘した実行結果の前に23床テストをしおいたしたが、゚ラヌが発生した芁玠数を䞀旊ファむルを閉じおから再床実行した時に゚ラヌが発生せずに正垞終了したこずもありたした。

     そのこずを螏たえ、タスクマネヌゞャで䜿甚されおいるメモリを芋おいるず芁玠数〇個たでTranspose関数で入れ替えができるずいうよりメモリ䜿甚量ずの兌ね合いなのではないかず思われたす。

     たた、この怜蚌では配列の各芁玠には倀を代入しおいたせん。ですので、各芁玠の倀はEmptyのたたになっおいたす。
     このTranspose関数では、䜿甚しおいるPCの性胜やExcelが64bit版でも入れ替えできる芁玠数の䞊限が倉わっおきそうです。

     結論 

    ・PCの性胜やその時の䜿甚メモリによる
    ・配列内にどれぐらいの情報量(倀)があるかで倉わる
    ・Excelが64bit版だずExcelで䜿甚できるメモリ容量が倉わるので、そこでも倉わるず思われる


     最埌たで、蚘事を読んでいただきありがずうございたした

     宜しければ ”スキ” をしおもらえるず僕のモチベヌションが䞊がり、たた次の蚘事に぀なげるこずができたす。

     どうぞよろしくお願いしたす

     
     
    Excel, Access, VBAが奜きです。 MySQL/MariaDB, SQLServerも䜿っおいたした。 VBAを䞭心に仕事で䜿える知識や技術を蚘事にたずめおいたす。 良かったら是非芋お䞋さい

    あなたぞのおすすめ