0

对不起,非描述性标题,我只是不知道如何描述我的目标。我是 VBA 的新手,还不了解事情的真正运作方式。

我编写了一个函数,它从用户那里获取一个目录,并显示目录中第一个文件的数据。现在,我想添加一个“下一步”按钮。当按下“下一步”按钮时,我的代码应该显示目录中下一个文件的数据。

我尝试使用全局变量,但每次按下按钮时它们似乎都会被初始化。实现我的目标的最佳方式是什么?我是否必须将电子表格用作内存并从那里写入和读取所有内容?还是 Excel VBA 有其他一些“实时记忆”机制?

谢谢,李

4

3 回答 3

4

单击按钮时,全局变量通常不会重新初始化。如果您重新编译您的 VBA 项目,它们将被重新初始化。因此,在调试时,您可能会看到一个全局被重新初始化。

您可以将电子表格用作内存。一种方法是创建一个工作表,将其 Visibility 属性设置为 xlSheetVeryHidden(您可以从 VBA 项目中执行此操作)。此工作表对用户不可见,因此您的 VBA 应用程序可以使用它来存储数据。

于 2013-10-27T13:52:47.937 回答
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 项目被重置或者通过过程或即时窗口专门初始化它们时,它们才会重新初始化。

于 2013-10-28T02:12:03.537 回答
0

也许这两个功能也可以帮助您:

SaveSetting
GetSetting

如此处所示:http ://www.j-walk.com/ss/excel/tips/tip60.htm

于 2013-11-13T18:28:17.473 回答