对于非描述性标题感到抱歉,我只是不知道如何描述我的目标。 我是VBA的新手,还不了解事情是如何运作的。
我编写了一个从用户获取目录的函数,并显示目录中第一个文件的数据。现在,我想添加一个“下一步”按钮。 按下“下一步”按钮时,我的代码应显示目录中下一个文件的数据。
我尝试使用全局变量但是每次按下按钮时它们似乎都会被初始化。 实现目标的最佳方法是什么?我是否必须将电子表格用作内存并从那里写入和读取所有内容?或者Excel VBA还有其他“实时记忆”机制吗?
谢谢, 李
答案 0 :(得分:4)
单击按钮时,通常不会重新初始化全局。如果重新编译VBA项目,它们将重新初始化。因此,在调试时,您可能会看到全局重新初始化。
您可以将电子表格用作内存。一种方法是将工作表的Visibility属性设置为xlSheetVeryHidden(您可以从VBA项目执行此操作)。用户无法看到此工作表,因此您的VBA应用程序可以使用它来存储数据。
答案 1 :(得分:1)
这可以通过很多方式来解决,我猜是有任何问题!
您可以将问题分解为两个子程序:
1)检索所选目录中的所有文件名并显示第一个文件的数据
2)如果它不是最后一个文件,请获取下一个文件的数据并显示
您可以使用全局变量来存储文件名和索引,以记住您在文件名集合中的位置。
Global filenames As Collection
Global fileIndex As Integer
Public Sub GetFilenames()
Dim selectedDirectory As String
Dim currentFile As String
selectedDirectory = "selected\directory\"
currentFile = Dir$(selectedDirectory)
Set filenames = New Collection
While currentFile <> ""
filenames.Add selectedDirectory & currentFile
currentFile = Dir$()
Wend
' Make sure there were files
If filenames.Count >= 1 Then
fileIndex = 1
' Call a method to display data
DisplayData(filenames(fileIndex))
Else
' No files
End If
End Sub
Public Sub GetNextFile()
' Make sure we have a filenames object
If Not filenames Is Nothing Then
If fileIndex < filenames.Count Then
fileIndex = fileIndex + 1
' Call the display method again
DisplayData(filenames(fileIndex))
Else
' Decide what to do after reaching the final file
End If
Else
' No filenames
End If
End Sub
我没有包含DisplayData程序,因为我不确定你正在抓取什么类型的文件或者你正在使用它们做什么但是如果说excel文件可能是这样的话:
Public Function DisplayData(filename As String)
Dim displayWb As Workbook
Set displayWb = Workbooks.Open(filename)
' Do things with displayWb
End Function
然后,您可以将按钮的宏设置为“GetNextFile”,并在每次单击后循环浏览文件。至于全局变量的生命周期,它们只在重置VBA项目或通过过程或即时窗口专门初始化时重新初始化。
答案 2 :(得分:0)