teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

修正

2021/08/22 14:18

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -1,4 +1,4 @@
1
- <再追記>
1
+ こんな感じでどうでしょうか。
2
2
  ```VBA
3
3
  Public Function zyun_csvimport_Sort() As Boolean
4
4
  On Error GoTo Sort_ERROR
@@ -8,9 +8,10 @@
8
8
  Dim j As Long
9
9
  Dim r As Long
10
10
 
11
+ For r = 0 To UBound(ranking, 1) '地区ごとに処理
12
+
11
- 'バブルソート start
13
+ 'バブルソート start
12
- For r = 0 To UBound(ranking, 1) '事業所
13
- For i = UBound(ranking, 2) To LBound(ranking, 2) Step -1 '法人
14
+ For i = UBound(ranking, 2) To LBound(ranking, 2) Step -1
14
15
  For j = LBound(ranking, 2) To i - 1
15
16
  If ranking(r, j).kon_salesamount < ranking(r, j + 1).kon_salesamount Then
16
17
  vSwap = ranking(r, j)
@@ -18,9 +19,10 @@
18
19
  ranking(r, j + 1) = vSwap
19
20
  End If
20
21
  Next j
21
- Next i
22
+ Next i
23
+ 'バブルソート end
24
+
22
25
  Next r
23
- 'バブルソート end
24
26
 
25
27
  'ここは関係ない
26
28
  zyun_csvimport_Sort = True '正常終了の場合は Trueを返す
@@ -29,109 +31,4 @@
29
31
  zyun_csvimport_Sort = False
30
32
  MsgBox "zyun_csvimport_Sort(ソート部分)でエラー"
31
33
  End Function
32
-
33
- ```
34
- <追記>
35
- > 引用テキストranking(officena, ko_kx) の officenaは事業所ごとに分けています。
36
- なので一次元では表現ができないです
37
- 一次元には事業所 2次元目が法人名 になります
38
-
39
- それはこういうことですか。
40
- |ranking|0|1|2|3|
41
- |:--:|:--:|:--:|:--:|:--:|
42
- |**0(A事業所)**|A事業所,法人a1,,10|A事業所,法人a2,,13|A事業所,法人a3,,20
43
- |**1(B事業所)**|B事業所,法人b1,,50|B事業所,法人b2,,10|B事業所,法人b3,,13|B事業所,法人b4,,12|
44
- |**2(C事業所)**|C事業所,法人c1,,40|C事業所,法人c2,,10
45
- |**:**|:|
46
-
47
- それともこういうことですか。
48
-
49
- |ranking|0(法人a)|1(法人b)|2(法人c)|3(法人d)|
50
- |:--:|:--:|:--:|:--:|:--:|
51
- |**0(A事業所)**|A事業所,法人a,,100|A事業所,法人b,,1003|A事業所,法人c,,2100|A事業所,法人d,,1010|
52
- |**1(B事業所)**|B事業所,法人a,,500|B事業所,法人b,,1005|B事業所,法人c,,1300|B事業所,法人d,,1020|
53
- |**2(C事業所)**|C事業所,法人a,,400|C事業所,法人b,,1020|C事業所,法人c,,1030|C事業所,法人d,,1200|
54
- |**:**|:|
55
-
56
- あと、並べ替えは、どの範囲で行うのですか?
57
- ・同一事業所内で各法人を数字の大きい順に並べ替える?
58
- ・各事業所を、その事業所内の数字の合計で並び替える?
59
-
60
- ---
61
- <元の回答>
62
-
63
- ranking(j, k) と ranking(j + 1, k) を入れ替えるなら
64
- vSwap に退避するのは ranking(j, k) ではないのでしょうか。
65
-
66
- ---
67
- なお、二次元配列を並び替えるといっても、参考サイトとはやろうとしていることが若干異なる気がします。
68
- 参考サイトは、たとえば2列目の値で行をソートし、A→C→B事業所の順にするようなイメージ。
69
- |argAry|0|1|2|3|
70
- |:--:|:--:|:--:|:--:|:--:|
71
- |**0**|A事業所|xxx|200|aa|
72
- |**1**|B事業所|xxx|100|bb|
73
- |**2**|C事業所|xxx|300|cc|
74
-
75
-
76
- 一方、ご提示のranking配列は、各事業所データを1つの構造体にしたうえで更に二次元配列になっていて、
77
- 簡易的に書くと以下のような状態に見えます。
78
- |ranking|0|1|2|3|
79
- |:--:|:--:|:--:|:--:|:--:|
80
- |**0**|A事業所,,,100|D事業所,,,1003|G事業所,,,2100|J事業所,,,1010|
81
- |**1**|B事業所,,,500|E事業所,,,1005|H事業所,,,1300|K事業所,,,1020|
82
- |**2**|C事業所,,,400|F事業所,,,1020|I事業所,,,1030|L事業所,,,1200|
83
-
84
-
85
-
86
- ---
87
- やりたいことが、単純な(一次元的な)並べ替えだとしたら、
88
- rankingの配列の定義を以下のように変えるべきではないでしょうか。
89
-
90
- ||ranking|
91
- |:--:|:--:|
92
- |**0**|A事業所,,,100|
93
- |**1**|B事業所,,,500|
94
- |**2**|C事業所,,,400|
95
- |**:**|:|
96
-
97
- ```VBA
98
- Const ranking_table_max = 99
99
-
100
- Type ranking_table
101
- officename As String '事業所名
102
- sei_corporationname As String '法人正式名
103
- corporationname As String '法人名
104
- corporationno As Long '法人番号
105
- zen_salesamount As Currency '前年売上高
106
- kon_salesamount As Currency '当年売上高
107
- End Type
108
- Public ranking(0 To ranking_table_max) As ranking_table ' /// 一次元配列に変更
109
- '
110
-
111
- Public Function zyun_csvimport_Sort() As Boolean
112
- On Error GoTo Sort_ERROR
113
-
114
- Dim vSwap As ranking_table
115
- Dim i As Long
116
- Dim j As Long
117
-
118
- 'バブルソート start
119
- For i = UBound(ranking) To LBound(ranking) Step -1
120
- For j = LBound(ranking) To i - 1
121
- If ranking(j).kon_salesamount > ranking(j + 1).kon_salesamount Then
122
- vSwap = ranking(j)
123
- ranking(j) = ranking(j + 1)
124
- ranking(j + 1) = vSwap
125
- End If
126
- Next j
127
- Next i
128
- 'バブルソート end
129
-
130
- 'ここは関係ない
131
- zyun_csvimport_Sort = True '正常終了の場合は Trueを返す
132
- Exit Function
133
- Sort_ERROR:
134
- zyun_csvimport_Sort = False
135
- MsgBox "zyun_csvimport_Sort(ソート部分)でエラー"
136
- End Function
137
34
  ```

