ExcelVBA サンプルコード①

Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
   (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal szFileName As String, _
    ByVal dwReserved As LongPtr, ByVal lpfnCB As LongPtr) As LongPtr

' ボタン(cmdOpenLink)がクリックされたときに実行されるイベントハンドラ'
Private Sub cmdOpenLink_Click()

    ' ファイルダイアログを表示して、ユーザーが選択したExcelファイルのパスを FileName 変数に格納'
    Dim FileName As Variant
    FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*")
    ' ファイルが選択されなかった場合、プログラムを終了'
    If FileName = False Then
        Exit Sub
    End If
    ' 選択されたExcelファイルを開く'
    Dim targetWorkbook As Workbook
    Set targetWorkbook = Workbooks.Open(FileName)
    
    ' アクティブなワークブックの"生技_作業手順"シートのA2セルを基準に、A列をフィルタリングし、値が "〇" である行のみを表示'
    targetWorkbook.Sheets("生技_作業手順").Range("A2").AutoFilter Field:=1, Criteria1:="=〇*", Operator:=xlAnd
    
    Dim lngRes As LongPtr
    Dim strURL As String, strPath As String, strFolder As String
    Dim i As Long
    Dim ws As Worksheet
    Set ws = targetWorkbook.Sheets("生技_作業手順")
    
    ' 保存先のフォルダを設定(日付と選択したExcelのファイル名を結合してフォルダ名を作成)'
    strFolder = "C:\Users\takka\OneDrive\デスクトップ\ここに保存\" & Format(Date, "yyyymmdd") & "_" & _
                Replace(Replace(Mid(FileName, InStrRev(FileName, "\") + 1), ".xlsx", ""), ".xls", "") & "\"
    
    ' 指定されたフォルダが存在しない場合、フォルダを作成'
    If Dir(strFolder, vbDirectory) = "" Then
        MkDir strFolder
    End If

    ' PDFのパスを保存するCollectionを作成'
    Dim pdfPaths As New Collection
    
    ' 生技_作業手順シートのA列(1列目)の12行目から、データが入力されている最後の行までを走査'
    For i = 12 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
        ' i行目のA列の値が "〇" であるかどうかをチェックして、条件に合致する場合、ファイルをダウンロード'
        If ws.Cells(i, 1).Value Like "〇*" Then
            ' ファイルパスを構成し、ダウンロードするファイルのURLと保存先を指定'
            strPath = strFolder & ws.Cells(i, 4) & ".pdf"
            strURL = ws.Cells(i, 5).Value
            ' URLDownloadToFile関数を使用してファイルをダウンロード'
            lngRes = URLDownloadToFile(0, strURL, strPath, 0, 0)
            ' ダウンロードに失敗した場合、エラーメッセージを表示'
            If lngRes <> 0 Then
                MsgBox i & "行目のファイルをダウンロードできませんでした", vbCritical
            Else
                ' ダウンロードが成功したら、そのPDFのパスをCollectionに追加'
                pdfPaths.Add strPath
            End If
        End If
    Next i
    
    ' 全てのファイルのダウンロードが完了したことを通知するメッセージを表示'
    MsgBox "ダウンロード完了!", vbInformation
    
    'ダウンロードしたPDFファイルを開く'
    Dim objShell As Object
    Set objShell = CreateObject("Shell.Application")
    Dim pdfPath As Variant
    For Each pdfPath In pdfPaths
        objShell.Open pdfPath
    Next pdfPath
    
    ' 対象シートをアクティブにする'
    targetWorkbook.Sheets("Sheet1").Activate
    
End Sub