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

質問編集履歴

11

変更

2021/06/09 08:12

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- このキーは既にこのコレクョンの要素に割り当てらます
1
+ 出力時、新しいートが追加さるがデータが出力されな
body CHANGED
@@ -1,49 +1,9 @@
1
1
  ※サンプルデータとして画像を追加しました。
2
2
 
3
3
  以下を実現するプログラムを作りたいと考えております。
4
- しかし、表題のエラーが原因で実現できずにいます。
4
+ しかし、表題が原因で実現できずにいます。
5
- また、
6
- それとは別に空白だった値にデータを入れたいので
7
- dという重複回数を示す変数を定義したものの、
8
- 2種類目の重複データに遭遇した時のdの値は2
9
- k-dを行うと2個戻ってしまい、
10
- 値が入っていないキーへ入れられず、
11
- 何の意味も持たない変数になってしまいます。
12
- どの様に実現すると良いでしょうか。
13
5
 
14
6
 
15
-
16
- ----【実現したい事】----
17
- 重複時に該当するキーには値を入れない
18
- しかし、重複しない時は、
19
- 重複していたキーに値を入れないと空白のデータになる。
20
- そこで、空白のキーに値を入れたい
21
- ------------------------
22
-
23
- エラー内容   :このキーは既にこのコレクションの要素に割り当てられています
24
- エラー対象行  :areaName.Add extractedData(k - d, 1), k - d
25
- エラー時の変数値:k=4,d=1,j=4
26
-
27
-
28
- ----【具体例】----
29
- 例えば、k=3の時、
30
- データが重複しており、
31
- If Not areaName.Exists(extractedData(k, 1)) Then
32
- の直下にある処理内容を通りません。
33
- であれば、当然、
34
- areaNameの連想配列にはk=3の時の値が入らない事になります。
35
- そうなると、Else以下の文に通る事になります。
36
- Else以下の文で重複している時の処理を終えると、
37
- End Ifに辿り着き、kが加算されます。
38
- この時のkの値はk=4です。
39
- そして、重複チェックに戻ります。
40
-
41
- すると、k=3の時、
42
- areaName.Add extractedData
43
- が行われていない為、空白になります。
44
- ------ --------- ---------
45
-
46
-
47
7
  【プログラムコードについての説明】
48
8
  Excelから取得してきたデータを一旦、extractedDataにぶち込み、
49
9
  extractedDataから条件処理をしたデータを、

10

変更

2021/06/09 08:12

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -89,21 +89,20 @@
89
89
  Dim areaName As Object
90
90
  Set areaName = CreateObject("Scripting.Dictionary")
91
91
  Dim feeValue() As Variant
92
-
92
+
93
93
  'B列とD列~O列の動的配列の入れ物作成
94
94
  ReDim Preserve feeValue(1 To j, 1 To i)
95
95
 
96
-
96
+
97
97
  k = 1 'kはキー変数
98
- d = 0 'dは重複回数
99
98
  For j = 1 To lineNum
100
-
99
+
101
100
  'キーがまだ存在してないのなら値を配列に追加/常にキー列(A列)を取得するので列固定
102
101
  If Not areaName.Exists(extractedData(k, 1)) Then
103
102
  'A列を配列に追加
104
103
  '値が重複→その時のindexNumberのitemは空のままだから重複回数分をマイナス
105
- areaName.Add extractedData(k - d, 1), k - d
104
+ areaName.Add extractedData(k, 1), k
106
-
105
+
107
106
  'B列追加、D列~O列追加
108
107
  r = 1
109
108
  For m = 2 To 13
@@ -113,24 +112,20 @@
113
112
  Else
114
113
  'キーが既に存在しているならここのルートを通る
115
114
  '売上を合算
116
- For a = 2 To 12
115
+ For a = 1 To 12
117
116
  'a = 2のとき、合算しないが重複データは削除
118
- If a = 2 Then
117
+ If a = 1 Then
119
- feeValue(k, a) = extractedData(k, a)
118
+ feeValue(areaName.Count, a) = extractedData(k, a + 1)
120
119
  Else
121
120
  '元の位置にあるデータ+重複している行の列の値。
122
- feeValue(k - 1, a) = extractedData(k - 1, a) + extractedData(k, a)
121
+ feeValue(areaName.Count, a + 1) = extractedData(areaName.Count, a + 1) + extractedData(k, a + 1)
123
122
  End If
124
123
  Next
125
- d = d + 1 '重複カウント
126
124
  End If
127
125
  k = k + 1
128
126
  Next
129
127
 
130
- areaNameKey = areaName.keys
131
- areaNameItem = areaName.items
132
128
 
133
-
134
129
  '新規シートを名前を変更してシートの最後尾に挿入
135
130
  Dim NewWorkSheet As Worksheet
136
131
  Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
@@ -138,10 +133,10 @@
138
133
 
139
134
 
140
135
  'リストを出力 areaNameの値とfeeValueの値をキーで対応させて出力する
141
- For j = 1 To UBound(areaNameKey)
136
+ For j = 1 To UBound(areaName.keys)
142
137
  For i = 1 To 14
143
- NewWorkSheet.Cells(j + 3, i).Value = areaNameKey(i)
138
+ NewWorkSheet.Cells(j + 4, i).Value = areaName.Item(i)
144
- NewWorkSheet.Cells(j + 3, i + 1).Value = feeValue(j, i)
139
+ NewWorkSheet.Cells(j + 4, i + 1).Value = feeValue(j, i)
145
140
  Next
146
141
  Next
147
142
 

9

文章間違い

2021/06/09 08:00

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -140,7 +140,7 @@
140
140
  'リストを出力 areaNameの値とfeeValueの値をキーで対応させて出力する
141
141
  For j = 1 To UBound(areaNameKey)
