[[20200827125703]] 『フォルダを作成する方法』(まりも) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フォルダを作成する方法』(まりも)

あるサイトで見つけたマクロを使いたいんですがエラーがでて上手くいきません
教えてください

フォルダを階層別に作成するマクロです

フォルダパス:B10〜K10までセル結合
階層:見出しは12行目、B13から
エラー:fs.CreateFolder s
    実行時エラー76 パスが見つかりません    

 Sub 作成_Click()

    Dim i As Long, cmax As Long, x As Long, z As Long, cnt As Long, j As Long, k As Long
    Dim ws1 As Worksheet
    Dim str As String, url As String
    Dim s As String, s1 As String
    Dim n1 As Long
    Dim fs As FileSystemObject
    Set fs = New Scripting.FileSystemObject
    Set ws1 = Worksheets("フォルダ作成")
    cmax = ws1.Cells(Rows.Count, 1).End(xlUp).Row
    cnt = ws1.Cells(12, Columns.Count).End(xlToLeft).Column

    '[1] セルB10にURLが記載されているかチェック
    If ws1.Range("B10").Value = "" Then
        MsgBox "セルB10に「作成先のフォルダURL」を入力して下さい"
        ws1.Range("B10").Activate
        Exit Sub
    End If

    url = ws1.Range("B10").Value

    '[2] 同じ行に複数回記入されていないことを確認
    For i = 13 To cmax
        x = 0
        For j = 0 To cnt - 2
            If ws1.Cells(i, 2).Offset(0, j).Value <> "" Then
                x = x + 1
            End If
        Next

        If x > 1 Then
            z = z + 1
        End If
    Next

    '[3] 同じ行に複数回記入されていた場合、処理を止める
    If z > 0 Then
        MsgBox "入力情報を見直してください"
        Exit Sub
    End If

    '[4] 階層別にフォルダを作成する
    For j = 0 To cnt - 2
        For i = 13 To cmax
            If ws1.Cells(i, 2).Offset(0, j).Value <> "" Then
                s1 = ws1.Cells(i, 2).Offset(0, j).Value

                For k = 0 To j
                    If k - j = 0 Then
                        Exit For
                    End If
                    n1 = ws1.Cells(i, 2).Offset(0, j - k - 1).End(xlUp).Row
                    s1 = ws1.Cells(n1, 2).Offset(0, j - k - 1).Value & "\" & s1
                Next

                s = url & "\" & s1
                fs.CreateFolder s
            End If
        Next
    Next

    Set fs = Nothing
End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 単純に s のパスが存在してないんじゃないですか?
 その行の手前に
 debug.print s
 stop
 と記述して、イミディエイトウィンドウに想定した値が表示されているか確認してください。
http://officetanaka.net/excel/vba/error/execution_error/error_76.htm
(稲葉) 2020/08/27(木) 13:51

教えてください
パスにはフォルダを作りたい場所(おおおの中に作りたい)のパスにしました
\\hp-server\あああ\いいい\ううう\えええ\おおお

作りたいフォルダが5個(AA、BB、CC、DD、EE)だとすると
イミディエイトウィンドウは

\\hp-server\あああ\いいい\ううう\えええ\おおお
\\hp-server\あああ\いいい\ううう\えええ\おおお¥AA
\\hp-server\あああ\いいい\ううう\えええ\おおお¥BB
\\hp-server\あああ\いいい\ううう\えええ\おおお¥CC

でエラーとなります

フォルダはAAとBBだけできました

沢山のフォルダを作らないといけないので使えるようになると嬉しいです

(まりも) 2020/08/27(木) 14:43


 横から失礼します。

 パスに使えない文字が含まれてないか確認してみてください。
 あと、パスの文字数制限に引っ掛かってないかもご確認ください。
(OK) 2020/08/27(木) 14:51

全角の\なんですか?
(γ) 2020/08/27(木) 15:05

>パスに使えない文字が含まれてないか確認してみてください。
>あと、パスの文字数制限に引っ掛かってないかもご確認ください。

フォルダ一覧で取得したフォルダ名を別のフォルダに作成しているので
使えない文字や文字数制限ではないのかなと思います

>全角の\なんですか?

半角のまちがいです
すいません

\\hp-server\あああ\いいい\ううう\えええ\おおお
\\hp-server\あああ\いいい\ううう\えええ\おおお\AA
\\hp-server\あああ\いいい\ううう\えええ\おおお\BB
\\hp-server\あああ\いいい\ううう\えええ\おおお\CC

(まりも) 2020/08/27(木) 15:48


 >使えない文字や文字数制限ではないのかなと思います
 思いますじゃなくて確認してくれませんか?
 正確なデータを提示してくれないんじゃこっちではどうにもならない

http://tanaka-misaki.blogspot.com/2012/02/excel-vba.html

 ファイル名に使えない文字をチェックするコードが転がってるから、簡単にできるでしょう?

(稲葉) 2020/08/27(木) 16:36


 このコードってB列以外見てないと思うけど余分なところ多くない?

 >If x > 1 Then
 これだと、B列以外全部不要だし

 >   For j = 0 To cnt - 2
 >                For k = 0 To j
 >                   If k - j = 0 Then
 >                       Exit For
 こっちもjもkも0からスタートだから、必ずexit forですよね?

(稲葉) 2020/08/27(木) 17:57


https://www.fastclassinfo.com/entry/makefolders
 元ネタ見つけた
 そのまま使ってみはどうですか?

