Excel VBA检查目录是否存在错误

Excel VBA检查目录是否存在错误,excel,vba,file,directory,Excel,Vba,File,Directory,我有一个电子表格,点击一个按钮就会复制自己,将所有内容复制/粘贴到一个新的工作簿,并用一个依赖于某些变量值(取自电子表格上的单元格)的名称保存文件。 我当前的目标是让它根据客户端名称(变量中保存的单元格值)的名称将工作表保存在不同的文件夹中,虽然这在第一次运行时起作用,但之后我会收到一个错误 代码检查目录是否存在,如果不存在,则创建它。 这是可行的,但创建后,再次运行会抛出错误: 运行时错误75-路径/文件访问错误 我的代码: Sub Pastefile() Dim client As Str

我有一个电子表格,点击一个按钮就会复制自己,将所有内容复制/粘贴到一个新的工作簿,并用一个依赖于某些变量值(取自电子表格上的单元格)的名称保存文件。 我当前的目标是让它根据客户端名称(变量中保存的单元格值)的名称将工作表保存在不同的文件夹中,虽然这在第一次运行时起作用,但之后我会收到一个错误

代码检查目录是否存在,如果不存在,则创建它。 这是可行的,但创建后,再次运行会抛出错误:

运行时错误75-路径/文件访问错误

我的代码:

Sub Pastefile()

Dim client As String
Dim site As String
Dim screeningdate As Date
screeningdate = Range("b7").Value
Dim screeningdate_text As String
screeningdate_text = Format$(screeningdate, "yyyy\-mm\-dd")
client = Range("B3").Value
site = Range("B23").Value

Dim SrceFile
Dim DestFile

