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

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

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

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

Q&A

解決済

2回答

676閲覧

VBAでフォルダ階層を生成したい

d_96a

総合スコア15

VBA

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

0グッド

0クリップ

投稿2020/03/06 02:48

編集2020/03/09 08:38

###実現したいこと
B2セルに入力されたパスにB5以降のセル情報を基にフォルダ階層を自動生成するVBAを作成したい

###バージョン
VBA
Microsoft Visual Basic for Applications 7.1
Version 1068
VBA: Retail 7.1.1068

Excel
Excel2013

###コードの参照元
https://fastclassinfo.com/entry/makefolders/

###内容
下記コードだと、コンパイル時にThenや;の部分でエラーが発生してしまいます。
参照元のサイトに記載のあった拡張機能は追加しているのですが、エラーが消えません。
上記のバージョンだと使用できない構文が混ざっているためでしょうか。
VBAに関する知識が乏しく、調べても分からなかったため今回質問させていただきました。
こちらのエラーを解決できる方がいらっしゃれば、ご回答をよろしくお願いします。

###3/9追記
下記コードyureighostさんに修正していただきましたが、自分の環境だと実行時にエラーやメッセージは表示されずフォルダも生成されない状態で処理が終了してしまいます。
何度見返してもどこが間違っているのか自分では判断がつかないため、ご存知であればご教示のほどよろしくお願いします。

3/9再追記
セルに数式が入力されている状態だとうまくマクロが処理してくれないみたいで、数式を消すことでフォルダが正常に作成されました。

###コード

VBA

1Option Explicit 2Sub makefolder() 3 Dim i As Long, cmax As Long, x As Long, z As Long, cnt As Long, j As Long, k As Long 4 Dim ws1 As Worksheet 5 Dim str As String, url As String 6 Dim s As String, s1 As String 7 Dim n1 As Long 8 Dim fs As FileSystemObject 9 Set fs = New Scripting.FileSystemObject 10 Set ws1 = Worksheets("フォルダ作成") 11 cmax = ws1.Cells(Rows.Count, 1).End(xlUp).Row 12 cnt = ws1.Cells(4, Columns.Count).End(xlToLeft).Column 13 14 '[1] セルB2にURLが記載されているかチェック 15 If ws1.Range("B2").Value = "" Then 16 MsgBox "セルB2に「作成先のフォルダURL」を入力して下さい" 17 ws1.Range("B2").Activate 18 Exit Sub 19 End If 20 21 url = ws1.Range("B2").Value 22 23 '[2] 同じ行に複数回記入されていないことを確認 24 For i = 5 To cmax 25 x = 0 26 For j = 0 To cnt - 2 27 If ws1.Cells(i, 2).Offset(0, j).Value <> "" Then 28 x = x + 1 29 End If 30 Next 31 32 If x > 1 Then 33 z = z + 1 34 End If 35 Next 36 37 '[3] 同じ行に複数回記入されていた場合、処理を止める 38 If z > 0 Then 39 MsgBox "入力情報を見直してください" 40 Exit Sub 41 End If 42 43 '[4] 階層別にフォルダを作成する 44 For j = 0 To cnt - 2 45 For i = 5 To cmax 46 If ws1.Cells(i, 2).Offset(0, j).Value <> "" Then 47 s1 = ws1.Cells(i, 2).Offset(0, j).Value 48 49 For k = 0 To j 50 If k - j = 0 Then 51 Exit For 52 End If 53 n1 = ws1.Cells(i, 2).Offset(0, j - k - 1).End(xlUp).Row 54 s1 = ws1.Cells(n1, 2).Offset(0, j - k - 1).Value & "\" & s1 55 Next 56 57 s = url & "\" & s1 58 fs.CreateFolder s 59 End If 60 Next 61 Next 62 63 Set fs = Nothing 64End Sub 

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

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

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

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

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

guest

回答2

0

ベストアンサー

