質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

617閲覧

VBAでファイルの有無を確認したいです。

ice930

総合スコア99

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2020/07/12 13:04

VBAでファイルの存在をチェックするVBAを作成しています。

シートのセルA1~A4にファイル名(1,2,3,4)を入力し、フォルダが存在すれば隣のB列に"有り"なければ"無し"と表示されるようにしたいです。

Do While <>""でファイル名すべてを抽出したものを、
If Replace(strFlname, ".", "") <> "" Then
でファイル名のみにし

for で4行分繰り返し、IFの条件式で"有り"と"無し"に分岐しています。

Sub ファイルチェック質問用() Dim Path As String Dim strFlname As String Dim intA As Long Path = ThisWorkbook.Path strFlname = Path & "テスト" & "\" Do While strFlname <> "" For intA = 1 To 4 If Replace(strFlname, ".", "") <> "" Then 'ここで比較 If strFlname = Cells(intA, 1) Then Cells(intA, 2) = "有り" Else Cells(intA, 2) = "無い" End If End If Next Loop End Sub

この式を実行すると、すべて"無し"の表示となり、その後フリーズしてしまいます。

マクロの最後をLoopで終えると無限ループするのでしょうか。
そもそも上記の考えでは目的を達成するのは難しいでしょうか?

すべて"無し"の表示となる理由も知ることが出来ればうれしいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosi

2020/07/12 23:03

F8(デバッグ-ステップイン)で1行づつ実行して、strFlnameの値を見ると理由わかると思います。(デバッグ方法の確認)
ttyp03

2020/07/13 00:40

ファイルとフォルダが混在しています。どっちなのか明確に記述してください。
ice930

2020/07/15 10:38

F8(デバッグ-ステップイン)の機能について初めて知りました! ありがとうございます!
guest

回答2

0

フリーズではなく、無限ループでしょう。
タスクマネージャーで見ればCPUをずっと消費しているはずです。

VBA

1Do While strFlname <> "" 2... 3Loop

の間でstrFlnameが""になることがないため、ループを抜け出せません。

投稿2020/07/12 13:24

sage

総合スコア1240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ice930

2020/07/15 10:37

原因が分かったことで、Exit forなどの使い方について学ぶきっかけになりました。 また、質問を上げて早くに回答いただきありがとうございました!
guest

0

ベストアンサー

Dir関数の注意点

こんなことがやりたいのかな?

ExcelVBA

1Sub test() 2 Dim sPath As String 3 Dim buf As String 4 Dim sFlg As String 5 Dim i As Long 6 Dim c As Range 7 8 sPath = ThisWorkbook.Path & "\テスト\" 9 10 For Each c In Range("A1:A4") 11 sFlg = "無し" 12 buf = Dir(sPath) 13 Do While Len(buf) > 0 14 i = InStr(buf, ".") 15 buf = Left(buf, i - 1) 16 If c.Value = buf Then 17 sFlg = "有り" 18 Exit Do 19 End If 20 buf = Dir() 21 Loop 22 c.Offset(, 1).Value = sFlg 23 Next 24End Sub

少し作業の流れがおかしいかも?
注目する点は一覧を順次見ていくのではなく、
「Dir関数で存在を確認する」
ということです。

ExcelVBA

1Sub test2() 2 Dim c As Range 3 4 For Each c In Range("A1:A4") 5 c.Offset(, 1).Value = IIf(Dir(ThisWorkbook.Path & "\テスト\" & c.Value & "*"), "有り", "無し") 6 Next 7End Sub

ステップインで実行し、
ローカルウィンドウで変数の中身が意図通りになっているか確認しながら、
デバッグしてみてください。

投稿2020/07/12 23:16

編集2020/07/12 23:19
mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ice930

2020/07/15 10:34

for each やLen など、初めて見る物がおおく大変勉強になりました。 実際に作成してみて、大部分がmattuwanさんのコードと同じになりましたのでベストアンサーとさせていただきました。 助かりました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問