プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
以下のような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にリセットされてしまいます。

これを解決するコードを教えていただけないでしょうか。

分かりずらいところがありましたら申し訳ありません。

教えて!goo グレード

A 回答 (4件)

「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プロシージャーの外で定義して、どちらからも参照できるようにしなければいけません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
いろいろ認識が誤っており、申し訳ありませんでした。
結果的に解決できまして、
解決の糸口となった
 >先ずは「Option Explicit」を使用して曖昧な定義は使用しないことです。
 >Subプロシージャーの外で定義して、どちらからも参照できるように
を記載していただいたZincer様をベストアンサーにさせていただきます。

ありがとうございました。

お礼日時:2022/02/15 18:50

こんにちは



いろいろ突っ込みどころがありそうですが、ひとまずご質問の内容に関しては(既に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 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考サイトの記載もありがとうございます。
すべて拝見しました。
まさに変数のスコープの理解が足りませんでした。。。

ありがとうございました。

お礼日時:2022/02/15 18:49

こんにちは。



Call subfolder(B)では、変数を、subfolderへ渡しているだけですね。
但し、subfolder内で、Bの変数を変更してしまうと、TEST2で使っている
変数Bも変更されてしまっているのでは?と推測します。
subfolderのコードがどの様になっているのかと、同じ変数を使わない事や、
Dimなどの変数の宣言を気を付ける必要があるかと思います。

下記、スコープの記事を載せておきます。
https://www.vba-ie.net/programing/variable-scope …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご賢察の通り、一か所の変数を変更してしまっているために
TEST2で使っている変数も変更されていたようです。

スコープの理解不足でした。

ありがとうございました。

お礼日時:2022/02/15 18:50

callって2箇所、どのcall?



(引数はA?B?どっちの事??)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
寄せ集めのコードでどちらか記載もできていませんでした。
今回できていなかったのはTEST2の方だったと思います。

ありがとうございました。

お礼日時:2022/02/15 18:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング