文件名在多个会话中的Dir()函数中保持不变

时间:2018-02-27 23:08:29

标签: 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)
    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

我在事件处理程序中添加了字符串a来尝试调试代码,并向我展示了一些有趣的结果:

我在BtnUpdate_Click中的if语句上有一个断点。

File path is selected

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

File path is blank

为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

当然,一旦停止宏

,就没有任何变量值的持久性

虽然观察到的行为是由于以下原因:

1)FileDialog对象保留在IntialFileName属性

中选择的最后一个路径

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

所以当你重新运行宏时:

  • NewDataFilePath是一个空字符串

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

以上是您问题的答案

虽然您可以考虑以下代码的“细微差别”:

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

答案 1 :(得分:0)

试试此代码

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