'[Main関数]
Sub Main()
    'Main関数で利用する変数の型を定義する。
    Dim FileNumber As Integer 'comment: ← 使用用途を明確にする変数名をつけるように癖をつけてください。これも混乱の元です。
    Dim SDy As Integer 'comment: ← SDyってなんですか？わかりやすい名前にしてください。
    Dim SerchFileandFolder As Integer 'comment: 関数名と同じ名前の変数名は定義しないでください。混乱の元です。
    Dim SDirectory As String

    FileNumber = 2
    SDy = 2

    With ThisWorkbook.Worksheets("sheet1")
        'SDirectoryにはB列の絶対パスを代入する。(初期値はB2セル)→★要配列への移行
        SDirectory = .Cells(SDy, 2).Value

        'SDirectoryに空欄が見つかったら終了。→★要配列への移行
        If SDirectory <> "" Then
            
            'SDy=FileNumberまで再帰処理を実行する。→★要配列への移行
            'FileNumber = SearchFileandFolder(SDy, 2, FileNumber) '●応急処置
            '対象フォルダにファイルが１つのとき→Filenumber=2←アウトくさい
            '対象フォルダにファイルが２つのとき→Filenumber=3←微妙
            'SDy = SDy + 1 '●応急処置
            'For SDy = 2 To FileNumber 'FileNumber 'SDyからFileNumberまで繰り返し
            'FileNumber = SearchFileandFolder(SDy, 2, FileNumber)
            'Next SDy
            
            Do
            
            FileNumber = SearchFileandFolder(SDy, 2, FileNumber)
                        
            SDy = SDy + 1 'comment: 可能であれば、この動きもなくしたいところですが、本当にこのやり方でよいですか？
            
            Loop While SDy <= FileNumber
            
        End If
        
    End With
            
End Sub

'[ファイル探索関数]→ファイルを探してハイパーリンクを貼るマクロ

'B列の絶対パスから、中のフォルダ・ファイル一覧の絶対パスを取得する。
Function SearchFileandFolder(SDy As Integer, SDx As Integer, FileNumber As Integer) As Integer
    '検索対象のファイル(A2)セル
    Dim SFile As String
    
    '検索先のフォルダ_初期値（B2）セル→(B列)
    Dim NextFile As String
    
    Dim SDirectory As String
    
    'ファイル・フォルダを表示する。
    Const SerchRuleFileandFolder = 16
    
     With ThisWorkbook.Worksheets("sheet1")
     
     '検索対象のファイル(A2)セル
     SFile = .Cells(2, 1).Value
     
'↓検索開始直下フォルダ・ファイルの洗い出し

            SDirectory = .Cells(SDy, SDx).Value                                '★2回目以降はここをうまいことうにゃる。[B2]セルから、検索対象フォルダの絶対パスを取得。.Stringで、文字列を取得できる。
            MsgBox "検索対象フォルダはコチラ：" & SDirectory                   '←取得したSDirectoryの値を確認
            NextFile = Dir(SDirectory, SerchRuleFileandFolder)                 '検索対象はファイル及びフォルダ
            
            While NextFile <> ""                                               '親フォルダの中のファイル名一覧を取得する。

                '"."は華麗にスルーする
                If NextFile = "." Then
                'Dir関数の値を次々と読みこんでゆく。
                    NextFile = Dir
                    
                '".."は華麗にスルーする
                ElseIf NextFile = ".." Then
                    'Dir関数の値を次々と読みこんでゆく。
                    NextFile = Dir
                '"NextFile=SFile"なら終了
                
                ElseIf NextFile = SFile Then
                    MsgBox "処理回数" & FileNumber - 1
                    FileNumber = FileNumber + 1
                    
                    '↓ハイパーリンク(コピペ)
                    .Hyperlinks.Add Anchor:=.Cells(2, 1), _
                    Address:=SDirectory & NextFile, _
                    TextToDisplay:=NextFile
                    '↑ハイパーリンク(コピペ)
                    
                    '.Cells(FileNumber, 1).Value = NextFile                   'ファイル名の印字
                    '.Cells(FileNumber, 2).Value = SDirectory & NextFile & "\"  '絶対パスの印字←ハイパーリンクを貼る。
                    '.Cells(FileNumber, 3).Value = FileNumber
                    'MsgBox "見つかったよ！"
                    'Debug.Print "見つかったよ！"
                    
                    '値を戻す場合は、関数名に代入してください。（関数の終わりに戻り値として返却されます）
                    'SearchFileandFolder
                    
                    Exit Function
                    
                Else
                    MsgBox "処理回数" & FileNumber - 1 '"."".."以外はガッチリリストアップする。
                    FileNumber = FileNumber + 1
                    '.Cells(FileNumber, 1).Value = NextFile                   'ファイル名の印字
                    '.Cells(FileNumber, 2).Value = SDirectory & NextFile & "\" '絶対パスの印字
                    '.Cells(FileNumber, 3).Value = FileNumber
                    NextFile = Dir                                            'Dir関数の値を次々と読みこんでゆく。

                End If
                
                'Cells -> Debug.Printに変更
                Debug.Print NextFile  'ファイル名の印字
                Debug.Print SDirectory & NextFile & "\"  '絶対パスの印字←ハイパーリンクを貼る。
                Debug.Print FileNumber 'Dir関数の値を次々と読みこんでゆく。
                
                
            Wend
            
            SearchFileandFolder = FileNumber
 '↑検索開始直下フォルダ・ファイルの洗い出し
    End With
    
    MsgBox "Functionマクロを実行しました"
        
End Function

'comment: サンプル用の関数を定義しましたので動きを確認される場合は、 SayHello内にカーソルを置いて
'comment: F5キーを押してください

' Hello文字列を返す関数
Function GetHello() As String
    GetHello = "Hello"
End Function

' GetHello()から文字列を取得し、発言する手続
Sub SayHello()
    Dim HelloString As String
    HelloString = GetHello
    Debug.Print HelloString
End Sub