If Dir("C:\2013 Recieved Schedules" & "\" & client) = Empty Then
    MkDir "C:\2013 Recieved Schedules" & "\" & client
End If

SrceFile = "C:\2013 Recieved Schedules\schedule template.xlsx"
DestFile = "C:\2013 Recieved Schedules\" & client & "\" & client & " " & site & " " & screeningdate_text & ".xlsx"

FileCopy SrceFile, DestFile

Range("A1:I37").Select
Selection.Copy
Workbooks.Open Filename:= _
    "C:\2013 Recieved Schedules\" & client & "\" & client & " " & site & " " & screeningdate_text & ".xlsx", UpdateLinks:= _
    0
Range("A1:I37").PasteSpecial Paste:=xlPasteValues
Range("C6").Select
Application.CutCopyMode = False
ActiveWorkbook.Save
ActiveWindow.Close

End Sub
你得原谅我在这方面缺乏知识,我还在学习。
我有一种强烈的感觉,它与目录检查逻辑有关,因为当抛出错误时,
MkDir
行突出显示。

要使用
Dir
检查目录是否存在,您需要指定
vbDirectory
作为第二个参数,例如:

If Dir("C:\2013 Recieved Schedules" & "\" & client, vbDirectory) = "" Then
请注意,对于
vbDirectory
Dir
将返回一个非空字符串,前提是指定的路径已作为目录或文件存在(前提是该文件没有任何只读、隐藏或系统属性)。您可以使用
GetAttr
确定它是一个目录而不是一个文件。

确定存在一个文件夹(而不是一个文件),我使用此功能:

If Len(Dir(ThisWorkbook.Path & "\YOUR_DIRECTORY", vbDirectory)) = 0 Then
   MkDir ThisWorkbook.Path & "\YOUR_DIRECTORY"
End If
Public Function FolderExists(strFolderPath As String) As Boolean
    On Error Resume Next
    FolderExists = ((GetAttr(strFolderPath) And vbDirectory) = vbDirectory)
    On Error GoTo 0
End Function

它同时工作,末尾有
\
,没有。

使用
脚本
对象的
FolderExists
方法

Public Function dirExists(s_directory As String) As Boolean
    Dim oFSO As Object
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    dirExists = oFSO.FolderExists(s_directory)
End Function

您可以将WB\U parentfolder替换为类似“C:\”的内容。对于我来说,WB_parentfolder正在获取当前工作簿的位置。 file_des_folder是我想要的新文件夹。这将完成并创建所需的任意多个文件夹

        folder1 = Left(file_des_folder, InStr(Len(WB_parentfolder) + 1, file_loc, "\"))
        Do While folder1 <> file_des_folder
            folder1 = Left(file_des_folder, InStr(Len(folder1) + 1, file_loc, "\"))
            If Dir(file_des_folder, vbDirectory) = "" Then      'create folder if there is not one
                MkDir folder1
            End If
        Loop
folder1=Left(文件文件夹,InStr(Len(WB\u parentfolder)+1,文件位置,“\”)
Do While folder1文件\u des\u文件夹
folder1=Left(文件夹文件,仪表(Len(folder1)+1,文件位置,“\”)
如果Dir(file_des_folder,vbDirectory)=“”,则“如果没有文件夹,则创建文件夹”
MkDir文件夹1
如果结束
环
我最终使用了:

Function DirectoryExists(Directory As String) As Boolean
    DirectoryExists = False
    If Len(Dir(Directory, vbDirectory)) > 0 Then
        If (GetAttr(Directory) And vbDirectory) = vbDirectory Then
            DirectoryExists = True
        End If
    End If
End Function

这是@Brian和@ZygD答案的混合。我认为@Brian的答案是不够的,并且不喜欢@ZygD的答案中使用的“下一步错误恢复上的
,这是最干净的方式。。。到目前为止:

Public Function IsDir(s) As Boolean
    IsDir = CreateObject("Scripting.FileSystemObject").FolderExists(s)
End Function

尝试检查长度为零的字符串(即“”),而不是空字符串。如果未找到任何内容,Dir将返回长度为零的字符串。所以不要用空的,用“”代替。嗨,伙计们,谢谢你们的建议,我已经把它改成了“”,我从来不知道它检查了零长度字符串。虽然我将在未来的最佳实践中使用它,但它并没有解决这个问题。还有什么建议吗?嗨,布莱恩,非常感谢你的帮助。我认为这是一个比较非价值的逻辑问题。我很感激:)当路径是(仅)网络共享时失败(=返回“”),例如“\\myServer\myShare”。当路径包含unicode字符时失败(=返回“”)。但ozmike的解决方案是可行的。您能解释一下代码的第三行吗?如何评估此函数?@wotter-您可以使用
Err.Number
Err.Description
自己检查它。我能得到3号和53号。我认为有几个错误代码正是我选择不为不同错误号指定
If
条件的原因。基本上,只有一种情况下你会感到高兴——当你提供一个合适的目录地址字符串时,这个地址显然是你在函数导致一个可能不正确的
False
时要检查的东西。看起来更优雅。@ZygD事实上,我想知道当出现错误时,您是否得到了一个错误。我的理解是,在这种情况下,FolderExists=没有被执行,所以它可能有一个不是真是假的值,也许?!(我这样问是因为我的布尔值有一个未定义的值)。所以我建议将FolderExists初始化为False。我明白你的意思。这是值得考虑的。就我的测试而言,即使使用错误和正确的路径启动,我也会得到错误的结果,反之亦然。显然,函数最初以假值开始,每次调用时都会重新初始化。我不喜欢这种诉诸错误的逻辑,但在当时它似乎是最好的选择。最干净,最有效的方法!真是太好了!看起来这是一个非常一致的方法。对于那些采用最佳实践使用
Option Explicit
的人,我只会为他们添加
Dim of so As Object
,对于那些好奇的
Dir(Directory,vbDirectory)
returns.“。当
Directory
为空时,这是有效的@KalenGi这意味着当前目录存在,其中的第一个文件是“.”(请参阅MS-DOS目录列表)。当传递
“//”
时,此文件将挂起。这个答案是最好的: