SSブログ

エクセル小僧:入れ子になっている1次元配列を2次元配列に変換 [コンピューター]

VBAマクロで、入れ子になっている1次元配列を2次元配列に変換し、ワークシート上に縦方向
に展開した後、横方向に転置するというのをやってみました。

ワークシートは、こんな感じ。

kinmu2.jpg

【参考】
Arrayのネスト2次元にした配列を、3行3列のセル範囲に一括転送したい
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14152979474

VBAで配列を引数・戻り値にする方法
https://qiita.com/ryosuke0825/items/93eb8a284eb5dba59f29

【マクロ】
Sub 勤務名の転置()
  '【変数】
  Dim 勤務名1(), 勤務名2() As Variant ' 勤務名
  Dim Range1_勤務() As Variant ' 転置前の縦並びの勤務名の開始セル
  Dim RangeName1() As Variant ' 転置前の縦並びの勤務名のRange名
  Dim RangeName2() As Variant ' 転置後の横並びの勤務名のRange名
  Dim Range1_勤務名() As Variant ' 転置前の縦並びの勤務名のRange
  Dim Range2_勤務名() As Variant ' 転置後の横並びの勤務名のRange
  Dim myRow1() As Variant ' 行番号
  Dim myCol1() As Variant ' 列番号
  Dim i, j As Long ' カウンタ
  '【実行コード】
  勤務名1 = Array( _
    Array("A1", "A", "A入", "A1補", "A(喀)", "2西A1", "", "", "", "", "", ""), _
    Array("C1", "C", "C入", "C1ホ", "C1補", "C1入", "受C", "", "", "", "", ""), _
    Array("C2", "C2ホ", "C2補", "", "", "", "", "", "", "", "", ""), _
    Array("夜A", "夜B", "夜C", "夜D", "夜E", "夜F", "夜A補", "夜B補", "夜C補", "夜D補", "夜E補", "夜F補"), _
    Array("休", "リ", "有", "記", "", "", "", "", "", "", "", "") _
  )
  Range1_勤務() = Array("B19", "C19", "D19", "E19", "F19") ' 転置前の縦並びの勤務名の開始セル
  RangeName1 = Array("勤務名_1", "_A1", "_C1", "_C2", "_夜勤", "_休")
  RangeName2 = Array("勤務名_2", "_A1_2", "_C1_2", "_C2_2", "_夜勤_2", "_休_2")
  Range1_勤務名 = Array("B19:F30", "B19:B24", "C19:C25", "D19:D21", "E19:E30", "F19:F22")
  Range2_勤務名 = Array("B32:M36", "B32:G32", "B33:H33", "B34:D34", "B35:M35", "B36:E36")
  ' 入れ子になっている1次元配列から2次元配列への変換
  勤務名2() = myTransArray1(勤務名1())
  ' Debug.Print "勤務名2(1,6)=" & 勤務名2(1, 6)
  Debug.Print "UBound(勤務名2,2)=" & UBound(勤務名2, 2)
  '
  myRow1 = Array(0, 0) ' 行番号配列の初期化
  myCol1 = Array(0, 0) ' 列番号配列の初期化
  ' 転置前後の勤務名の全体のセル範囲の名前付け
  Range(Range1_勤務名(0)).Name = RangeName1(0)
  Range(Range2_勤務名(0)).Name = RangeName2(0)
  ' 転置後の横並びの勤務名のセル範囲の名前付け
  For i = 0 To UBound(勤務名2, 1)
    Range(Range2_勤務名(i + 1)).Name = RangeName2(i + 1) ' 転置後の横並びの勤務名のセル範囲に名前付け
  Next i
  ' 転置前の縦並びの勤務名を各セルに代入
  For i = 0 To UBound(勤務名2, 1)
    myRow1(0) = Range(Range1_勤務(i)).Row
    myCol1(0) = Range(Range1_勤務(i)).Column
    Range(Range1_勤務名(i + 1)).Name = RangeName1(i + 1) ' 転置前の縦並びの勤務名のセル範囲に名前付け
    ' Debug.Print "myRow1(0)=" & myRow1(0)
    ' Debug.Print "myCol1(0)=" & myCol1(0)
    For j = 0 To UBound(勤務名2, 2)
      ActiveSheet.Cells(myRow1(0) + j, myCol1(0)).Value = 勤務名2(i, j)
    Next j
  Next i
  ' 勤務名の転置
  Range(RangeName2(0)).Select
  Selection.FormulaArray = "=TRANSPOSE(" & RangeName1(0) & ")"
End Sub

Function myTransArray1(ByRef myArray1() As Variant) As Variant()
  '【機能】入れ子になっている1次元配列から2次元配列への変換
  '【変数】
  Dim i, j As Long ' 整数
  Dim myArray2() As Variant ' 出力配列
  '【実行コード】
  ReDim myArray2(UBound(myArray1), UBound(myArray1(0)))
  For j = 0 To UBound(myArray1)
    For i = 0 To UBound(myArray1(0))
      myArray2(j, i) = myArray1(j)(i)
    Next i
  Next j
  myTransArray1 = myArray2()
End Function

ヤバイぜ!(10)  コメント(2) 
共通テーマ:パソコン・インターネット

ヤバイぜ! 10

コメント 2

(。・_・。)2k

今年もありがとうございました
新年もよろしくお願いいたします
佳い新年をお迎え下さい


by (。・_・。)2k (2021-12-31 19:38) 

cheese999

ヤバイぜ! ありがとうございます(^_0)ノ

(。・_・。)2k さん、
今年もよろしくお願いします。
by cheese999 (2022-01-01 22:10) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字(英大文字の「オー」、英小文字の「ユー」、アラビア数字の「ハチ」、アラビア数字の「イチ」、アラビア数字の「ニ」)を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。