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

回答編集履歴

1

追記

2015/09/12 00:46

投稿

pi-chan
pi-chan

スコア5936

answer CHANGED
@@ -6,4 +6,85 @@
6
6
  Active~
7
7
 
8
8
  Selectは止めて
9
- 対象のオブジェクトを明示的に指定
9
+ 対象のオブジェクトを明示的に指定
10
+
11
+ ---
12
+ <2015/09/12 09:45 追記>
13
+
14
+ すみません、遅くなりました。そして、ポイントがズレていましたね…
15
+
16
+ ###エラーの直接原因
17
+ 確認した環境は違いますが(Excel2013)、エラーの直接の原因は多分この部分だと思います。
18
+
19
+ ```
20
+ 誤)ActiveChart.SeriesCollection(6).DataLabels.Select
21
+ 正)ActiveChart.Chart.SeriesCollection(6).DataLabels.Select
22
+ ```
23
+ Excelの**オブジェクトモデル**はとても複雑で、私もいつも混乱してしまう(**マクロの記録**の結果を利用する場合は特に)のですけれども、Excelのオブジェクトモデルに立ち返って考えてみるのが近道だと思います。
24
+
25
+ ###理解のカギ
26
+ まず、スタートとなる知識は『ブック内のグラフは **Chart**メンバー によって表される』ということです。
27
+ (**Chart**メンバーの詳細については[こちら](https://msdn.microsoft.com/JA-JP/library/office/ff837379.aspx)を参照。**SeriesCollection**オブジェクトについては[こちら](https://msdn.microsoft.com/ja-jp/library/office/Ff836171.aspx)をどうぞ)
28
+
29
+
30
+ そして、__SeriesCollection__**オブジェクト**を利用するためには、ますオブジェクトを**取得**する必要がある訳ですが、そのためには `ActiveChart.Chart.SeriesCollection` と書きます。
31
+
32
+ その意味を自分なりの言葉で __意訳__ してみると
33
+
34
+ `ActiveChart.Chart.SeriesCollection` の意味
35
+   現在アクティブになっているグラフ `ActiveChart` の
36
+   `Chart` メンバー(**グラフ**そのものを表す)の `SeriesCollection` **プロパティ**を指定して
37
+   `SeriesCollections` **コレクション**(SeriesCollection**オブジェクトの集合**)を取得する
38
+
39
+ 今の場合は `ActiveChart.Chart.SeriesCollection(6)` となっているので、実際には `SeriesCollections` **コレクション** のうちの6番目のメンバーである `SeriesCollection` **オブジェクト** が1つ取得されることになります。
40
+
41
+ # 多分、一番の混乱の元になっているのは、**同じ綴り**の単語でも使用される文脈によって、`メンバー`、`プロパティ`、`メソッド`、`オブジェクト` など、異なるものを指している場合があるからだと思います。
42
+ # ちなみに、**オブジェクトの集合**である**コレクション**は、オブジェクトの**複数形**になっているので、まだ比較的分かりやすいですけれども…
43
+
44
+ ###マクロの記録を利用するコツ
45
+ 次に、**マクロの記録**の結果を利用する際のコツについてですが、まずはご本家(Microsoft)の説明に一度目を通してみられると良いと思います。([こちら](https://msdn.microsoft.com/ja-jp/library/office/ee814737(v=office.14).aspx#odc_Office14_ta_GettingStartedWithVBAInExcel2010_ModifyingTheRecordedCode))
46
+
47
+ **マクロの記録**の場合、ユーザーの操作内容を __馬鹿正直に__ 記録して行きますので、何かをマウス操作で選択すると漏れなく `〜.Select` と記録されます。
48
+ しかし、VBAでコードを記載する場合の基本は
49
+   `{対象のオブジェクト}.プロパティ`
50
+   `{対象のオブジェクト}.メソッド`
51
+ のように**対象となるオブジェクト**を明示するので、それをあらかじめ選択(Select)しておく必要性はありません。
52
+
53
+ それと、**マウス操作**でラベルの表示内容を変更する場合には、一旦削除してから作成し直した方が早いですが、**VBA**で操作する場合には表示済みのラベルの**値を修正**する方が効率が良いです。
54
+
55
+ さらに、実際にコードを書く際には、同じオブジェクトに対する参照を何度も書くと読みにくいので、適宜
56
+ ```
57
+ With
58
+ (一連の処理)
59
+ End With
60
+ ```
61
+ という書き方で同じオブジェクトに対する処理をまとめて書くと便利です。
62
+
63
+ ###サンプルコード
64
+ 以上を踏まえ [こちら](https://support.microsoft.com/ja-jp/kb/401687) などを参考にサンプルコードを書いてみました。自分に環境では一応動きましたが、**ゲストユーザー**さんの環境ではどうか試してみてください。
65
+
66
+ ```
67
+ Sub テスト用()
68
+
69
+ Dim vntLabels As Variant
70
+
71
+ Dim vntLabels As Variant
72
+
73
+ With ActiveSheet
74
+
75
+ ' ラベルに設定したい文字列の記載されているセル範囲をバリアント型変数へ読み込む
76
+ vntLabels = .Range( {セル範囲} )
77
+
78
+ With .ChartObjects("グラフ 13").Chart.SeriesCollection(6)
79
+
80
+ For i = 1 To .Points.Count
81
+ .Points(i).DataLabel.Text = vntLabels(i, 1)
82
+ Next i
83
+
84
+ End With
85
+ End With
86
+
87
+ End Sub
88
+ ```
89
+
90
+ 以上、ご参考になれば幸いです。