質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

全シートに対して連続実行する方法について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,685

cat_junko

score 44

追加したいこと。 

1、グラフ選択機能(グラフの名前がそれぞれ違うのでそれ  をどう解決すれば良いのか…)
 2、次シートへの自動移動

これは、全11シートしかないのですがもう一つ「1ファイル8シート」が16ファイル
 あるので短時間で変更したいのです。
---------------------------------------------------------------
Sub WorksheetLoop()

         Dim WS_Count As Integer
         Dim I As Integer

         ' Set WS_Count equal to the number of worksheets in the active
         ' workbook.
         WS_Count = ActiveWorkbook.Worksheets.Count

         ' Begin the loop.
         For I = 1 To WS_Count

            ' Insert your code here.
            ' The following line shows how to reference a sheet within
            ' the loop by displaying the worksheet name in a dialog box.
            MsgBox ActiveWorkbook.Worksheets(I).Name
            ChartObjects_Select
            graph_change
            

         Next I

      End Sub
Sub ChartObjects_Select()

    ActiveSheet.ChartObjects("グラフ 60").Activate 'グラフの選択
    ↑ここのグラフ選択はマクロの記録でやってしまっているため”グラフ60”となっています。ここも、変更しないと他に対応が出来ません。
End Sub
Sub graph_change()
  Dim str1 As String, str2 As String, I As Integer
 
  str1 = InputBox("変更前の値を入力してください")
  If str1 = "" Then Exit Sub
  str2 = InputBox("変更後の値を入力してください")
  If str2 = "" Then Exit Sub
 
  With ActiveChart
     For i = 1 To .SeriesCollection.Count
      .SeriesCollection.Item(I).Formula = Replace(.SeriesCollection.Item(I).Formula, "$" & str1, "$" & str2)
    Next I
  End With
End Sub

---------------------------------------------------------------
追加情報
⚫1→「10月度計測」と言うファイルがあり全シート11枚(1ヶ月分1ファイル)(各シートグラフ1つ、11シート以外にデータシートが4シート)
⚫2→「10月度a地点計測」と言うファイルがありその中にシートが「1」~「8」まであります。そのファイルを1セットにして16ファイルあります。
(1ヶ月分16ファイル)(各シートグラフ2つ、8シート以外にデータシートが4シート)
◎3→1シートに、3つと2つの混合(「3,3、2」×8)

全ファイルを、一括と言うのは何かあってら大変なので1ファイルずつ全シート一括変更がせめて出来たらと思っています。

グラフの変更範囲は、1の全シートについて同じ。2の全ファイルの全シートについて同じ。
なので、1回指定したらシート毎に聞かれる事なく動いてくれるのが望ましいです。

グラフは、今書かれてる位置のままで状況によって3~4日増えるのでそれを、なんとか自動化できないものかと思ってます。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takito

    2015/10/27 17:18

    つまり、
    ・エクセルファイルが多数ある
    ・全てのファイルにはシートが多数ある
    ・全てのシートにはデータが入力されていてグラフ描画されている
    ・全ファイル、全シート、全グラフ、のデータ範囲を任意のセルに一括変更したい
    という理解でよいでしょうか?

    キャンセル

回答 2

checkベストアンサー

0

ワークシート、そこに埋め込まれているグラフ、グラフシートなどは、その「名前」を知らなくともインデックス番号によって指定することができます

例えばマクロの処理をこんなイメージで作ってはいかがでしょうか

以下の処理を行うための実行用ブックを作成
1.ブックを開く
2.グラフデータ範囲参照セルの変更前と変更後の入力を受け付ける
3.開いているブックの全シート、全グラフに対して3の内容を反映する
4.ブックを保存して閉じる
5.処理対象ブックに対して以上の1~4を繰りかえす

具体的な処理はこちらのサイトが参考になると思います
ブック内のすべてのワークシートをループするマクロ(これを応用すればグラフシートのループもできます)
グラフ操作の基礎知識
グラフの参照範囲を変更する


また、マクロを使わない方法でもグラフの参照式を動的変化に対応させることができます
グラフのデータ範囲を自動更新する方法
グラフの参照範囲を自動的に変更する
が、グラフが大量にあるようなのであくまでも参考にということで


ざっくりとした(でも一応動きます)サンプルコードを書いてみました
細かいエラー処理までは考えてません
「シートにグラフが埋め込まれてる」というイメージで作ってありますので、もしも「グラフシート」ならばシートのループを工夫する必要があります
よかったら参考にしてください

