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

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

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

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

Q&A

解決済

3回答

1980閲覧

for each と FileSystemObject の組み合わせ

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2020/08/13 12:13

for each の使い方を覚えようと思い、以下のコードを作成しましたが、「型が一致しません」と表示されます。
サブフォルダーをセルに記載しているので、型をstringに変えるなど試しましたが、バリアント型、もしくはオブジェクト型しか利用できないと表示されます。

Sub ステータス確認(sename) Dim path As String Dim fso As Object Dim k As Object path = ThisWorkbook.path & "\" & "写真格納ファイル" & "\" & sename & "\" Set fso = CreateObject("Scripting.FileSystemObject") For Each k In fso.Getfolder(path).SubFolders Dim i As String Cells(i, 1) = k i = i + 1 Next End Sub

改善方法や根本的に間違いがありましたらアドバイスをお願いします。
よろしくお願いします。

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

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

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

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

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

meg_

2020/08/13 12:16

>「型が一致しません」と表示されます。 どの行でエラーが発生するのでしょうか?
dodox86

2020/08/13 12:37

> Dim i As String > Cells(i, 1) = k > i = i + 1 なぜ、Stringなのか。
ice930

2020/08/13 13:34

失礼しました・・・。 エラーが起きるのは「Cells(i, 1) = k」のところです。 ※ちなみにstringではなくLongでエラーが表示されます。 オブジェクトはセルに入力できないのでしょうか
guest

回答3

0

ベストアンサー

ExcelVBA

1Option Explicit 2 3'FileSystemObjectの参照設定を行うこと 4 5Sub test() 6 ステータス確認 "サンプル" 7End Sub 8 9 10Sub ステータス確認(ByVal seName As String) 11 Dim FSO As Scripting.FileSystemObject 12 Set FSO = New Scripting.FileSystemObject 13 seName = ThisWorkbook.path & "\" & seName 14 If FSO.FolderExists(seName) = False Then Exit Sub 15 16 Dim o As Folder 17 Dim i As Long 18 For Each o In FSO.Getfolder(seName).SubFolders 19 Let i = i + 1 20 Cells(i, 1).Value = o.path 21 Next 22End Sub

参考>>
FileSystemObjectの参照設定を行う

注意点
1)シートの0行目はないので、必ず行番号に使う変数は何か代入してから、
セルを指定する。

2)ループの中で変数を宣言しない。
1度すればいいことを何度もするのは無駄。
ループの回数が多いと処理速度にも影響するかも?

3)なんとなーくでコードを書かない
Cells(i, 1)
とか
= k
とか、
Dim k As Object
とか
Sub ステータス確認(sename)
とか、

つまりたまたま上手く行ったが意味が解ってないままだと、
応用が利きにくいです。
省略が許されているので、書かないというのもありだけど、
自分の意図をコードにはっきり書くことをお勧めします。
現状、「こういう時はこう書く」と単に暗記されているように
見受けました。

例えば、
>Cells(i, 1).Value = o.path
フォルダー「O」のパスをセルの値に設定

そうすれば、変数の型がなんでないといけないかも、
イメージしやすいかと思います。

4)ユーザーにVBEの画面を見させないよう注意する
FSO.Getfolder(seName)
変数に存在しないフォルダーのパスを指定した場合エラーになります。
勝手にフォルダーを削除された、
無意識にフォルダーを移動した等

If FSO.FolderExists(seName) = False Then Exit Sub
と、最初に存在確認をしたら、エラーを回避できます。

FileSystemObjectオブジェクト - FolderExistsメソッド

あと、ステップインで実行しながら、
ローカルウィンドウで変数にどんな値が入っているか、
確認してください。
オブジェクト型の変数は情報が折りたたまれているので、
変数名の前の「+」をクリックして展開してみてください。
「オブジェクト」というもののイメージがわかるかも知れません。
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う

投稿2020/08/13 23:59

mattuwan

総合スコア2163

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

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

hatena19

2020/08/14 05:52 編集

おおむね同感ですが、 > 2)ループの中で変数を宣言しない。 > 1度すればいいことを何度もするのは無駄。 ループの中に記述しても、宣言は1回だけしたことになります。 どこに記述しても一番最初に1回評価されます。 VBA 変数宣言はIfやFor等のコードブロック中に書いても機能する - t-hom’s diary https://thom.hateblo.jp/entry/2018/06/02/185716
mattuwan

2020/08/14 05:41

あ、情報の訂正ありがとうございます。
ice930

2020/08/14 11:35

ご指摘の通り丸暗記している部分が多かった様に思います。 変数の変化などを確認しながら学習していきたいと思います。 ありがとうございました!
guest

0

Option Explicit
Sub ステータス確認(sename)
Dim path As String
Dim fso As Object 'Scripting.FileSystemObject
Dim k As Object 'Scripting.Folder

path = ThisWorkbook.Path & "" & "写真格納ファイル" & "" & sename & ""
Set fso = CreateObject("Scripting.FileSystemObject")

For Each k In fso.Getfolder(path).SubFolders

Dim i As Long
Cells(i, 1) = k.Name
i = i + 1

Next
End Sub

投稿2020/08/13 15:06

iruyas

総合スコア1067

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

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

0

vba

1Sub ステータス確認() 2 Dim path As String 3 Dim FSO As Object 4 Dim k As Object 5 6 path = ThisWorkbook.path & "\" & "写真格納ファイル" & "\" & sename & "\" 7 Set FSO = CreateObject("Scripting.FileSystemObject") 8 9 For Each k In FSO.GetFolder(path).SubFolders 10 11 Dim i As Long ' Longに修正 12 i = i + 1 ' こちらに移動 13 Cells(i, 1) = k '=k.path ファイル名だけなら k.Name 14 Next 15End Sub

投稿2020/08/13 12:42

編集2020/08/14 00:50
hatena19

総合スコア34075

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問