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

質問編集履歴

3

コードを現状のものに変更いたしました。

2021/01/01 10:59

投稿

20200713
20200713

スコア16

title CHANGED
File without changes
body CHANGED
@@ -17,49 +17,71 @@
17
17
 
18
18
  ### 試したこと・発生している問題・エラーメッセージ
19
19
 
20
- 2次元配列の各行の各部署のメンバー名を格納していきたいため
20
+ 2次元配列の各行の各部署のメンバー名を格納きたのですが、
21
- 任意の営業部のメンバーが増えるびに配列のサイズ大きくしていきたいです
21
+ な人員を追加する際いれる配列の場所決める作業
22
- 各行それぞれ別に列の数を決めることできずまくかない状況です。
22
+ 無駄多いよに感じてす。
23
23
 
24
- 理想は部署について長さ異なる配列を保持するよにしたいのすが
24
+ 行それぞれ別で列数を決めようなジャグ配列など使ことで、
25
+ 無駄を省くことができれば嬉しく思っております。
26
+ 方法にこだわりはございませんので、効率の良い方法について
25
- アドバイスいただけませんでょうか
27
+ なにかアドバイスいただけましたら幸いです
26
28
 
27
29
  ```vba
28
30
  Sub click()
29
31
 
30
- '部のリスト
32
+ '部のリスト
31
33
  Dim n_category As Integer
32
34
  n_category = 3
33
- Dim list_category() As String
35
+ Dim list_category()
34
- ReDim list_category(n_category)
36
+ ReDim list_category(n_category, 2)
35
- list_category(0) = "営業部"
37
+ list_category(0, 0) = "営業部"
36
- list_category(1) = "経理部"
38
+ list_category(1, 0) = "経理部"
37
- list_category(2) = "財務部"
39
+ list_category(2, 0) = "財務部"
40
+ Dim i
41
+ For i = 0 To n_category
42
+ list_category(i, 1) = 0
43
+ Next
38
44
 
39
45
  '名前分類の配列(list_category(0)営業部の人を0行に格納)
40
- Dim strArray() As String
46
+ Dim strArray()
41
47
  '3行1列の配列を用意
42
48
  ReDim Preserve strArray(n_category, 0)
43
-
49
+ For i = 0 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 'sheet1 rows
44
- For i = 0 To 2
50
+ Dim j 'type of category
45
- Dim j
46
- For j = 0 To n_category
51
+ For j = 0 To n_category - 1
47
- If (Cells(i + 1, 1) = list_category(j)) Then
52
+ If (Cells(i + 1, 1) = list_category(j, 0)) Then
53
+ list_category(j, 1) = list_category(j, 1) + 1
54
+ Dim size, k
55
+ size = 0
48
- size = UBound(strArray, 2)
56
+ For k = 0 To n_category - 1
57
+ If (list_category(k, 1) > size) Then
58
+ size = list_category(k, 1) 'decide Column size
59
+ Cells(i + 1, 3) = size
60
+ End If
61
+ Next
49
- ReDim Preserve strArray(n_category, size + 1)
62
+ ReDim Preserve strArray(n_category, size)
63
+ strArray(j, list_category(j, 1) - 1) = Cells(i + 1, 2)
64
+
50
- Exit For
65
+ Exit For
51
66
  End If
67
+ Next
52
68
  Next
69
+
70
+ For i = 0 To n_category - 1
71
+ Worksheets("Sheet2").Cells(1, i + 1) = list_category(i, 0)
53
- Next
72
+ Next
73
+
74
+ For i = 0 To n_category - 1
75
+ For j = 0 To size - 1
76
+ Worksheets("Sheet2").Cells(j + 2, i + 1) = strArray(i, j)
77
+ Next
78
+ Next
54
79
  End Sub
55
80
  ```
56
81
 
57
-
58
82
  名簿の部署名によって分類していく際に、
59
83
  入れるべき配列の場所(任意の部署行の最終列の次)を特定するのが楽なのかと思い