5

追記

2021/08/22 14:18

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -1,3 +1,36 @@
1
+ <再追記>
2
+ ```VBA
3
+ Public Function zyun_csvimport_Sort() As Boolean
4
+ On Error GoTo Sort_ERROR
5
+
6
+ Dim vSwap As ranking_table
7
+ Dim i As Long
8
+ Dim j As Long
9
+ Dim r As Long
10
+
11
+ 'バブルソート start
12
+ For r = 0 To UBound(ranking, 1) '事業所
13
+ For i = UBound(ranking, 2) To LBound(ranking, 2) Step -1 '法人
14
+ For j = LBound(ranking, 2) To i - 1
15
+ If ranking(r, j).kon_salesamount < ranking(r, j + 1).kon_salesamount Then
16
+ vSwap = ranking(r, j)
17
+ ranking(r, j) = ranking(r, j + 1)
18
+ ranking(r, j + 1) = vSwap
19
+ End If
20
+ Next j
21
+ Next i
22
+ Next r
23
+ 'バブルソート end
24
+
25
+ 'ここは関係ない
26
+ zyun_csvimport_Sort = True '正常終了の場合は Trueを返す
27
+ Exit Function
28
+ Sort_ERROR:
29
+ zyun_csvimport_Sort = False
30
+ MsgBox "zyun_csvimport_Sort(ソート部分)でエラー"
31
+ End Function
32
+
33
+ ```
1
34
  <追記>