確かに記述が全然違いますね。
ただ<>のエスケープとかはHTMLの物なので
さすがに使われていたとは思えないですが。
とりあえず構文のおかしいところを修正すれば動作はしました。

VBA

1Option Explicit 2Sub makefolder() 3 Dim i As Long, cmax As Long, x As Long, z As Long, cnt As Long, j As Long, k As Long 4 Dim ws1 As Worksheet 5 Dim str As String, url As String 6 Dim s As String, s1 As String 7 Dim n1 As Long 8 Dim fs As FileSystemObject 9 Set fs = New Scripting.FileSystemObject 10 Set ws1 = Worksheets("フォルダ作成") 11 cmax = ws1.Cells(Rows.Count, 1).End(xlUp).Row 12 cnt = ws1.Cells(4, Columns.Count).End(xlToLeft).Column 13 14 '[1] セルB2にURLが記載されているかチェック 15 If ws1.Range("B2").Value = "" Then 16 MsgBox "セルB2に「作成先のフォルダURL」を入力して下さい" 17 ws1.Range("B2").Activate 18 Exit Sub 19 End If 20 21 url = ws1.Range("B2").Value 22 23 '[2] 同じ行に複数回記入されていないことを確認 24 For i = 5 To cmax 25 x = 0 26 For j = 0 To cnt - 2 27 If ws1.Cells(i, 2).Offset(0, j).Value <> "" Then 28 x = x + 1 29 End If 30 Next 31 32 If x > 1 Then 33 z = z + 1 34 End If 35 Next 36 37 '[3] 同じ行に複数回記入されていた場合、処理を止める 38 If z > 0 Then 39 MsgBox "入力情報を見直してください" 40 Exit Sub 41 End If 42 43 '[4] 階層別にフォルダを作成する 44 For j = 0 To cnt - 2 45 For i = 5 To cmax 46 If ws1.Cells(i, 2).Offset(0, j).Value <> "" Then 47 s1 = ws1.Cells(i, 2).Offset(0, j).Value 48 49 For k = 0 To j 50 If k - j = 0 Then 51 Exit For 52 End If 53 n1 = ws1.Cells(i, 2).Offset(0, j - k - 1).End(xlUp).Row 54 s1 = ws1.Cells(n1, 2).Offset(0, j - k - 1).Value & "\" & s1 55 Next 56 57 s = url & "\" & s1 58 fs.CreateFolder s 59 End If 60 Next 61 Next 62 63 Set fs = Nothing 64End Sub

投稿2020/03/06 03:32

yureighost

総合スコア2183

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

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

DreamTheater

2020/03/06 03:36

HTML化するときにしくじったのでしょうね。
d_96a

2020/03/06 04:22

コードを修正していただきありがとうございます。 ただ修正していただいたコードを実行した際フォルダが作成されることはありませんでした。 コンパイルエラーも発生しませんでした。 yureighostさんの環境ではフォルダが生成されたのでしょうか。
yureighost

2020/03/06 04:25

ちゃんとフォルダ作成されました。 使い方に関しては参考にされたサイトの説明の通りなので試してみてください。
d_96a

2020/03/06 05:21

ご回答ありがとうございます。 サイトの通りにしても、なぜか私の環境ではaaaのフォルダが作成された後何も起きませんでした。 もう少し色々触ってみようと思います。
guest

0

改めてコードを読みましたが、そもそも参考にされたサイトのコード自体がダメですね。。。
あれではコンパイル通りません。
If文の条件式に右辺がなかったり、不等号がHTMLエンコード文字だったり、、、

ちょっと解読に時間が掛かりそうで、本日中のフォローは難しそうです。(ごめんなさい)

投稿2020/03/06 02:54

編集2020/03/06 03:26
DreamTheater

総合スコア1095

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

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

d_96a

2020/03/06 03:30

なるほど、やはりif文の構文等がおかしかったのですね。 わざわざ見ていただかありがとうございます。 お時間ある時にご回答いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問