Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 文件名在多个会话中显示在Dir()函数中_Vba_Excel - Fatal编程技术网

Vba 文件名在多个会话中显示在Dir()函数中

Vba 文件名在多个会话中显示在Dir()函数中,vba,excel,Vba,Excel,我在Excel VBA宏中有一些代码,它看起来像是会话之间的持久值。问题在于BtnUpdate_Click事件,即使NewDataFilePath中的文件路径无效,消息框也不会触发 Public NewDataFilePath As String Private Sub BtnFileBrowse_Click() Dim fdlg As FileDialog Set fdlg = Application.FileDialog(msoFileDialogOpen) fdl

我在Excel VBA宏中有一些代码,它看起来像是会话之间的持久值。问题在于BtnUpdate_Click事件,即使NewDataFilePath中的文件路径无效,消息框也不会触发

Public NewDataFilePath As String

Private Sub BtnFileBrowse_Click()
    Dim fdlg As FileDialog
    Set fdlg = Application.FileDialog(msoFileDialogOpen)
    fdlg.Title = "Select New Dataset"
    fdlg.Filters.Clear
    fdlg.Filters.Add "Excel Files Only", "*.xls; *.xlsx"
    fdlg.Show

    If fdlg.SelectedItems.Count <> 0 Then
        TxtFilePath = fdlg.SelectedItems(1)
    End If
    NewDataFilePath = TxtFilePath.Text

End Sub

Private Sub BtnUpdate_Click()
    Dim a As String
    a = Dir(NewDataFilePath)

    If Not Dir(NewDataFilePath) <> "" Then
        MsgBox """ & NewDataFilePath & "" is not a valid file path"
    End If

End Sub
Public NewDataFilePath作为字符串
专用子BtnFileBrowse_Click()
将fdlg设置为文件对话框
设置fdlg=Application.FileDialog(msoFileDialogOpen)
fdlg.Title=“选择新数据集”
fdlg.Filters.Clear
fdlg.Filters.Add“仅Excel文件”,“*.xls;*.xlsx”
秀
如果fdlg.SelectedItems.Count为0,则
TxtFilePath=fdlg.SelectedItems(1)
如果结束
NewDataFilePath=TxtFilePath.Text
端接头
私有子BtnUpdate_Click()
像线一样变暗
a=Dir(NewDataFilePath)
如果不是Dir(NewDataFilePath)”,则
MsgBox“&NewDataFilePath&”不是有效的文件路径
如果结束
端接头
我在事件处理程序中添加了字符串a以尝试调试代码,并向我显示了一些有趣的结果:

我在BtnUpdate\u Click中的if语句上有一个断点

然后我停止调试宏并重新运行它。如果调用BtnUpdate\单击而不选择其他文件,则Dir()函数似乎会保留最后一个文件名:

知道为什么会发生这种情况吗?

试试这段代码

Public NewDataFilePath As String

Private Sub BtnFileBrowse_Click()
Dim fdlg As FileDialog

Set fdlg = Application.FileDialog(msoFileDialogOpen)
fdlg.Title = "Select New Dataset"
fdlg.Filters.Clear
fdlg.Filters.Add "Excel Files Only", "*.xls; *.xlsx"
fdlg.Show

If fdlg.SelectedItems.Count <> 0 Then
    NewDataFilePath = fdlg.SelectedItems(1)
End If
End Sub

Private Sub BtnUpdate_Click()
Dim a As String

a = Dir(NewDataFilePath)

If DoesFileExist(NewDataFilePath) And NewDataFilePath <> "" Then
    MsgBox NewDataFilePath & " is a valid file path"
Else
    MsgBox NewDataFilePath & " NOT a valid file path"
End If
End Sub

Function DoesFileExist(filePath) As Boolean
DoesFileExist = Dir(filePath) <> ""
End Function
Public NewDataFilePath作为字符串
专用子BtnFileBrowse_Click()
将fdlg设置为文件对话框
设置fdlg=Application.FileDialog(msoFileDialogOpen)
fdlg.Title=“选择新数据集”
fdlg.Filters.Clear
fdlg.Filters.Add“仅Excel文件”,“*.xls;*.xlsx”
秀
如果fdlg.SelectedItems.Count为0,则
NewDataFilePath=fdlg.SelectedItems(1)
如果结束
端接头
私有子BtnUpdate_Click()
像线一样变暗
a=Dir(NewDataFilePath)
如果DoesFile存在(NewDataFilePath)和NewDataFilePath“”,则
MsgBox NewDataFilePath&“是有效的文件路径”
其他的
MsgBox NewDataFilePath&“不是有效的文件路径”
如果结束
端接头
函数DoesFileExist(filePath)为布尔值
DoesFileExist=Dir(文件路径)“”
端函数

当然,一旦停止宏,任何变量值都不会持久存在

而观察到的行为是由于以下原因造成的:

1)
FileDialog
对象保留在其
IntialFileName
属性中选择的最后一条路径

2)
Dir(path)
函数使用一个空字符串作为“path”,将返回上次
FileDialog
run存储的
IntialFileName
路径中的第一个文件

因此,当您重新运行宏时:

  • NewDataFilePath
    是一个空字符串

  • a=Dir(NewDataFilePath)
    ,将返回
    IntialFileName
    路径中与筛选器匹配的第一个文件(如果有)

你的问题的答案是什么

<> p>您可以考虑以下代码的“细微差别”:

Private Sub BtnUpdate_Click()
    If NewDataFilePath <> "" Then 'if 'NewDataFilePath' has been set
        Dim a As String
        a = Dir(NewDataFilePath)

        If Not Dir(NewDataFilePath) <> "" Then  MsgBox """ & NewDataFilePath & "" is not a valid file path"

    Else 'otherwise
            MsgBox "No file path specified!", vbCritical ' inform the user to do so
    End If
End Sub
Private Sub BtnUpdate_Click()
如果设置了“NewDataFilePath”,则为“NewDataFilePath”
像线一样变暗
a=Dir(NewDataFilePath)
如果不是Dir(NewDataFilePath)”,则MsgBox“&NewDataFilePath&”不是有效的文件路径
否则
MsgBox“未指定文件路径!”,vbCritical“通知用户执行此操作”
如果结束
端接头

是否使用全局变量?是否使用常量?@K.Dᴀᴠɪ我在宏中只有上面的代码,我使用的是“Public NewDataFilePath As String”,但根据屏幕截图,当我重新运行宏时,其中的值不会持久。我认为您缺少路径(来自您发布的调试屏幕截图)。一个文件名是不够的,你不能在没有路径的文件名上调用Dir函数。。。如果您的意思是单击VBA工具栏上的“停止”按钮,则将清除公共变量。