お世話になります。
以下のようなvbaのコードを考えました。
-------------------------------------------------------------------------
Sub TEST1
Dim ii ’作業用シート記載行
Dim FPass ’対象フォルダパス
ii=5
FPass="c:\work\1"
Call TEST2(A)
End Sub
-------------------------------------------------------------------------
Sub TEST2(A)
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
'フォルダ内のループ
For Each B In FSO.GetFolder(FPass).SubFolders
ii = ii + 1
Worksheets("作業用").Cells(ii, 1).Value = B
Call subfolder(B)
Next
End Sub
-------------------------------------------------------------------------
このプログラムでやりたいことは、
「特定のフォルダ(c:\work\1)の中にあるサブフォルダを含むフォルダとファイルの
パスをすべて取得し、【作業用】シートに記載することと、そのパス毎に更新日時を取得する」
というものです。
現在「【作業用】シートに記載する」ところで困っています。
取得した引数「B」を作業用シートA1から下にすべて記載していきたいのですが、
Callで戻った時、引数が1にリセットされてしまいます。
これを解決するコードを教えていただけないでしょうか。
分かりずらいところがありましたら申し訳ありません。
No.2ベストアンサー
- 回答日時:
「Call TEST2(A)」で「Sub TEST2(A)」を呼ぶ出しているのはわかるのですが、「Sub TEST2(A)」で引数Aを使用している痕跡が無いのは何故ですか?
>Call subfolder(B)
>引数が1にリセットされてしまいます。
とは、この部分だと思います。「Sub subfolder(B)」の内容を見てみないと確信は持てませんが、ここに原因があるのかもしれません。
それともう1つ、
Sub TEST1 内で定義した Dim FPass や Dim ii は Sub TEST2(A) から参照することはできません。
もしかして、
Call TEST2( FPass)
Sub TEST2(A)
・・・
'フォルダ内のループ
For Each B In FSO.GetFolder(A).SubFolders
・・・
の間違いでしょうか?
っと、ここまで書いて気が付きましたが、リセットされるのは、変数iiではないでしょうか?
これならば、Sub TEST2(A)へiiは引数として渡らないため、毎回0から始まることが原因でしょう。
先ずは「Option Explicit」を使用して曖昧な定義は使用しないことです。
http://officetanaka.net/excel/vba/beginner/11.htm
次に、共通変数となるDim FPass や Dim ii はこれらのSubプロシージャーの外で定義して、どちらからも参照できるようにしなければいけません。
回答ありがとうございます。
いろいろ認識が誤っており、申し訳ありませんでした。
結果的に解決できまして、
解決の糸口となった
>先ずは「Option Explicit」を使用して曖昧な定義は使用しないことです。
>Subプロシージャーの外で定義して、どちらからも参照できるように
を記載していただいたZincer様をベストアンサーにさせていただきます。
ありがとうございました。
No.4
- 回答日時:
こんにちは
いろいろ突っ込みどころがありそうですが、ひとまずご質問の内容に関しては(既にNo2様の回答にもありますが)、「変数のスコープ」に関しての理解が不足しているように思われます。
ひとまず、以下をご一読なさってみてください。
簡単に言えば、異なるプロシージャ間では、変数の相互参照は直接にはできませんということです。
https://docs.microsoft.com/ja-jp/office/vba/lang …
https://docs.microsoft.com/ja-jp/office/vba/lang …
また、「引数」に関してももう少し調べて理解なさった方がよさそうに思われます。
(あまり、適切なページが見つかりませんでしたが・・)
https://vbae.odyssey-com.co.jp/column/no29_1.html
http://addinbox.sakura.ne.jp/Excel_Tips01.htm
https://docs.microsoft.com/ja-jp/office/vba/lang …
回答ありがとうございます。
参考サイトの記載もありがとうございます。
すべて拝見しました。
まさに変数のスコープの理解が足りませんでした。。。
ありがとうございました。
No.3
- 回答日時:
こんにちは。
Call subfolder(B)では、変数を、subfolderへ渡しているだけですね。
但し、subfolder内で、Bの変数を変更してしまうと、TEST2で使っている
変数Bも変更されてしまっているのでは?と推測します。
subfolderのコードがどの様になっているのかと、同じ変数を使わない事や、
Dimなどの変数の宣言を気を付ける必要があるかと思います。
下記、スコープの記事を載せておきます。
https://www.vba-ie.net/programing/variable-scope …
回答ありがとうございます。
ご賢察の通り、一か所の変数を変更してしまっているために
TEST2で使っている変数も変更されていたようです。
スコープの理解不足でした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCLE VBA シートクリックしたら該当シートコピー 1 2021/11/11 16:37
- Visual Basic(VBA) シート名をフォルダ名に変更 1 2021/12/01 15:59
- Visual Basic(VBA) 空のシートに関数を入れたい 2 2021/12/03 15:08
- Visual Basic(VBA) EXCEL VBA シート貼り付け 3 2021/11/15 12:33
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Excel(エクセル) excel VBA フォルダ内のサブフォルダを検索してハイパーリンクを貼りたい 1 2021/10/25 11:59
- Visual Basic(VBA) EXCEL VBA シート比較し〇×判定 1 2021/11/19 11:49
- Visual Basic(VBA) フォルダの作成 3 2021/11/10 11:05
- Visual Basic(VBA) Excel VBAでフォルダ内の全テキストファイルの任意データを取得について 7 2021/12/18 16:00
- Visual Basic(VBA) シート名でファイル検索する 2 2021/11/30 17:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
特定のシートのみ再計算させな...
-
エクセルの2つのシートを並び...
-
エクセルでブック内の倍率がバ...
-
ワークシートそのものの色を変...
-
【ExcelVBA】マクロの入ったシ...
-
エクセルで複数のシートに画像...
-
ActiveSheet.Protect UserInter...
-
Excelで条件に一致したものだけ...
-
エクセルで、シートの名前を変...
-
エクセルのシー名を二段表示に...
-
【Excel VBA】データ貼り付け先...
-
EXCELで存在しないシート...
-
Wordで差し込み印刷時に表示す...
-
特定の複数のシートに同じ処理...
-
エクセルでリンク貼り付けした...
-
Excelのオートフィルター等のリ...
-
DATE関数 4月31日などのあ...
-
パワーポイントでスライドマス...
-
エクセルのシート連番の振り直し
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルで複数のシートに画像...
-
エクセルでブック内の倍率がバ...
-
特定のシートのみ再計算させな...
-
【ExcelVBA】マクロの入ったシ...
-
ワークシートそのものの色を変...
-
エクセルの2つのシートを並び...
-
EXCELの図形(テキストボックス)...
-
ハイパーリンクでジャンプした...
-
Wordで差し込み印刷時に表示す...
-
エクセルで、シートの名前を変...
-
エクセル、特定のシートにパス...
-
エクセルのシー名を二段表示に...
-
Accessのテーブルを既存のExcel...
-
確定申告用の医療費集計フォー...
-
エクセルのシート連番の振り直し
-
【Excel】エクセルの1ファイル...
-
エクセルの複数シートでのリン...
-
【Excel VBA】データ貼り付け先...
-
エクセルでリンク貼り付けした...
おすすめ情報