对不起,非描述性标题,我只是不知道如何描述我的目标。我是 VBA 的新手,还不了解事情的真正运作方式。
我编写了一个函数,它从用户那里获取一个目录,并显示目录中第一个文件的数据。现在,我想添加一个“下一步”按钮。当按下“下一步”按钮时,我的代码应该显示目录中下一个文件的数据。
我尝试使用全局变量,但每次按下按钮时它们似乎都会被初始化。实现我的目标的最佳方式是什么?我是否必须将电子表格用作内存并从那里写入和读取所有内容?还是 Excel VBA 有其他一些“实时记忆”机制?
谢谢,李
单击按钮时,全局变量通常不会重新初始化。如果您重新编译您的 VBA 项目,它们将被重新初始化。因此,在调试时,您可能会看到一个全局被重新初始化。
您可以将电子表格用作内存。一种方法是创建一个工作表,将其 Visibility 属性设置为 xlSheetVeryHidden(您可以从 VBA 项目中执行此操作)。此工作表对用户不可见,因此您的 VBA 应用程序可以使用它来存储数据。
这可以通过多种方式解决,就像我猜的任何问题一样!
您可以将问题分解为两个子例程:
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 项目被重置或者通过过程或即时窗口专门初始化它们时,它们才会重新初始化。