(稲葉) 2020/08/27(木) 18:06


 新しく作ったので、こちらで試してもらえますか?
    Sub フォルダ作成()
        Dim ws     As Worksheet
        Dim fp     As String '----最初のフォルダ名
        Dim w      As Variant '---階層フォルダ名を格納する配列
        Dim buf    As String '----行ごとの階層フォルダ名をつなげる
        Dim isMake As Boolean '---フォルダを作成したかどうか
        Dim msg    As String '----作成したフォルダのパスを保管する
        Dim r      As Long '------配列の行方向のループ
        Dim c      As Long '------配列の列方向のループ
        Dim re     As Object '----正規表現
        Set re = CreateObject("VBScript.REGExp")
        With re
            .Pattern = "[\\/:*?""<>|\[\]]"
            .Global = True
        End With
        Set ws = Sheets("フォルダ作成")
        fp = ws.Range("B10").Value '------------------------------------------最初のフォルダ名の指定
        If fp <> "" Then
            fp = fp & IIf(Right(fp, 1) = "\", "", "\")
            w = ws.Range("F13", ws.Cells(Rows.Count, "B").End(xlUp)).Value '--階層を増やしたいときは、F列をZ列方向に増やす
            For r = 1 To UBound(w, 1)
                buf = ""
                isMake = False
                For c = 1 To UBound(w, 2)
                    If w(r, c) <> "" Then
                        If Not re.test(w(r, c)) Then '------------------------不正なフォルダ名チェック
                            buf = buf & "\" & w(r, c)
                            If Dir(fp & Mid(buf, 2), vbDirectory) = "" Then  'フォルダの有無チェック
                                MkDir fp & Mid(buf, 2) '----------------------フォルダの作成
                                isMake = True
                            End If
                        Else
                            msg = msg & vbCrLf & "不正なフォルダ名:" & w(r, c) & vbCrLf
                            isMake = False
                            Exit For
                        End If
                    Else
                        Exit For '--------------------------------------------列(階層)が空白だったら、次の行に抜ける
                    End If
                Next c
                If isMake Then msg = msg & vbCrLf & Mid(buf, 2)
            Next r
            If msg <> "" Then
                MsgBox "以下のフォルダを作成or失敗しました" & vbCrLf & msg
            Else
                MsgBox "フォルダは作成されませんでした。"
            End If
        Else
            MsgBox "B10にフォルダのパスを指定してください"
        End If
        Set re = Nothing
        '     |[A]   |[B]    |[C]    |[D]    |[E]    |[F]
        ' [10]|      |C:\test|       |       |       |
        ' [11]|      |       |       |       |       |
        ' [12]|      |1階層目|2階層目|3階層目|4階層目|5階層目
        ' [13]|1件目 |AB     |100番〜|       |       |
        ' [14]|2件目 |AB     |200番〜|       |       |
        ' [15]|3件目 |err/   |       |       |       |
        ' [16]|4件目 |CD     |EF     |GH     |       |
        ' [17]|5件目 |       |       |       |       |
        ' [18]|6件目 |       |       |       |       |
        ' [19]|7件目 |       |       |       |       |
        ' [20]|8件目 |       |       |       |       |
        ' [21]|9件目 |       |       |       |       |
        ' [22]|10件目|       |       |       |       |
    End Sub

(稲葉) 2020/08/27(木) 18:57


掲示板の趣旨とは違うんでしょうけど、
  ____A_____________B_________________
 1  \\hp-server\あああ\いいい\ううう\えええ\おおお
 2
 3   AA        ="md "&$A$1&"\"&A3
 4   BB        ↓必要なだけ(フィル)コピー
 5   CC       
 6   DD
 7   EE
 8
 9

コードで悩むより↑のような感じで、整理しておいてから、

 (1)B3〜をコピーする
 (2)メモ帳に貼り付ける
 (3)"テキトー.bat"という名前でデスクトップに保存する
 (4)デスクトップに作成された"テキトー.bat"をダブルクリックする

ということをやった方がよくないでしょうか?
(パスに日本語が含まれる場合、場合によっては文字コードでトラブルかもですが・・)

(もこな2 ) 2020/08/27(木) 19:02


 エラーの中身調べたら、やっぱり階層を飛ばして作ろうとしてないですかね?
 s = "b\a" の時、パスがありませんのエラーだったので、CCというフォルダあたりに、\マークを含んだ文字列が含まれていると思いますよ。
    Sub aaa()
        Dim a As Object
        Dim s As String
        Dim msg As String
        With CreateObject("Scripting.FilesyStemObject")
            On Error Resume Next
                .Delete "C:\a"

                s = "a": .CreateFolder "C:\" & s
                msg = s & ":" & Err.Description & vbCrLf

                s = "a": .CreateFolder "C:\" & s
                msg = s & ":" & Err.Description & vbCrLf

                s = "<>": .CreateFolder "C:\" & s
                msg = msg & s & ":" & Err.Description & vbCrLf

                s = "b\a": .CreateFolder "C:\" & s
                msg = msg & s & ":" & Err.Description & vbCrLf
            On Error GoTo 0
        End With
        MsgBox msg
    End Sub

(稲葉) 2020/08/27(木) 19:28


フォルダ作成にAPIを使う手もあります。 深い階層を指定すると、自動的に途中の階層も作ってしまう。
 Private Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" ( _
    ByVal hwnd As Long, ByVal pszPath As String, ByVal psa As Long) As Long

 Sub test()
    Call SHCreateDirectoryEx(0&, "\\hp-server\あああ\いいい\ううう\えええ\おおお\AA", 0&)
 End Sub

エラーを拾いたい場合はCallではなく、変数で受けてください。 既にあるか、作成失敗かを判定できます。
(???) 2020/08/28(金) 10:22


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.