Sub sample()
    
    Dim strPath As String
    Dim strBookName As String
    Dim strBefore As String
    Dim strAfter As String
    Dim myWS As Worksheet
    Dim WB As Workbook
    Dim nRow As Integer
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer

    'このマクロを動かすブックの先頭シートに処理対象のファイル名リストを作成
    'ファイル名はA列先頭行から行方向に記述
    'ファイル名が空欄になったら処理を終了
    
    'このマクロを動かすブックの先頭シート
    Set myWS = ThisWorkbook.Worksheets(1)
    
    '計測データファイルの保存されている場所
    strPath = "c:\計測データ"
    
    nRow = 1
    'ファイル名のループ
    Do While Len(myWS.Cells(nRow, 1).Value) > 0

        'ファイルを開く
        strBookName = myWS.Cells(nRow, 1).Value
        Set WB = Workbooks.Open(strPath & "\" & strBookName)
        
        '置換情報の入力
        strBefore = UCase(InputBox("変更前の値を入力してください", strBookName))
        strAfter = UCase(InputBox("変更後の値を入力してください", strBookName))
        
        '入力が無かったら次へ
        If strBefore = "" Or strAfter = "" Then GoTo NEXT_FILE
        
        '処理の確認
        If MsgBox("[" & strBookName & "] 内の全グラフの参照先を" & vbCrLf _
                   & strBefore & " → " & strAfter & vbCrLf _
                   & "に変更してよろしいですか?", vbOKCancel) = vbCancel Then
                   GoTo NEXT_FILE
        End If
        
        '置換処理の実行
        'シートのループ
        For i = 1 To WB.Worksheets.Count
            'グラフのループ
            For j = 1 To WB.Worksheets(i).ChartObjects.Count
                With WB.Worksheets(i).ChartObjects(j).Chart
                'グラフの参照先情報のループ
                For k = 1 To .SeriesCollection.Count
                    .SeriesCollection.Item(k).Formula = Replace(.SeriesCollection.Item(k).Formula, "$" & strBefore, "$" & strAfter)
                Next k
                End With
            Next j
        Next i
        
NEXT_FILE:
        '閉じる(変更があれば聞かれる)
        WB.Close
        
        nRow = nRow + 1
        
    Loop
        
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/30 19:21

    サンプルコードを追記しました
    ヘタですが動くものにはなってると思います
    ご参考まで

    キャンセル

  • 2015/10/31 09:21

    返信遅くなり大変申し訳ありません。
    最終的に、下記のようになりました。
    「変更前、変更後」の入力を促すのに加えて「シート内のグラフ数」と「シート数」
    の入力を促すことによりどんなグラフ?にも対応出来るようにしました。

    Sub graph_change()
    Dim wb As Workbook, ws As Worksheet
    Dim str1 As String, str2 As String, i As Integer, j As Integer
    Dim str3 As String, str4 As String

    str1 = InputBox("変更前の値を入力してください")
    If str1 = "" Then Exit Sub
    str2 = InputBox("変更後の値を入力してください")
    If str2 = "" Then Exit Sub
    str3 = InputBox("グラフの数を入力してください")
    If str3 = "" Then Exit Sub
    str4 = InputBox("対象シート数を入力してください")
    If str4 = "" Then Exit Sub

    On Error Resume Next
    For Each wb In Workbooks
    For Each ws In wb.Worksheets
    For j = 1 To str3

    With ws.ChartObjects(j).Chart
    For i = 1 To str4

    .SeriesCollection.Item(i).Formula = _
    Replace(.SeriesCollection.Item(i).Formula, "$" & str1, "$" & str2)
    Next i
    End With
    Next j
    Next ws
    Next wb
    End Sub

    キャンセル

  • 2015/10/31 09:24

    また、回答いただいたサンプルでも試して色々勉強していきたいと思います。
    ありがとうございました!

    キャンセル

0

まず、Excelファイルの読み込みです。
Dim readBook As Workbook 
Set readBook = Workbooks.Open(「パス+ファイル名」) 

シートのループです。
for index = 1 to readBook.sheets.count
こんな形で全てのファイルに対して更新していけばよいのではないかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/29 12:49

    ありがとうございます。
    シートループまでは、解決することができました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る