60
- コメントにてお教えいただいたジャグ配列が適当なのかと考えておりました…!
84
+ コメントにてお教えいただいたジャグ配列が適当なのかと考えておりました
61
- 任意行の最終列を指定する際にsize = UBound(strArray, 2)を用いる方法を考えましたが
62
- 行によってデータ数が異なる場合はfor文でデータが入っているか判定していくのが望ましいでしょうか。
63
85
 
64
86
  具体的には既に配列が以下のような時、
65
87
  営業部(0行目) 山田,鈴木

2

2次元配列とジャグ配列、現状について追記いたしました。

2021/01/01 10:58

投稿

20200713
20200713

スコア16

title CHANGED
File without changes
body CHANGED
@@ -52,4 +52,20 @@
52
52
  Next
53
53
  Next
54
54
  End Sub
55
- ```
55
+ ```
56
+
57
+
58
+ 名簿の部署名によって分類していく際に、
59
+ 入れるべき配列の場所(任意の部署行の最終列の次)を特定するのが楽なのかと思い
60
+ コメントにてお教えいただいたジャグ配列が適当なのかと考えておりました…!
61
+ 任意行の最終列を指定する際にsize = UBound(strArray, 2)を用いる方法を考えましたが
62
+ 行によってデータ数が異なる場合はfor文でデータが入っているか判定していくのが望ましいでしょうか。
63
+
64
+ 具体的には既に配列が以下のような時、
65
+ 営業部(0行目) 山田,鈴木
66
+ 経理部(1行目) 田中
67
+ 財務部(2行目)
68
+ 「経理部 佐藤」を追加する際、配列の箇所指定はどのようにするのが好ましいでしょうか。
69
+
70
+ ちなみにこの度はsheet2に部署ごとの並びとして貼り付け、
71
+ 事前にその範囲を名前の定義しておいたリストを別の場所でドロップダウンリストとして用いる予定です。

1

コードを掲載いたしました。

2021/01/01 08:42

投稿

20200713
20200713

スコア16

title CHANGED
File without changes
body CHANGED
@@ -17,6 +17,39 @@
17
17
 
18
18
  ### 試したこと・発生している問題・エラーメッセージ
19
19
 
20
- 2次元配列をましたが、人の追加によっ配列の数が自由に変わるとう部分
20
+ 2次元配列の各行の各部署のメンバー名格納していきたいため
21
+ 任意の営業部のメンバーが増えるたびに配列のサイズを大きくしていきたいですが、
22
+ 各行それぞれ別に列の数を決めることができずうまくいかない状況です。
23
+
24
+ 理想は各部署について長さの異なる配列を保持するようにしたいのですが、
21
- く実装することできませんでし
25
+ アドバイスいただけませんでしょうか
26
+
27
+ ```vba
28
+ Sub click()
29
+
30
+ '部のリスト
31
+ Dim n_category As Integer
32
+ n_category = 3
33
+ Dim list_category() As String
34
+ ReDim list_category(n_category)
35
+ list_category(0) = "営業部"
36
+ list_category(1) = "経理部"
37
+ list_category(2) = "財務部"
38
+
39
+ '名前分類の配列(list_category(0)営業部の人を0行に格納)
40
+ Dim strArray() As String
41
+ '3行1列の配列を用意
42
+ ReDim Preserve strArray(n_category, 0)
43
+
44
+ For i = 0 To 2
45
+ Dim j
46
+ For j = 0 To n_category
47
+ If (Cells(i + 1, 1) = list_category(j)) Then
48
+ size = UBound(strArray, 2)
22
- 2次元配列以外でも効率の良い方法ご存知の方いらっしゃいましたらアドバイスいただきたいです。
49
+ ReDim Preserve strArray(n_category, size + 1)
50
+ Exit For
51
+ End If
52
+ Next
53
+ Next
54
+ End Sub
55
+ ```