Sub main()がaプロシージャを呼び出す時に、引数に1,2に渡すが渡すとはスタックに積むこと。引数1が引数2の半分の大きさにしているのは引数1はInteger型、引数2はLong型のため。さらにaプロシージャ内で宣言したii変数もスタック上に作られ、aプロシージャの処理が終わるとスタックポインタは「リターンアドレス」呼び出し元であるmainのコード上のaプロシージャを呼び出した位置(アドレス)に処理先を戻す。
Sub main()
a 1, 2
End Sub
Sub a(引数1 As Integer, 引数2 As Long)
Dim ii As Long 'ローカル変数。aプロシージャ内で有効な変数。プロシージャレベルの変数
a 11, 22 '自分自身を呼び出す。再帰呼び出しでスタックにデータは積むが取り出すことは無い
End Sub
Sub main()
a 1, 2
End Sub
Sub a(引数1 As Integer, 引数2 As Long)
Dim ii As Long 'ローカル変数。aプロシージャ内で有効な変数。プロシージャレベルの変数
引数1 = ii + 1
a 引数1, 引数2 + 1 '自分自身を呼び出す。再帰呼び出しでスタックにデータをその都度積む
End Sub
'vba.dirで再帰処理
Function myAllFileFolder(sPath As String, sWildCard As String) As String
On Error GoTo myErr '使用中や権限のなのファイルを扱ったときは、無視させる
Dim r As String, col As New VBA.Collection
If VBA.Right(sPath, 1) <> "\" Then sPath = sPath & "\" 'sPath最後が\で無い場合\を付ける
'あるフォルダ内の全フォルダを検索して、colに登録
r = VBA.Dir(sPath & "*.*", vbDirectory) 'vbDirectoryでもファイルを含むので以後でGetAttrで分別
Do Until r = ""
If r <> "." And r <> ".." Then '無視。"."は自分のディレクトリ。".."は親ディレクトリ
If VBA.GetAttr(sPath & r) = VBA.vbDirectory Then 'フォルダ/ディレクトリの場合だけ
col.Add r
End If
End If
r = VBA.Dir
DoEvents '長い場合に中断できるようにWindowsからのメッセージを受け付ける
Loop
'ディレクトリの場合は、再帰呼び出し
Dim x
For Each x In col
myAllFileFolder = myAllFileFolder & myAllFileFolder(sPath & x, sWildCard) '再帰呼び出し
Next
'sWildCardで指定したファイルだけを検索。検索対象はsPathフォルダ内だけ
r = VBA.Dir(sPath & sWildCard, vbArchive + vbHidden + vbNormal + vbReadOnly + vbSystem) '全ファイルが検索対象
Do Until r = "" '""は、もう該当のファイルがないことを意味する
If r <> "." And r <> ".." Then '無視。"."は自分のディレクトリ。".."は親ディレクトリ
myAllFileFolder = myAllFileFolder & sPath & r & VBA.vbCrLf '改行コードを挟んで検索されたファイル名を保存
End If
r = VBA.Dir '繰り返し
DoEvents '長い場合に中断できるようにWindowsからのメッセージを受け付ける
Loop
Exit Function
myErr: '多くのエラーは権限の問題
Debug.Print Err.Number, Err.Description
Debug.Print sPath, r
' Stop 'エラーが多い場合の確認用
Resume Next '状況を出力したら、やりなおしはResume。もし、そのエラーを無視して次へ行く場合はResume Nextに
End Function
'?myAllFileFolder(VBA.Environ("userprofile") & "\desktop\abc", "*.*")
'?myAllFileFolder("c:\windows\system32\drivers","*.*")
Function fileSearch(sPath As String, sWildCard As String) As String
On Error GoTo myErr 'エラートラップ
Dim fso, x
Set fso = VBA.CreateObject("Scripting.FileSystemObject")
For Each x In fso.GetFolder(sPath).SubFolders 'サブフォルダまで検索できる
fileSearch = fileSearch & fileSearch(x.Path, sWildCard) '再帰呼び出し
Next
For Each x In fso.GetFolder(sPath).Files 'あるフォルダの全ファイルを一つずつxに入れる
If x.Name Like sWildCard Then 'Likeはパターン一致の演算子。=も演算子
fileSearch = fileSearch & x.Path & VBA.vbCrLf
' Debug.Print File.Path
End If
Next
DoEvents '長い場合に中断できるようにWindowsからのメッセージを受け付ける
Exit Function
myErr:
Debug.Print Err.Number, Err.Description
' Stop 'エラーが多い場合の確認用
Resume Next '状況を出力したら、やりなおしはResume。もし、そのエラーを無視して次へ行く場合はResume Nextに
End Function
'?fileSearch(VBA.Environ("homedrive") & VBA.Environ("homepath") & "\desktop", "*.*")
Option Explicit
'CreateObject("Scripting.FileSystemObject")で再帰処理
Function fileSearch(sPath As String, sWildCard As String) As String
On Error GoTo myErr 'エラートラップ
Dim fso, x
Set fso = VBA.CreateObject("Scripting.FileSystemObject")
For Each x In fso.GetFolder(sPath).SubFolders 'サブフォルダまで検索できる
fileSearch = fileSearch & fileSearch(x.Path, sWildCard) '再帰呼出/リカーシブルコール.上と下の処理
Next
For Each x In fso.GetFolder(sPath).Files 'あるフォルダの全ファイルを一つずつxに入れる
If x.Name Like sWildCard Then 'Likeはパターン一致の演算子。=も演算子
fileSearch = fileSearch & x.Path & VBA.vbCrLf
' Debug.Print File.Path
End If
Next
VBA.DoEvents '長い場合に中断できるようにWindowsからのメッセージを受け付ける
Exit Function
myErr: 'ラベル
Debug.Print Err.Number, Err.Description
' Stop 'エラーが多い場合の確認用
Resume Next '状況を出力したら、やりなおしはResume。もし、そのエラーを無視して次へ行く場合はResume Nextに
End Function
'?fileSearch(VBA.Environ("homedrive") & VBA.Environ("homepath") & "\desktop", "*.*")
Sub test()
Dim ss As String
Dim pa As String, fi As String
pa = VBA.Environ("homedrive") & VBA.Environ("homepath") & "\desktop"
fi = "*.*"
' ss = myAllFileFolder(pa, fi)
ss = fileSearch(pa, fi)
Application.Range("a1").Select
copyExcel ss
End Sub
Sub copyExcel(str As String)
Dim tmp, i As Integer
tmp = VBA.Split(str, VBA.vbCrLf)
For i = 0 To UBound(tmp)
ActiveCell.Offset(i, 0).Value = tmp(i)
Next
End Sub
Function myGetFile(r As Range) 'rはフルパスのセルを指定
Dim ar
ar = VBA.Split(r, "\")
myGetFile = ar(UBound(ar))
End Function
Function myGetPath(r As Range) 'rはフルパスのセルを指定
Dim x
x = myGetFile(r)
myGetPath = VBA.Replace(r.Value, x, "")
End Function