[[20220526003920]] 『マクロでフォルダーの参照を行っているが、データ』(toto) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロでフォルダーの参照を行っているが、データフォルダの選択時にショートカットアイコンが表示されない』(toto)

初めて質問させていただきます。不慣れな点あればご容赦ください。

同じ様式のエクセルファイルが大量に格納されているフォルダを指定して、フォルダ内のファイルを集計・転記するというマクロを使用しています。
(マクロ全文を末尾に記載します)。

このマクロを使うと、フォルダーの参照(データフォルダを選択してください)というウィンドウが表示され、集計したいフォルダを選択する、選択するとフォルダ内のエクセルファイルを読み取り、転記されたデータが作成されるというものになっています。

このフォルダーの参照場面で表示されるデータファイルに、ショートカットアイコンが表示されないのですが、この点をなんとか修正したいと悩んでいます。

集計の対象である「エクセルファイルが格納されているフォルダ」は、職場の共有サーバーのかなり深い階層にあるので、
デスクトップにショートカットアイコンを作って、普段はそこからアクセスしているのですが、
このマクロだと共有サーバーの一番浅い階層から一つ一つ階層を潜っていって、お目当てのフォルダを指定する形になってしまい、非常に難儀しています。

大量にデータがあるため、別の場所にコピーするのも大変ですし、なんとか改善できないかと思っています。
初歩的な質問で恐縮ですが、ご助力いただけたら嬉しいです。

