別ファイルへのデータ出力とタスクへマクロ登録
大変お世話になっております。
ホルダーに保存した複数データ(Excel形式)の指定した列のデータを1つの出力ファイルへ追記する為に、EXCELのマクロを使用しております。マクロは手動で起動させています。
今回、ご教示を頂きたい事は、以下の2点になります。
①出力データは、マクロファイル内のシートへ保存する設定にしていますが、別ホルダーの別ファイルの別シートへデータを出力出来るようにし、出力は1行おきに色を付けたい。
②更に、マクロは手動で起動させていますが、タスクマネージャーに入れてマクロファイルを登録し、決められた時間に出力ファイルを作成したい。
マクロは全くの初心者で、どの部分を修正すれば、
①が実行出来るようになるのか、色々とネットで検索しながら、
スクリプトを変更して見ましたが、できませんでした。
先ずは、①についてご教示頂けないでしょうか。
下記コードはマクロ内のシートへデータ出力である事はわかるのですが、どのように変更すべきなのかわからず大変困っております。
Set O = ThisWorkbook.ActiveSheet
以下に、現在使用しているマクロを記載させて頂きました。
Sub Macro1()
Dim O As Worksheet
Dim FileName As String
Dim ROut As Long
Dim REnd As Long
Cells(1, "A") = "個人番号"
Cells(1, "A").EntireColumn.ColumnWidth = 15
Cells(1, "B") = "職員番号"
Cells(1, "B").EntireColumn.ColumnWidth = 15
Cells(1, "C") = "氏名"
Cells(1, "C").EntireColumn.ColumnWidth = 15
Cells(1, "D") = "所属/拠点"
Cells(1, "D").EntireColumn.ColumnWidth = 15
Cells(1, "E") = "所属/グループ"
Cells(1, "E").EntireColumn.ColumnWidth = 15
Cells(1, "F") = "役職"
Cells(1, "F").EntireColumn.ColumnWidth = 15
Cells(1, "G") = "開始年月日"
Cells(1, "G").EntireColumn.ColumnWidth = 15
Cells(1, "H") = "終了年月日"
Cells(1, "H").EntireColumn.ColumnWidth = 15
Cells(1, "I") = "申告"
Cells(1, "I").EntireColumn.ColumnWidth = 15
Cells(1, "J") = "判定1"
Cells(1, "J").EntireColumn.ColumnWidth = 15
Cells(1, "K") = "判定2"
Cells(1, "K").EntireColumn.ColumnWidth = 15
Cells(1, "L") = "判定3"
Cells(1, "L").EntireColumn.ColumnWidth = 15
Cells(1, "M") = "判定4"
Cells(1, "M").EntireColumn.ColumnWidth = 15
Cells(1, "N") = "判定5"
Cells(1, "N").EntireColumn.ColumnWidth = 15
'
Set O = ThisWorkbook.ActiveSheet
FileName = Dir(ThisWorkbook.Path & "\参加者_*.xlsx")
Range("A2:N" & Rows.Count).ClearContents
ActiveSheet.CheckBoxes.Delete
ROut = 2
Application.ScreenUpdating = False
'
Do While FileName > ""
Workbooks.Open ThisWorkbook.Path & "\" & FileName, False, True
FileName = Replace(FileName, ".xlsx", "")
'
If ROut < 8 Then
Rows("1:" & 8 - ROut).Delete
ElseIf ROut > 8 Then
Rows("8:" & ROut - 1).Insert
End If
REnd = Cells(Rows.Count, "C").End(xlUp).Row
O.Range("A" & ROut, "A" & REnd) = Mid(FileName, 7)
Range("B" & ROut, "H" & REnd).Copy O.Range("B" & ROut)
Range("N" & ROut, "N" & REnd).Copy O.Range("I" & ROut)
Range("Q" & ROut, "U" & REnd).Copy O.Range("J" & ROut)
ROut = REnd + 1
ActiveWorkbook.Close False
FileName = Dir
Loop
' Range("A1").Select
' Range("A1").CurrentRegion.ClearFormats
' ActiveSheet.ListObjects.Add SourceType:=xlSrcRange, Source:=ActiveSheet.Range("A1").CurrentRegion
'数値へ変換
Range("B:B").Value = Range("B:B").Value
Range("B:B").Replace What:=vbTab, Replacement:=""
MsgBox ("完了です")
End Sub
補足
各コードについて、丁寧に解説頂きまして誠にありがとうございました。ご教示の通りである事、朧気ながらわかるようになりました。更に、ご教示頂きたい処があります。 ①Do While FileName > ""のコードを修正しましたが、エラーが出ました。 修正したコードが間違っている事はわかるのですが、正しいコードが分かりませんでした。 Sh.Cells(ROut, "B") = _ と [A1].SpecialCells(xlCellTypeLastCell).Row -Sh.Range("B15") + 1 は対になっているようです。 Do While FileName > "" Sh.Cells(ROut, "A") = FileName Sh.Cells(ROut, "B") = _ [A1].(Rows.Count, 1).End(xlUp).Row - Sh.Range("B15") + 1 '←エラー発生、コード修正のご教示お願いします ' [A1].SpecialCells(xlCellTypeLastCell).Row -Sh.Range("B15") + 1 ROut = ROut + 1 End If ②kkkkkmさんからご紹介頂いた 『selectRange』をメーンへ下記のように記載すると『コピー元パス』シートで、コピーするデータ範囲を選択の画面が2回出てしまったので、『If selectRange = False Then Exit Sub』をコメントアウトしたら、画面は1回だけになりました。上記のif文はあった方が良いと言う事ですが、コードを記載する位置が誤っているのでしょうか? selectRange Sh.Activate If selectRange = False Then Exit Sub ③忠告を頂いている、『なお、このシートは開いたブックのシートだと思いますが、このループの中で他のブックをアクティブにしたら別のブックのシートを参照することになると思いますから、注意してください。』は、おっしゃる通りです。『カテログデータ総数』シート以外を最初に開いたとしても、マクロ実行時に、『カテログデータ総数』をアクテブシートにするようなマクロにする事は可能でしょうか? もし可能でしたら、何卒ご教示をお願いいたします。 以下は修正後のマクロのコードになります。 Sub カテログデータ総数求め16() Dim Sh As Worksheet Dim FileName As String Dim ROut As Long ' シートを設定 Set Sh = ThisWorkbook.Sheets("カテログデータ総数") ROut = 19 Range("B1:B12").Clear Range("B16").Clear Range("A19:B" & Rows.Count).ClearContents ' テーブル解除(2023/10/19設定) On Error GoTo Err_Shori 'テーブルを設定していない場合は処理でエラーが発生する Sh.ListObjects(1).Unlist 'テーブルを設定している場合は、テーブル解除 ' Exit Sub 'テーブル解除したので終了 Err_Shori: ' コピー元ホルダー選択(2023/10/19設定) selectRange Sh.Activate 'これがないと後でエラーになる。' 2023/10/28追加 ' If selectRange = False Then Exit Sub ' 2023/10/28コピー範囲を2回聞いてくるのでコメントにした。 ' B13に記載した作業ホルダー内に*.xlsxファイルが有るか確認する CheckAndDeleteXLSXFiles ' B1からB12セル値を読み取り、選択したカテログフォルダー内のファイルを作業フォルダへコピー。 CopyFilesToDestinationFolder Application.ScreenUpdating = False ' カテログファイル名とそのデータ数をアクティブシートへ出力させる FileName = Dir(Range("B13").Value & "\*.xls*") 'カテログファイルが作業ホルダーにあるか確認する If FileName = "" Then MsgBox "フォルダ又はファイルがありません", vbCritical End If Do While FileName > "" Workbooks.Open Sh.Range("B13").Value & "\" & FileName, False, True On Error Resume Next ' オートフィルタ解除(2023/10/19設定) Sheets(Sh.Range("B14").Value).AutoFilterMode = False Sheets(Sh.Range("B14").Value).Select If Err = 0 Then ' On Error Resume Next ' 2023/10/24こちらへ移動させる。 On Error GoTo 0 ' 2023/10/28必要です。 Sh.Cells(ROut, "A") = FileName Sh.Cells(ROut, "B") = _ [A1].(Rows.Count, 1).End(xlUp).Row - Sh.Range("B15") + 1 ' [A1].SpecialCells(xlCellTypeLastCell).Row -Sh.Range("B15") + 1 ROut = ROut + 1 End If On Error GoTo 0 '2023/10/28必要です。 Workbooks(FileName).Close False FileName = Dir Loop ' テーブルを整形 Dim outputTable As ListObject ' On Error Resume Next ' エラーハンドリングを一時的に有効にする Set outputTable = Sh.ListObjects.Add(xlSrcRange, Range("A18").CurrentRegion, , xlYes) ' On Error GoTo 0 ' エラーハンドリングを元に戻す outputTable.Name = "OutputTable" outputTable.TableStyle = "TableStyleMedium9" ' outputTable.HorizontalAlignment = xlCenter ' 総合計を計算して表示 Dim totalCell As Range Set totalCell = Sh.Range("B16") ' On Error Resume Next totalCell.Value = Application.WorksheetFunction.Sum(outputTable.ListColumns(2).DataBodyRange) ' On Error GoTo 0 totalCell.HorizontalAlignment = xlCenter totalCell.Font.Bold = True totalCell.Borders(xlEdgeTop).LineStyle = xlContinuous End Sub ' kkkkkm様作成へ変更 Function selectRange() As Boolean Dim cellRange As Range Dim ws As Worksheet Set ws = Sheets("コピー元パス") ws.Activate ' コピー元パス選択 On Error Resume Next Set cellRange = Application.InputBox("シート【コピー元パス】から、処理範囲をドラッグして選択してください", "処理範囲の指定", Type:=8) On Error GoTo 0 '入れる必要有 If cellRange Is Nothing Then selectRange = False Exit Function End If cellRange.Select Set ws = Worksheets("カテログデータ総数") cellRange.Copy ws.Range("B1") selectRange = True End Function