質問編集履歴
11
変更
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
変更
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
|
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 =
|
115
|
+
For a = 1 To 12
|
117
116
|
'a = 2のとき、合算しないが重複データは削除
|
118
|
-
If a =
|
117
|
+
If a = 1 Then
|
119
|
-
feeValue(
|
118
|
+
feeValue(areaName.Count, a) = extractedData(k, a + 1)
|
120
119
|
Else
|
121
120
|
'元の位置にあるデータ+重複している行の列の値。
|
122
|
-
feeValue(
|
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(
|
136
|
+
For j = 1 To UBound(areaName.keys)
|
142
137
|
For i = 1 To 14
|
143
|
-
NewWorkSheet.Cells(j +
|
138
|
+
NewWorkSheet.Cells(j + 4, i).Value = areaName.Item(i)
|
144
|
-
NewWorkSheet.Cells(j +
|
139
|
+
NewWorkSheet.Cells(j + 4, i + 1).Value = feeValue(j, i)
|
145
140
|
Next
|
146
141
|
Next
|
147
142
|
|
9
文章間違い
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 =
|
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
かみ砕いた説明を記載
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
|
-
|
31
|
+
If Not areaName.Exists(extractedData(k, 1)) Then
|
32
|
+
の直下にある処理内容を通りません。
|
33
|
+
であれば、当然、
|
27
|
-
areaNameに
|
34
|
+
areaNameの連想配列にはk=3の時の値が入らない事になります。
|
28
|
-
|
35
|
+
そうなると、Else以下の文に通る事になります。
|
29
|
-
ただし、重複しなかった場合でもFor文は抜けてしまうので、
|
30
|
-
更に抜けた後にIf文を追加し、
|
31
|
-
|
36
|
+
Else以下の文で重複している時の処理を終えると、
|
32
|
-
|
37
|
+
End Ifに辿り着き、kが加算されます。
|
33
|
-
|
38
|
+
この時のkの値はk=4です。
|
34
|
-
そもそもデータによっては
|
35
|
-
z = Ubound(areaName.keys)
|
36
|
-
|
39
|
+
そして、重複チェックに戻ります。
|
37
|
-
よって現実的ではないと判断し、やめました。
|
38
40
|
|
39
|
-
|
41
|
+
すると、k=3の時、
|
40
|
-
|
42
|
+
areaName.Add extractedData
|
41
|
-
|
43
|
+
が行われていない為、空白になります。
|
42
|
-
End If
|
43
|
-
Next
|
44
44
|
------ --------- ---------
|
45
45
|
|
46
46
|
|
7
文章間違い
title
CHANGED
File without changes
|
body
CHANGED
@@ -51,7 +51,7 @@
|
|
51
51
|
2つの配列を作っているので、
|
52
52
|
主キーと外部キーを作っています。
|
53
53
|
|
54
|
-
|
54
|
+
【extractedDataのサンプルデータ】
|
55
55
|

|
56
56
|
|
57
57
|
|
6
かみ砕いた説明を記載
title
CHANGED
File without changes
|
body
CHANGED
@@ -51,6 +51,10 @@
|
|
51
51
|
2つの配列を作っているので、
|
52
52
|
主キーと外部キーを作っています。
|
53
53
|
|
54
|
+
|
55
|
+

|
56
|
+
|
57
|
+
|
54
58
|
【以下コード】
|
55
59
|
|
56
60
|
|
5
文章間違い
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
文章間違い
title
CHANGED
File without changes
|
body
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
------------------------
|
18
18
|
|
19
19
|
エラー内容 :このキーは既にこのコレクションの要素に割り当てられています
|
20
|
-
エラー対象行 :
|
20
|
+
エラー対象行 :areaName.Add extractedData(k - d, 1), k - d
|
21
21
|
エラー時の変数値:k=4,d=1,j=4
|
22
22
|
|
23
23
|
|
3
文章間違い
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
文章間違い
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
文章間違い
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
|
重複していたキーに値を入れないと空白のデータになる。
|