回答編集履歴

1

追記

2015/09/12 00:46

投稿

pi-chan
pi-chan

スコア5936

test CHANGED
@@ -15,3 +15,165 @@
15
15
  Selectは止めて
16
16
 
17
17
  対象のオブジェクトを明示的に指定
18
+
19
+
20
+
21
+ ---
22
+
23
+ <2015/09/12 09:45 追記>
24
+
25
+
26
+
27
+ すみません、遅くなりました。そして、ポイントがズレていましたね…
28
+
29
+
30
+
31
+ ###エラーの直接原因
32
+
33
+ 確認した環境は違いますが(Excel2013)、エラーの直接の原因は多分この部分だと思います。
34
+
35
+
36
+
37
+ ```
38
+
39
+ 誤)ActiveChart.SeriesCollection(6).DataLabels.Select
40
+
41
+ 正)ActiveChart.Chart.SeriesCollection(6).DataLabels.Select
42
+
43
+ ```
44
+
45
+ Excelの**オブジェクトモデル**はとても複雑で、私もいつも混乱してしまう(**マクロの記録**の結果を利用する場合は特に)のですけれども、Excelのオブジェクトモデルに立ち返って考えてみるのが近道だと思います。
46
+
47
+
48
+
49
+ ###理解のカギ
50
+
51
+ まず、スタートとなる知識は『ブック内のグラフは **Chart**メンバー によって表される』ということです。
52
+
53
+ (**Chart**メンバーの詳細については[こちら](https://msdn.microsoft.com/JA-JP/library/office/ff837379.aspx)を参照。**SeriesCollection**オブジェクトについては[こちら](https://msdn.microsoft.com/ja-jp/library/office/Ff836171.aspx)をどうぞ)
54
+
55
+
56
+
57
+
58
+
59
+ そして、__SeriesCollection__**オブジェクト**を利用するためには、ますオブジェクトを**取得**する必要がある訳ですが、そのためには `ActiveChart.Chart.SeriesCollection` と書きます。
60
+
61
+
62
+
63
+ その意味を自分なりの言葉で __意訳__ してみると
64
+
65
+
66
+
67
+ `ActiveChart.Chart.SeriesCollection` の意味
68
+
69
+   現在アクティブになっているグラフ `ActiveChart` の
70
+
71
+   `Chart` メンバー(**グラフ**そのものを表す)の `SeriesCollection` **プロパティ**を指定して
72
+
73
+   `SeriesCollections` **コレクション**(SeriesCollection**オブジェクトの集合**)を取得する
74
+
75
+
76
+
77
+ 今の場合は `ActiveChart.Chart.SeriesCollection(6)` となっているので、実際には `SeriesCollections` **コレクション** のうちの6番目のメンバーである `SeriesCollection` **オブジェクト** が1つ取得されることになります。
78
+
79
+
80
+
81
+ # 多分、一番の混乱の元になっているのは、**同じ綴り**の単語でも使用される文脈によって、`メンバー`、`プロパティ`、`メソッド`、`オブジェクト` など、異なるものを指している場合があるからだと思います。
82
+
83
+ # ちなみに、**オブジェクトの集合**である**コレクション**は、オブジェクトの**複数形**になっているので、まだ比較的分かりやすいですけれども…
84
+
85
+
86
+
87
+ ###マクロの記録を利用するコツ
88
+
89
+ 次に、**マクロの記録**の結果を利用する際のコツについてですが、まずはご本家(Microsoft)の説明に一度目を通してみられると良いと思います。([こちら](https://msdn.microsoft.com/ja-jp/library/office/ee814737(v=office.14).aspx#odc_Office14_ta_GettingStartedWithVBAInExcel2010_ModifyingTheRecordedCode))
90
+
91
+
92
+
93
+ **マクロの記録**の場合、ユーザーの操作内容を __馬鹿正直に__ 記録して行きますので、何かをマウス操作で選択すると漏れなく `〜.Select` と記録されます。
94
+
95
+ しかし、VBAでコードを記載する場合の基本は
96
+
97
+   `{対象のオブジェクト}.プロパティ`
98
+
99
+   `{対象のオブジェクト}.メソッド`
100
+
101
+ のように**対象となるオブジェクト**を明示するので、それをあらかじめ選択(Select)しておく必要性はありません。
102
+
103
+
104
+
105
+ それと、**マウス操作**でラベルの表示内容を変更する場合には、一旦削除してから作成し直した方が早いですが、**VBA**で操作する場合には表示済みのラベルの**値を修正**する方が効率が良いです。
106
+
107
+
108
+
109
+ さらに、実際にコードを書く際には、同じオブジェクトに対する参照を何度も書くと読みにくいので、適宜
110
+
111
+ ```
112
+
113
+ With
114
+
115
+ (一連の処理)
116
+
117
+ End With
118
+
119
+ ```
120
+
121
+ という書き方で同じオブジェクトに対する処理をまとめて書くと便利です。
122
+
123
+
124
+
125
+ ###サンプルコード
126
+
127
+ 以上を踏まえ [こちら](https://support.microsoft.com/ja-jp/kb/401687) などを参考にサンプルコードを書いてみました。自分に環境では一応動きましたが、**ゲストユーザー**さんの環境ではどうか試してみてください。
128
+
129
+
130
+
131
+ ```
132
+
133
+ Sub テスト用()
134
+
135
+
136
+
137
+ Dim vntLabels As Variant
138
+
139
+
140
+
141
+ Dim vntLabels As Variant
142
+
143
+
144
+
145
+ With ActiveSheet
146
+
147
+
148
+
149
+ ' ラベルに設定したい文字列の記載されているセル範囲をバリアント型変数へ読み込む
150
+
151
+ vntLabels = .Range( {セル範囲} )
152
+
153
+
154
+
155
+ With .ChartObjects("グラフ 13").Chart.SeriesCollection(6)
156
+
157
+
158
+
159
+ For i = 1 To .Points.Count
160
+
161
+ .Points(i).DataLabel.Text = vntLabels(i, 1)
162
+
163
+ Next i
164
+
165
+
166
+
167
+ End With
168
+
169
+ End With
170
+
171
+
172
+
173
+ End Sub
174
+
175
+ ```
176
+
177
+
178
+
179
+ 以上、ご参考になれば幸いです。