🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

1189閲覧

複数のエクセルファイルのシートの結合とシート毎のデータからのグラフの作成

ikene

総合スコア2

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/03/01 10:20

前提・実現したいこと

VBAでディレクトリ内のエクセルファイルを結合して複数のシートを含んだ新規のブックを作成するコードとそのシート一枚一枚でシートのデータを元にグラフを作成するコードの統合を目指しています。後者のコードは以前ご回答いただいたものを改良したものです。
それぞれのコードは別々なら作用するのですが、合わせるとうまくいきません。

発生している問題

エクセルの統合を目指しているコードは新規のブックを作成し、そのブックに他のエクセルのシートをコピーして結合するものなのですが、その後のグラフを作成がマクロを実行したエクセル上で行われてしまっています。

これが変数の定義ミスが原因であることはわかるのですが、どこが間違っているのかがわかりません。

また統合に伴い、グラフの作成にも問題が起こっています。これも単体なら動くので、変数の定義ミスが原因であるとは思うのですがどこが間違っているのかわかりません。
イメージ説明
うまくってるグラフの作成図(上)
イメージ説明
うまく行ってないグラフの作成図(上)

該当のソースコード

VBA

1Sub データまとめ1() 2 3 MsgBox "まとめたいエクセルブックのフォルダを選択して、" & vbCrLf & _ 4 "「OK」をクリックして下さい。" 5 6 '画面表示OFF 7 Application.ScreenUpdating = False 8 9 '------------------------------------------- 10 ' 変数定義 11 '------------------------------------------- 12 Const cnsDIR = "*.xls*" '対象フォルダ内エクセルファイル検索用 13 Dim FilePath As String 'ファイルパス 14 Dim strFileName As String '結合元ファイル名 15 16 Dim i As Integer 'ループ用 17 18 'シート結合エクセル用オブジェクト 19 Dim App As Excel.Application 20 Dim Book As Workbook 21 Dim Sheet As Worksheet 22 'シート結合エクセル保存名 23 Dim BookName As String 24 25 '結合元エクセル用 26 Dim Book2 As Workbook 27 Dim Sheet2 As Worksheet 28 29 30 '------------------------------------------- 31 ' シート結合後のファイル名の指定 32 '------------------------------------------- 33 BookName = Format(Now(), "yyyymmdd") & "データまとめファイル.xlsx" 34 35 '------------------------------------------- 36 ' 結合元のフォルダ選択 37 '------------------------------------------- 38 FilePath = FolderSelect() 39 40 'キャンセル時 41 If FilePath = "" Then 42 MsgBox "キャンセルされました。処理を終了します。" 43 End 44 End If 45 46 '------------------------------------------- 47 ' 結合先ワークブック作成 48 '------------------------------------------- 49 'オブジェクトセット 50 Set App = CreateObject("Excel.Application") 51 '非表示 52 App.Visible = False 53 'エクセル新規オープン 54 Set Book = App.Workbooks.Add 55 56 '------------------------------------------- 57 ' 結合先ワークブックにコピー 58 '------------------------------------------- 59 ' 先頭のファイル名の取得 60 strFileName = Dir(FilePath & cnsDIR, vbNormal) 61 62 ' ファイルが見つからなくなるまで繰り返す 63 Do While strFileName <> "" 64 65 '対象フォルダ配下のエクセルオープン 66 Set Book2 = App.Workbooks.Open(Filename:=FilePath & "\" & strFileName) 67 68 '開いたコピー元のエクセルのシート分繰り返す 69 For i = 1 To Book2.Worksheets.Count 70 71 Book2.Worksheets(i).Visible = True 72 73 '結合用のブックにシートコピー 74 Book2.Worksheets(i).Copy after:=Book.Worksheets(i) 75 'シート名を「元のシート名」に変更 76 Book.ActiveSheet.Name = Book2.Worksheets(i).Name 77 78 79 Next i 80 81 'コピー元のエクセルを保存せずに閉じる 82 Book2.Close (False) 83 ' 次のファイル名を取得 84 strFileName = Dir() 85 86 Loop 87 88 'シート「Sheet1」を削除 89 Book.Worksheets("Sheet1").Delete 90 '名前を付けて保存 91 Book.SaveAs Filename:=FilePath & "\" & BookName 92 93 '------------------------------------------- 94 ' 結合後のシートでのグラフ作成(ここから次まで統合したいコード) 95 '------------------------------------------- 96 97 98 '結合したエクセルのシート分繰り返す 99 For i = 1 To Book.Worksheets.Count 100 'rawデータの処理 101 Book.Worksheets(i).Activate 102 Range("A1025:B1025").Select 103 Range(Selection, Selection.End(xlDown)).Select 104 Selection.Cut 105 Range("C1").Select 106 ActiveSheet.Paste 107 Range("E1").Select 108 ActiveCell.FormulaR1C1 = "=MAX(R[29]C[-3]:R[1023]C[-3])" 109 Range("F1").Select 110 ActiveCell.FormulaR1C1 = "=MAX(R[29]C[-2]:R[1023]C[-2])" 111 Range("F2").Select 112 'グラフの作成 113 With ActiveSheet.Shapes.AddChart 114 .Top = 40 115 .Left = 400 116 .Name = "上" 117 With .Chart 118 .ChartType = xlXYScatter 119 .SetSourceData Source:=Worksheets(i).Range("$A$1:$B$1024") 120 .HasTitle = True 121 .ChartTitle.Text = "上" 122 End With 123 End With 124 125 With ActiveSheet.Shapes.AddChart 126 .Top = 300 127 .Left = 400 128 .Name = "横" 129 With .Chart 130 .ChartType = xlXYScatter 131 .SetSourceData Source:=Worksheets(i).Range("$C$1:$D$1024") 132 .HasTitle = True 133 .ChartTitle.Text = "横" 134 End With 135 End With 136 137 Next i 138 139 '------------------------------------------- 140 ' エクセルの終了 141 '------------------------------------------- 142 'エクセルを閉じる 143 Book.Close (False) 144 145 '------------------------------------------- 146 ' 終了処理 147 '------------------------------------------- 148 Set Sheet2 = Nothing 149 Set Book2 = Nothing 150 151 Set Sheet = Nothing 152 Set Book = Nothing 153 Set App = Nothing 154 155 MsgBox "処理を完了します。" 156 157 '画面表示ON 158 Application.ScreenUpdating = True 159 End 160 161 162 '画面表示ON 163 Application.DisplayAlerts = True 164 End 165 166End Sub 167 168'############################################################################# 169' フォルダ参照用 170'############################################################################# 171Function FolderSelect() As String 172 173 '------------------------------------------- 174 ' 変数定義 175 '------------------------------------------- 176 Dim objFileDialog As Object 'FileDialog 177 Dim strTitle As String 'タイトル 178 Dim strPath As String 'フォルダパス 179 Dim strInitialPath As String '初期フォルダパス 180 181 '------------------------------------------- 182 ' フォルダ選択ダイアログの初期設定 183 '------------------------------------------- 184 'ダイアログタイトル 185 strTitle = "結合元のフォルダを選択してください" 186 'ダイアログの初期パスをモジュール起動エクセルに設定 187 strInitialPath = ActiveWorkbook.Path 188 189 '------------------------------------------- 190 ' フォルダ選択ダイアログ表示 191 '------------------------------------------- 192 Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker) 193 194 With objFileDialog 195 'タイトル 196 .Title = strTitle 197 '初期フォルダパス 198 .InitialFileName = strInitialPath 199 200 If .Show = False Then 201 'キャンセル時 202 GoTo Exit_Function 203 Else 204 'フォルダパス取得 205 strPath = .SelectedItems(1) 206 End If 207 208 End With 209 210 '------------------------------------------- 211 ' 終了処理 212 '------------------------------------------- 213Exit_Function: 214 Set objFileDialog = Nothing 215 216 FolderSelect = strPath 217 218End Function

補足情報

windows10
Excel 2019
を使用しています。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Activesheet を App.Activesheet とするか、

Dim ws As Worksheet
Set ws = Book.Worksheets(i)
として、以降の Activesheet を ws にすると解決しそうな気がします。

投稿2021/03/01 12:55

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikene

2021/03/02 01:13

回答ありがとうございました。残念ながら前者と後者どちらも試しましたがうまく動きませんでした。 シートをすべて結合するファイルは生成が行われていたので、グラフを作成するコード(コード上でここから次までと記載されている箇所)で上記の回答の操作を行いました。状況としては変わらず、作成した結合するエクセルブック中でグラフ作成は行われず、マクロを実行したエクセル上でグラフ作成が行われてしまっています。また新たに判明したこととしてグラフのデータのペーストが行われず、切り取った状態で止まってしまっているようです。 次に行った後者のコード(修正箇所のみ)を添付します。もし修正に間違いがあれば訂正を頂けると非常に助かります。 Dim ws As Worksheet Set ws = Book.Worksheets(i) '結合したエクセルのシート分繰り返す For i = 1 To Book.Worksheets.Count 'rawデータの処理 ws.Activate Range("A1025:B1025").Select Range(Selection, Selection.End(xlDown)).Select Selection.Cut Range("C1").Select ws.Paste Range("E1").Select ActiveCell.FormulaR1C1 = "=MAX(R[29]C[-3]:R[1023]C[-3])" Range("F1").Select ActiveCell.FormulaR1C1 = "=MAX(R[29]C[-2]:R[1023]C[-2])" Range("F2").Select 'グラフの作成 With ws.Shapes.AddChart .Top = 40 .Left = 400 .Name = "上" With .Chart .ChartType = xlXYScatter .SetSourceData Source:=ws.Range("$A$1:$B$1024") .HasTitle = True .ChartTitle.Text = "上" End With End With With ws.Shapes.AddChart .Top = 300 .Left = 400 .Name = "横" With .Chart .ChartType = xlXYScatter .SetSourceData Source:=ws.Range("$C$1:$D$1024") .HasTitle = True .ChartTitle.Text = "横" End With End With Next i
jinoji

2021/03/02 02:53 編集

今回のコードは、Excel.Applicationが二つ並行して動いているのがそもそもの不具合のもとです。 本当にそうする必要があるかは考えてみた方がいいと思いますが、 さし当たり、上掲の部分だと、Range とかSelectionとかActiveCellとかが、そうじゃない方の(マクロ側の)Appで動いているのが原因だと思います。 ws.Range App.Selection App.ActiveCellとかにすれば改善されると思いますが、他にも同様の箇所がないか見た方がいいかも。
ikene

2021/03/05 00:50

ご返信ありがとうございます。後半でご指摘いただいた修正をしましたが、残念ながら正常にグラフが作成されることはありませんでした。 まず大変初歩的な質問で申し訳ないですが、エクセルが二つ並行しているのを避けるためには、マクロを実行しているファイル上でシートをまとめなくてはならないということでしょうか? とりあえず、間に合わせの処理として、修正を行った後の状況としてはシートをまとめた新規ブックは作成されるものの、データの処理もグラフも作製されないというものです。今度はマクロを実行したファイル上では何も作成されていないことから、マクロ側でのAppでグラフ作製のコードが動くのは避けることができたのではと思います。しかしグラフ作成がシートをまとめたファイル上でも行われておらず、現在のコードのwsはどこのシートを指定していることになっているのか見当がつきません。 次に再度修正したコード(同様の箇所がなさそうなので修正箇所のみ)を添付いたします。何度もお手数をおかけしますが問題点があれば指摘いただければたすかります。 Dim ws As Worksheet Set ws = Book.Worksheets(i) '結合したエクセルのシート分繰り返す For i = 1 To Book.Worksheets.Count 'rawデータの処理 ws.Activate ws.Range("A1025:B2048").Select App.Selection.Cut ws.Range("C1").Select ws.Paste ws.Range("E1").Select App.ActiveCell.FormulaR1C1 = "=MAX(R[29]C[-3]:R[1023]C[-3])" ws.Range("F1").Select App.ActiveCell.FormulaR1C1 = "=MAX(R[29]C[-2]:R[1023]C[-2])" 'グラフの作成 ws.Range("$A$1:$B$1024").Select With ws.Shapes.AddChart .Top = 40 .Left = 400 .Name = "上" With .Chart .ChartType = xlXYScatter .SetSourceData Source:=ws.Range("$A$1:$B$1024") .HasTitle = True .ChartTitle.Text = "上" End With End With ws.Range("$C$1:$D$1024").Select With ws.Shapes.AddChart .Top = 300 .Left = 400 .Name = "横" With .Chart .ChartType = xlXYScatter .SetSourceData Source:=ws.Range("$C$1:$D$1024") .HasTitle = True .ChartTitle.Text = "横" End With End With Next i
jinoji

2021/03/05 01:10

なんかすみません。 前半が終わったら一度Bookを閉じて後半で開きなおすとかどうでしょう。 Book.SaveAs Filename:=FilePath & "\" & BookName '前半ここまで Book.Close App.Quit Set Book =Worksheets.Open(FilePath & "\" & BookName) '後半ここから For i = 1 To Book.Worksheets.Count
ikene

2021/03/05 13:20

返信ありがとうございます。 後にsaveだけ挟んで、完全解決しました。 その解決法がシンプルでいいですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問