前提・実現したいこと
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
を使用しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/02 01:13
2021/03/02 02:53 編集
2021/03/05 00:50
2021/03/05 01:10
2021/03/05 13:20