シートに記載のパスワード付きファイルを開き、コピペする
タイトルのマクロは以下です。
E列で指定したフォルダ内にあるB列と同じ名前のブックを、D列のパスワードで開く。 開いたブックのアクティブシートをコピーして、C列で指定しているシートに値のみ貼り付ける。この作業をB列の最終行まで繰り返す。
Sub CopyDataFromWorkbooks()
' リストシートを指定
Dim wsList As Worksheet
Set wsList = ThisWorkbook.Sheets("リスト")
' B列の最終行を取得
Dim lastRow As Long
lastRow = wsList.Cells(wsList.Rows.Count, 2).End(xlUp).Row
' ループ処理開始
Dim i As Long
For i = 2 To lastRow
' シート名を取得
Dim sheetName As String
sheetName = wsList.Cells(i, 3).Value
Dim flg As Boolean
flg = ExistSheet(sheetName, ThisWorkbook)
' シートがあるとき、シート削除
If flg Then
' 保存確認させない状態にする
Application.DisplayAlerts = False
ThisWorkbook.Worksheets(sheetName).Delete
' 保存確認する状態に戻す
Application.DisplayAlerts = True
End If
' ターゲットシートを指定
Dim targetSheet As Worksheet
' 新規シートを最後尾に追加
Set targetSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
targetSheet.Name = sheetName
' パスワードを取得
Dim password As String
password = wsList.Cells(i, 4).Value
' ソースフォルダのパスを取得
Dim sourceFolder As String
sourceFolder = wsList.Cells(i, 5).Value
' ファイル名を取得
Dim fileName As String
fileName = sourceFolder & "\" & wsList.Cells(i, 2).Value & ".xlsx"
' ファイルがないときは、メッセージを表示させ、次の行を処理する
If Dir(fileName) = "" Then
MsgBox fileName & vbCrLf & "が存在しません"
Else
' エラー無視
On Error Resume Next
' ブックを開く
' 読み取りパスワードを使用
' 外部参照、リモート参照ともに更新しない
' 読み取り専用で開く
Dim wb As Workbook
Set wb = Workbooks.Open(fileName:=fileName, _
password:=password, UpdateLinks:=0, ReadOnly:=True)
If Err.Number <> 0 Then
MsgBox fileName & vbCrLf & "を開けませんでした"
' エラー無視解除
On Error GoTo 0
Else
' エラー無視解除
On Error GoTo 0
' ブックのデータを取得
Dim ws As Worksheet
Set ws = wb.ActiveSheet ' アクティブシート
' データを貼り付け
ws.Cells.Copy
targetSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
' 保存確認させない状態にする
Application.DisplayAlerts = False
' ブックを閉じる
wb.Close False
' 保存確認する状態に戻す
Application.DisplayAlerts = True
End If
End If
Next i
End Sub
'*************************
'* シートが存在しているかどうか確認する関数。存在する場合は、Trueを返す
'* shetName:調べたいシート名を指定
'* book:調べたいワークブックを指定
Function ExistSheet(ByVal sheetName As String, ByVal book As Workbook) As Boolean
Dim ws As Worksheet, flag As Boolean
' すべてのワークシートを表す Worksheets コレクションからひとつずつ
' Worksheetを取り出して、名前を確認します。
For Each ws In book.Worksheets
If ws.Name = sheetName Then flag = True
Next ws
If flag = True Then
ExistSheet = True
Else
ExistSheet = False
End If
End Function
シート「リスト」が、以下になっているときに、マクロを実行すると
H:\tempに保管されている「田中.xlsx」ファイルを、パスワード「123」で開き、アクティブシートをコピーして、シート「Sheet13」に値のみペーストします。