我在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语句上有一个断点。
然后我停止调试宏并重新运行它。如果我调用BtnUpdate_Click而不选择另一个文件,则Dir()函数似乎保留最后一个文件名:
为什么会发生这种情况的任何想法?
答案 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