マスタシートに登録した順に配列内のデータをソートしたい
~質問内容~
VBAを用いてシートのデータを、配列に入れ、マスタシートの内容に沿ってソートし、出力するというマクロを作りたいと思っています。
具体例
|人名|月|商品|値段|
|A| |1 | |I| |120|
|B| |12| |J| |130|
|C| |3 | |K| |140|
|D| |4 | |L| |150|
1、上記のようなExcelシートの情報を1行ずつ配列に入れる。
2、「月」の情報で配列をソートする(マスタシートの情報に沿って)
3、別ブックに出力する
私が今実装したいと考えているのは、「2」の配列の中身をソートする(マスタシートに沿って)という部分です。
~マスタシートについて~
マスタシートは4月~9月を上期、10月から3月までを下期としています。
なので、上期の中で月の若いデータから順に並べ
下期の中からも同様にソートしたいと考えております。
理想
ソート前 ソート後
|人名|月|商品|値段| |人名|月|商品|値段|
|A| |1 | |I| |120| |D| |4 | |L| |150|
|B| |12| |J| |130| → |B| |12 | |J| |130|
|C| |3 | |K| |140| |A| |1 | |I| |120|
|D| |4 | |L| |150| |C| |3 | |K| |140|
表を作ってみましたが、見辛いかもしれません。
申し訳ございません。
~ソースコード~
言語:VBA
Dim tempFile As Object
Dim propertyData() As Variant
ReDim propertyData(1, 0)
Dim k As Long
k = 0
Dim j As Long
j = 11
For Each tempFile In filesForInput Dim wb As Object Set wb = Workbooks.Open(tempFile) Dim ws As Worksheet Set ws = ActiveSheet Dim endRow As Long Dim xlEndRow As Long xlEndRow = ActiveWorkbook.ActiveSheet.Cells(Rows.Count, 1).Row endRow = ActiveWorkbook.ActiveSheet.Cells(xlEndRow, 4).End(xlUp).Row Dim endCol As Long endCol = 14 For j = 11 To endRow If ActiveWorkbook.ActiveSheet.Cells(j, 4) = "" Then propertyData(k - 1, 9) = propertyData(k - 1, 9) & "," & Worksheets(1).Cells(j, 20).Value Else propertyData = Expand2DimArr(propertyData, UBound(propertyData) + 2, endCol) propertyData(k, 0) = Worksheets(1).Cells(j, 3).Value 'k = 0 → 手法 propertyData(k, 1) = Worksheets(1).Cells(j, 4).Value 'k = 1 → 物件名(事業名称) propertyData(k, 2) = Worksheets(1).Cells(j, 7).Value 'k = 2 → 4月時点 propertyData(k, 3) = Worksheets(1).Cells(j, 8).Value 'k = 3 → 期初状態(上期) propertyData(k, 4) = Worksheets(1).Cells(j, 9).Value 'k = 4 → 10月時点 propertyData(k, 5) = Worksheets(1).Cells(j, 10).Value 'k = 5 → 期初状態(下期) propertyData(k, 6) = Worksheets(1).Cells(j, 11).Value 'k = 6 → 月 propertyData(k, 7) = Worksheets(1).Cells(j, 13).Value 'k = 7 → 修正前(年度) propertyData(k, 8) = Worksheets(1).Cells(j, 14).Value 'k = 8 → 修正前(月) propertyData(k, 9) = Worksheets(1).Cells(j, 20).Value 'k = 9 → 担当 propertyData(k, 10) = Worksheets(1).Cells(j, 22).Value 'k = 10 → 売り上げ propertyData(k, 11) = Worksheets(1).Cells(j, 27).Value 'k = 11 → 進捗率 propertyData(k, 12) = Worksheets(1).Cells(j, 28).Value 'k = 12 → 計上金額 k = k + 1 End If Next j ActiveWorkbook.Close Next tempFile
Call DecideHowSort(propertyData)
Private Function DecideHowSort(propertyDataForSorting As Variant)
'ソートの基準を決めるプロシージャ
Dim k As Long
Dim j As Long
k = 0
j = 0
'配列内の月でソートをかける
For k = 0 To UBound(propertyDataForSorting, 1)
If propertyDataForSorting(k, 6) <> "-" Then
For j = k To UBound(propertyDataForSorting, 1)
If propertyDataForSorting(k, 6) <> "-" And propertyDataForSorting(j, 6) <> "-" And propertyDataForSorting(k, 6) > propertyDataForSorting(j, 6) Then
Call SortPropertyData(propertyDataForSorting, k, j)
ElseIf propertyDataForSorting(k, 6) <> "-" And propertyDataForSorting(j, 6) <> "-" And propertyDataForSorting(k, 6) = propertyDataForSorting(j, 6) Then
If propertyDataForSorting(k, 1) > propertyDataForSorting(j, 1) Then
Call SortPropertyData(propertyDataForSorting, k, j)
End If
End If
Next j
End If
Next k
End Function
’実際のソート関数
Private Function SortPropertyData(ByVal propertyData As Variant, ByVal lngI As Long, ByVal lngJ As Long)
Dim i As Long Dim varTmp As Variant For i = 1 To UBound(propertyData, 2) varTmp = propertyData(lngI, i) propertyData(lngI, i) = propertyData(lngJ, i) propertyData(lngJ, i) = varTmp Next i
End Function
試したこと
現在、記述済みのソート関数を用いて動作を確認致しましたが、配列内部のソートが行われていませんでした。
以上です。
大変初歩的な質問かもしれませんが、自分の力では上手くソートが扱えませんでした。
お力添えを頂けると助かります。
よろしくお願い致します。