2
35
  > 引用テキストranking(officena, ko_kx) の officenaは事業所ごとに分けています。
3
36
  なので一次元では表現ができないです

4

追記

2021/08/22 10:59

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -1,3 +1,32 @@
1
+ <追記>
2
+ > 引用テキストranking(officena, ko_kx) の officenaは事業所ごとに分けています。
3
+ なので一次元では表現ができないです
4
+ 一次元には事業所 2次元目が法人名 になります
5
+
6
+ それはこういうことですか。
7
+ |ranking|0|1|2|3|
8
+ |:--:|:--:|:--:|:--:|:--:|
9
+ |**0(A事業所)**|A事業所,法人a1,,10|A事業所,法人a2,,13|A事業所,法人a3,,20
10
+ |**1(B事業所)**|B事業所,法人b1,,50|B事業所,法人b2,,10|B事業所,法人b3,,13|B事業所,法人b4,,12|
11
+ |**2(C事業所)**|C事業所,法人c1,,40|C事業所,法人c2,,10
12
+ |**:**|:|
13
+
14
+ それともこういうことですか。
15
+
16
+ |ranking|0(法人a)|1(法人b)|2(法人c)|3(法人d)|
17
+ |:--:|:--:|:--:|:--:|:--:|
18
+ |**0(A事業所)**|A事業所,法人a,,100|A事業所,法人b,,1003|A事業所,法人c,,2100|A事業所,法人d,,1010|
19
+ |**1(B事業所)**|B事業所,法人a,,500|B事業所,法人b,,1005|B事業所,法人c,,1300|B事業所,法人d,,1020|
20
+ |**2(C事業所)**|C事業所,法人a,,400|C事業所,法人b,,1020|C事業所,法人c,,1030|C事業所,法人d,,1200|
21
+ |**:**|:|
22
+
23
+ あと、並べ替えは、どの範囲で行うのですか?
24
+ ・同一事業所内で各法人を数字の大きい順に並べ替える?
25
+ ・各事業所を、その事業所内の数字の合計で並び替える?
26
+
27
+ ---
28
+ <元の回答>
29
+
1
30
  ranking(j, k) と ranking(j + 1, k) を入れ替えるなら
2
31
  vSwap に退避するのは ranking(j, k) ではないのでしょうか。
3
32
 

3

修正

2021/08/22 10:22

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -11,7 +11,8 @@
11
11
  |**2**|C事業所|xxx|300|cc|
12
12
 
13
13
 
14
- 一方、ご提示のranking配列は、構造体二次元になっていて、簡易的に書くと以下のような状態に見えます。
14
+ 一方、ご提示のranking配列は、各事業所データを1つの構造体にしたうえで更に二次元配列になっていて、
15
+ 簡易的に書くと以下のような状態に見えます。
15
16
  |ranking|0|1|2|3|
16
17
  |:--:|:--:|:--:|:--:|:--:|
17
18
  |**0**|A事業所,,,100|D事業所,,,1003|G事業所,,,2100|J事業所,,,1010|
@@ -21,8 +22,8 @@
21
22
 
22
23
 
23
24
  ---
24
- やりたいことが、単純な(一次元的な)並べ替え、つまり以下のようなものだとしたら、
25
+ やりたいことが、単純な(一次元的な)並べ替えだとしたら、
25
- rankingの配列の定義を変えるべきではないでしょうか。
26
+ rankingの配列の定義を以下のように変えるべきではないでしょうか。
26
27
 
27
28
  ||ranking|
28
29
  |:--:|:--:|

2

追記

2021/08/22 04:09

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  ---
5
5
  なお、二次元配列を並び替えるといっても、参考サイトとはやろうとしていることが若干異なる気がします。
6
+ 参考サイトは、たとえば2列目の値で行をソートし、A→C→B事業所の順にするようなイメージ。
6
7
  |argAry|0|1|2|3|
7
8
  |:--:|:--:|:--:|:--:|:--:|
8
9
  |**0**|A事業所|xxx|200|aa|
@@ -10,9 +11,64 @@
10
11
  |**2**|C事業所|xxx|300|cc|
11
12
 
12
13
 
