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

问题描述 投票:0回答:2

我在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

任何想法为什么会这样?

vba excel-vba excel
2个回答
1
投票

当然,一旦停止宏,就没有任何变量值的持久性

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

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

2)Dir(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

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
© www.soinside.com 2019 - 2024. All rights reserved.