質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1107閲覧

マスタシートに登録した順に配列内のデータをソートしたい

a___VBA

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/02/28 04:24

マスタシートに登録した順に配列内のデータをソートしたい

~質問内容~
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

試したこと

現在、記述済みのソート関数を用いて動作を確認致しましたが、配列内部のソートが行われていませんでした。

以上です。
大変初歩的な質問かもしれませんが、自分の力では上手くソートが扱えませんでした。
お力添えを頂けると助かります。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a___VBA

2020/02/28 06:56

ご回答ありがとうございます。 >ソースコードなど、Markdownを利用してあげると、見やすいです。 ご指摘ありがとうございます。 後ほど記入したものを編集させていただきたいと思います。
guest

回答1

0

SortPropertyData関数の引数にByValがついているからでは。
ByValを付けると値渡しになり、関数内の変更が呼び出し元に返りません。

ソート自体の確認はしていませんのであしからず。

投稿2020/02/28 05:27

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a___VBA

2020/02/28 07:01

ご回答ありがとうございます。 >ByValを付けると値渡しになり、関数内の変更が呼び出し元に返りません。 そうだったんですね。 ByValとByRefの違いをよく理解せず、とりあえずByValで引数を渡していました。 今すぐ確認することが出来ないのですが、また後程書き換えて確認してみたいと思います。 お力添えに感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問