13
-
14
+ 一方、ご提示のranking配列は、構造体が二次元になっていて、簡易的に書くと以下のような状態に見えます。
14
15
  |ranking|0|1|2|3|
15
16
  |:--:|:--:|:--:|:--:|:--:|
16
17
  |**0**|A事業所,,,100|D事業所,,,1003|G事業所,,,2100|J事業所,,,1010|
17
18
  |**1**|B事業所,,,500|E事業所,,,1005|H事業所,,,1300|K事業所,,,1020|
18
- |**2**|C事業所,,,400|F事業所,,,1020|I事業所,,,1030|L事業所,,,1200|
19
+ |**2**|C事業所,,,400|F事業所,,,1020|I事業所,,,1030|L事業所,,,1200|
20
+
21
+
22
+
23
+ ---
24
+ やりたいことが、単純な(一次元的な)並べ替え、つまり以下のようなものだとしたら、
25
+ rankingの配列の定義を変えるべきではないでしょうか。
26
+
27
+ ||ranking|
28
+ |:--:|:--:|
29
+ |**0**|A事業所,,,100|
30
+ |**1**|B事業所,,,500|
31
+ |**2**|C事業所,,,400|
32
+ |**:**|:|
33
+
34
+ ```VBA
35
+ Const ranking_table_max = 99
36
+
37
+ Type ranking_table
38
+ officename As String '事業所名
39
+ sei_corporationname As String '法人正式名
40
+ corporationname As String '法人名
41
+ corporationno As Long '法人番号
42
+ zen_salesamount As Currency '前年売上高
43
+ kon_salesamount As Currency '当年売上高
44
+ End Type
45
+ Public ranking(0 To ranking_table_max) As ranking_table ' /// 一次元配列に変更
46
+ '
47
+
48
+ Public Function zyun_csvimport_Sort() As Boolean
49
+ On Error GoTo Sort_ERROR
50
+
51
+ Dim vSwap As ranking_table
52
+ Dim i As Long
53
+ Dim j As Long
54
+
55
+ 'バブルソート start
56
+ For i = UBound(ranking) To LBound(ranking) Step -1
57
+ For j = LBound(ranking) To i - 1
58
+ If ranking(j).kon_salesamount > ranking(j + 1).kon_salesamount Then
59
+ vSwap = ranking(j)
60
+ ranking(j) = ranking(j + 1)
61
+ ranking(j + 1) = vSwap
62
+ End If
63
+ Next j
64
+ Next i
65
+ 'バブルソート end
66
+
67
+ 'ここは関係ない
68
+ zyun_csvimport_Sort = True '正常終了の場合は Trueを返す
69
+ Exit Function
70
+ Sort_ERROR:
71
+ zyun_csvimport_Sort = False
72
+ MsgBox "zyun_csvimport_Sort(ソート部分)でエラー"
73
+ End Function
74
+ ```

1

追記

2021/08/22 04:05

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -1,2 +1,18 @@
1
1
  ranking(j, k) と ranking(j + 1, k) を入れ替えるなら
2
- vSwap に退避するのは ranking(j, k) ではないのでしょうか。
2
+ vSwap に退避するのは ranking(j, k) ではないのでしょうか。
3
+
4
+ ---
5
+ なお、二次元配列を並び替えるといっても、参考サイトとはやろうとしていることが若干異なる気がします。
6
+ |argAry|0|1|2|3|
7
+ |:--:|:--:|:--:|:--:|:--:|
8
+ |**0**|A事業所|xxx|200|aa|
9
+ |**1**|B事業所|xxx|100|bb|
10
+ |**2**|C事業所|xxx|300|cc|
11
+
12
+
13
+
14
+ |ranking|0|1|2|3|
15
+ |:--:|:--:|:--:|:--:|:--:|
16
+ |**0**|A事業所,,,100|D事業所,,,1003|G事業所,,,2100|J事業所,,,1010|
17
+ |**1**|B事業所,,,500|E事業所,,,1005|H事業所,,,1300|K事業所,,,1020|
18
+ |**2**|C事業所,,,400|F事業所,,,1020|I事業所,,,1030|L事業所,,,1200|