142
142
  For i = 1 To 14
143
- NewWorkSheet.Cells(j + 3, i).Value = areaNameItem(i)
143
+ NewWorkSheet.Cells(j + 3, i).Value = areaNameKey(i)
144
144
  NewWorkSheet.Cells(j + 3, i + 1).Value = feeValue(j, i)
145
145
  Next
146
146
  Next

8

かみ砕いた説明を記載

2021/06/09 06:14

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,5 @@
1
+ ※サンプルデータとして画像を追加しました。
2
+
1
3
  以下を実現するプログラムを作りたいと考えております。
2
4
  しかし、表題のエラーが原因で実現できずにいます。
3
5
  また、
@@ -10,6 +12,7 @@
10
12
  どの様に実現すると良いでしょうか。
11
13
 
12
14
 
15
+
13
16
  ----【実現したい事】----
14
17
  重複時に該当するキーには値を入れない
15
18
  しかし、重複しない時は、
@@ -22,25 +25,22 @@
22
25
  エラー時の変数値:k=4,d=1,j=4
23
26
 
24
27
 
25
- ----【試そうとした事】----
28
+ ----【具体例】----
29
+ 例えば、k=3の時、
30
+ データが重複しており、
26
- For文で事前にextractedDataの値が、
31
+ If Not areaName.Exists(extractedData(k, 1)) Then
32
+ の直下にある処理内容を通りません。
33
+ であれば、当然、
27
- areaNameに存在するかどうか重複チェックを行
34
+ areaNameの連想配列はk=3の時の値が入らな事になります。
28
- 該当したらExitForで強制的抜ける。
35
+ そうなると、Else以下の文事になります
29
- ただし、重複しなかった場合でもFor文は抜けてしまうので、
30
- 更に抜けた後にIf文を追加し、
31
- z = Ubound(areaName.keys)
36
+ Else以下の文で重複している時の処理を終えると、
32
- とすればいいのではと思いました
37
+ End Ifに辿り着きk加算されます。
33
- コードが増えぎていきますし、
38
+ この時のkの値はk=4で
34
- そもそもデータによっては
35
- z = Ubound(areaName.keys)
36
- の時に重複する可能性もあります。
39
+ そして、重複チェックに戻ります。
37
- よって現実的ではないと判断し、やめました。
38
40
 
39
- For z=1 To Ubound(areaName.keys)
41
+ すると、k=3の時、
40
- If extractedData(k, 1) = areaName(a)
42
+ areaName.Add extractedData
41
- Exit For
43
+ が行われていない為、空白になります。
42
- End If
43
- Next
44
44
  ------ --------- ---------
45
45
 
46
46
 

7

文章間違い

2021/06/09 06:08

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -51,7 +51,7 @@
51
51
  2つの配列を作っているので、
52
52
  主キーと外部キーを作っています。
53
53
 
54
-
54
+ 【extractedDataのサンプルデータ】
55
55
  ![extractedDataのサンプルデータ](96854bf0017dbac649d5677ee5178776.png)
56
56
 
57
57
 

6

かみ砕いた説明を記載

2021/06/09 05:57

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -51,6 +51,10 @@
51
51
  2つの配列を作っているので、
52
52
  主キーと外部キーを作っています。
53
53
 
54
+
55
+ ![extractedDataのサンプルデータ](96854bf0017dbac649d5677ee5178776.png)
56
+
57
+
54
58
  【以下コード】
55
59
 
56
60
 

5

文章間違い

2021/06/09 05:56

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -3,8 +3,9 @@
3
3
  また、
4
4
  それとは別に空白だった値にデータを入れたいので
5
5
  dという重複回数を示す変数を定義したものの、
6
- 初期値は0なので、
7
- 初めて重複したデータに出会った時は
6
+ 2種類目の重複データに遭遇した時のdの値2
7
+ k-dを行うと2個戻ってしまい、
8
+ 値が入っていないキーへ入れられず、
8
9
  何の意味も持たない変数になってしまいます。
9
10
  どの様に実現すると良いでしょうか。
10
11
 

4

文章間違い

2021/06/09 05:47

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -17,7 +17,7 @@
17
17
  ------------------------
18
18
 
19
19
  エラー内容   :このキーは既にこのコレクションの要素に割り当てられています
20
- エラー対象行  :If Not areaName.Exists(extractedData(k, 1)) Then
20
+ エラー対象行  :areaName.Add extractedData(k - d, 1), k - d
21
21
  エラー時の変数値:k=4,d=1,j=4
22
22
 
23
23
 

3

文章間違い

2021/06/09 05:11

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,11 @@
1
1
  以下を実現するプログラムを作りたいと考えております。
2
2
  しかし、表題のエラーが原因で実現できずにいます。
3
+ また、
4
+ それとは別に空白だった値にデータを入れたいので
5
+ dという重複回数を示す変数を定義したものの、
6
+ 初期値は0なので、
7
+ 初めて重複したデータに出会った時は、
8
+ 何の意味も持たない変数になってしまいます。
3
9
  どの様に実現すると良いでしょうか。
4
10
 
5
11
 

2

文章間違い

2021/06/09 05:05

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -34,7 +34,7 @@
34
34
  Exit For
35
35
  End If
36
36
  Next
37
- ------------------------
37
+ ------ --------- ---------
38
38
 
39
39
 
40
40
  【プログラムコードについての説明】

1

文章間違い

2021/06/09 04:20

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -4,8 +4,6 @@
4
4
 
5
5
 
6
6
  ----【実現したい事】----
7
- If Not 取得してきたデータつまりextractedDataの値 = areaNameに存在する値
8
-
9
7
  重複時に該当するキーには値を入れない
10
8
  しかし、重複しない時は、
11
9
  重複していたキーに値を入れないと空白のデータになる。