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

回答編集履歴

1

(サンプルコード追加)

2015/10/30 10:10

投稿

takito
takito

スコア3116

answer CHANGED
@@ -18,4 +18,84 @@
18
18
  また、マクロを使わない方法でもグラフの参照式を動的変化に対応させることができます
19
19
  [グラフのデータ範囲を自動更新する方法](http://www.itsmemo.com/it/excel/000180.html)
20
20
  [グラフの参照範囲を自動的に変更する](http://officetanaka.net/excel/function/tips/tips71.htm)
21
- が、グラフが大量にあるようなのであくまでも参考にということで
21
+ が、グラフが大量にあるようなのであくまでも参考にということで
22
+
23
+ ---
24
+
25
+ ざっくりとした(でも一応動きます)サンプルコードを書いてみました
26
+ 細かいエラー処理までは考えてません
27
+ 「シートにグラフが埋め込まれてる」というイメージで作ってありますので、もしも「グラフシート」ならばシートのループを工夫する必要があります
28
+ よかったら参考にしてください
29
+
30
+ ```vbscript
31
+
32
+ Sub sample()
33
+
34
+ Dim strPath As String
35
+ Dim strBookName As String
36
+ Dim strBefore As String
37
+ Dim strAfter As String
38
+ Dim myWS As Worksheet
39
+ Dim WB As Workbook
40
+ Dim nRow As Integer
41
+ Dim i As Integer
42
+ Dim j As Integer
43
+ Dim k As Integer
44
+
45
+ 'このマクロを動かすブックの先頭シートに処理対象のファイル名リストを作成
46
+ 'ファイル名はA列先頭行から行方向に記述
47
+ 'ファイル名が空欄になったら処理を終了
48
+
49
+ 'このマクロを動かすブックの先頭シート
50
+ Set myWS = ThisWorkbook.Worksheets(1)
51
+
52
+ '計測データファイルの保存されている場所
53
+ strPath = "c:\計測データ"
54
+
55
+ nRow = 1
56
+ 'ファイル名のループ
57
+ Do While Len(myWS.Cells(nRow, 1).Value) > 0
58
+
59
+ 'ファイルを開く
60
+ strBookName = myWS.Cells(nRow, 1).Value
61
+ Set WB = Workbooks.Open(strPath & "\" & strBookName)
62
+
63
+ '置換情報の入力
64
+ strBefore = UCase(InputBox("変更前の値を入力してください", strBookName))
65
+ strAfter = UCase(InputBox("変更後の値を入力してください", strBookName))
66
+
67
+ '入力が無かったら次へ
68
+ If strBefore = "" Or strAfter = "" Then GoTo NEXT_FILE
69
+
70
+ '処理の確認
71
+ If MsgBox("[" & strBookName & "] 内の全グラフの参照先を" & vbCrLf _
72
+ & strBefore & " → " & strAfter & vbCrLf _
73
+ & "に変更してよろしいですか?", vbOKCancel) = vbCancel Then
74
+ GoTo NEXT_FILE
75
+ End If
76
+
77
+ '置換処理の実行
78
+ 'シートのループ
79
+ For i = 1 To WB.Worksheets.Count
80
+ 'グラフのループ
81
+ For j = 1 To WB.Worksheets(i).ChartObjects.Count
82
+ With WB.Worksheets(i).ChartObjects(j).Chart
83
+ 'グラフの参照先情報のループ
84
+ For k = 1 To .SeriesCollection.Count
85
+ .SeriesCollection.Item(k).Formula = Replace(.SeriesCollection.Item(k).Formula, "$" & strBefore, "$" & strAfter)
86
+ Next k
87
+ End With
88
+ Next j
89
+ Next i
90
+
91
+ NEXT_FILE:
92
+ '閉じる(変更があれば聞かれる)
93
+ WB.Close
94
+
95
+ nRow = nRow + 1
96
+
97
+ Loop
98
+
99
+ End Sub
100
+
101
+ ```