【以下使用しているマクロです】
Public Sub Main()
'*******************************************************************************
' データファイルから特定項目を抽出して一覧表を作成
'*******************************************************************************

    Dim WBDAT As Workbook
    Dim WS As Worksheet
    Dim LIST As Worksheet
    Dim strGuide As String
    Dim FolderPath As String
    Dim FileName As String
    Dim lstRow As Long
    Dim datRow As Long
    Dim datEndRow As Long
    Dim SavePath As String

    strGuide = "データフォルダを選択してください。"
    FolderPath = GetFolder(strGuide)
    If FolderPath = "" Then Exit Sub

    Application.ScreenUpdating = False

    Set LIST = ThisWorkbook.Worksheets("集計シート")

    lstRow = 3    '集計シートの開始行

    'フォルダ内のデータファイルを順番に開く
    FileName = Dir(FolderPath & "\*.xls?", vbNormal)
    Do While FileName <> ""
        Set WBDAT = Workbooks.Open(FolderPath & "\" & FileName)
        Application.WindowState = xlMinimized

        '処理中画面を表示
        frmDoing.Show vbModeless
        frmDoing.lblMsg.Caption = FileName & " を処理中です。"
        DoEvents

        For Each WS In WBDAT.Worksheets
            'データを集計シートに転記
            With WS
                datEndRow = .Cells(Rows.Count, 2).End(xlUp).Row     '労働者氏名
                For datRow = 20 To datEndRow
                    '---------- ヘッダ --------------------------------------
                    LIST.Cells(lstRow, 1).Value = WBDAT.Name                'ファイル名
                    LIST.Cells(lstRow, 2).Value = .Range("C6").Value        '受注者の商号又は名称
                    LIST.Cells(lstRow, 3).Value = .Range("I8").Value        '下請業者の商号又は名称
                    LIST.Cells(lstRow, 4).Value = .Range("F11").Value       '開始
                    LIST.Cells(lstRow, 5).Value = .Range("J11").Value       '終了
                    '---------- 明 細 --------------------------------------
                    LIST.Cells(lstRow, 6).Value = .Range("A" & datRow).Value    '番号
                    LIST.Cells(lstRow, 7).Value = .Range("B" & datRow).Value    '労働者氏名
                    LIST.Cells(lstRow, 9).Value = .Range("D" & datRow).Value    '従事職種
                    LIST.Cells(lstRow, 10).Value = .Range("E" & datRow).Value   '支払形態
                    LIST.Cells(lstRow, 11).Value = .Range("F" & datRow).Value   '労働日数
                    LIST.Cells(lstRow, 12).Value = .Range("G" & datRow).Value
                    LIST.Cells(lstRow, 13).Value = .Range("H" & datRow).Value
                    LIST.Cells(lstRow, 14).Value = .Range("I" & datRow).Value
                    LIST.Cells(lstRow, 15).Value = .Range("J" & datRow).Value
                    LIST.Cells(lstRow, 16).Value = .Range("K" & datRow).Value
                    LIST.Cells(lstRow, 17).Value = .Range("L" & datRow).Value
                    LIST.Cells(lstRow, 18).Value = .Range("M" & datRow).Value
                    LIST.Cells(lstRow, 19).Value = .Range("N" & datRow).Value
                    LIST.Cells(lstRow, 20).Value = .Range("O" & datRow).Value
                    LIST.Cells(lstRow, 21).Value = .Range("P" & datRow).Value
                    LIST.Cells(lstRow, 22).Value = .Range("Q" & datRow).Value
                    lstRow = lstRow + 1
                Next datRow
            End With
        Next WS
        WBDAT.Close SaveChanges:=False
        FileName = Dir()
    Loop

    '処理中画面を閉じる
    Unload frmDoing

    'シートを名前を付けて保存
    SavePath = ConvOneDrivePath(ThisWorkbook.Path) & "\" & "集計結果_" & Format(Date, "yyyymmdd") & ".xlsx"
    If Dir(SavePath) <> "" Then
        Kill SavePath
    End If
    LIST.Copy
    ActiveWorkbook.SaveAs FileName:=SavePath, FileFormat:=xlWorkbookDefault
    ActiveWorkbook.Close

    Application.ScreenUpdating = True

    MsgBox "集計シートを作成しました。", vbInformation, "データ抽出"

    Application.Quit
    ThisWorkbook.Close SaveChanges:=False

End Sub

Public Function GetFolder(strGuide As String) As String
'*******************************************************************************
' 選択したフォルダのパスを返す
'*******************************************************************************

    Dim WSH As Object
    Dim ObjPath As Object

    Set WSH = CreateObject("Shell.Application")
    Set ObjPath = WSH.BrowseForFolder(0, strGuide, 0)

    If Not ObjPath Is Nothing Then
        On Error GoTo ERR_JUMP
        GetFolder = ObjPath.items.Item.Path
        On Error GoTo 0
    End If

    Exit Function
ERR_JUMP:
    Err.Clear
    GetFolder = CreateObject("Wscript.shell").specialfolders("Desktop")

End Function

Public Function ConvOneDrivePath(ByVal myPath) As String
'*******************************************************************************
' Web版(OneDrive)のフルパスをローカルパスに変換
'*******************************************************************************

    Dim buf As Variant
    Dim FirstHalfPath As String
    Dim i As Long

    If Left(myPath, 5) = "https" Then
        FirstHalfPath = Environ("UserProfile") & "\OneDrive"
        'ThisWorkbook.Pathにおいて、https://d.docs.live.net/までを削除
        buf = Replace(myPath, "https://d.docs.live.net/", "")
        '最初の/まではOneDriveのパスの続きなので、その次のパスから拾う
        buf = Split(buf, "/")
        myPath = FirstHalfPath
        For i = 1 To UBound(buf)
            myPath = myPath & "\" & buf(i)
        Next i
        ConvOneDrivePath = myPath
    Else
        ConvOneDrivePath = myPath
    End If

End Function

< 使用 Excel:Excel2019、使用 OS:unknown >


 フォルダ指定の操作において、適切な初期値を設定しておきたい、
 というお話ですね。

 (1)
http://officetanaka.net/excel/vba/tips/tips39.htm
 にあるように
 Shell.BrowseForFolderの最後の引数で、そうしたフォルダの初期値を指定できます。
 ネットワーク上のパスが指定できるか未確認ですが、トライしてみては?

 (2)別法
 最初のサンプルの手法を使うと、その時のカレントなフォルダが初期値になります。
 Sub Sample1()
     With Application.FileDialog(msoFileDialogFolderPicker)
         If .Show = True Then
             MsgBox .SelectedItems(1)
         End If
     End With
 End Sub
 そこで、ネットワーク上のフォルダをカレントフォルダにするには、
http://officetanaka.net/other/extra/tips15.htm
 にあるSetCurrentDirectoryを使うと良いでしょう。

 (なお、現在のカレントフォルダを変数に退避させておいて、
  フォルダ指定が済んだら、復旧させる処理も加えるとよいでしょう。) 
(γ) 2022/05/26(木) 06:17

回答いただきありがとうございます!
お教えいただいたサンプルとにらめっこしながら、試行錯誤してみようと思います。
(toto) 2022/05/27(金) 11:04

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.