[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォルダを作成する方法』(まりも)
あるサイトで見つけたマクロを使いたいんですがエラーがでて上手くいきません
教えてください
フォルダを階層別に作成するマクロです
フォルダパス: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
作りたいフォルダが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
フォルダ一覧で取得したフォルダ名を別のフォルダに作成しているので
使えない文字や文字数制限ではないのかなと思います
>全角の\なんですか?
半角のまちがいです
すいません
\\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
元ネタ見つけた そのまま使ってみはどうですか?
(稲葉) 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
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.