Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA全局变量“;终生;?_Excel_Vba - Fatal编程技术网

Excel VBA全局变量“;终生;?

Excel VBA全局变量“;终生;?,excel,vba,Excel,Vba,对不起,这个非描述性的标题,我只是不知道如何描述我的目标。 我是VBA的新手,还不知道事情到底是怎么回事 我编写了一个函数,它从用户那里获取一个目录,并显示目录中第一个文件的数据。现在,我想添加一个“下一步”按钮。 当按下“下一步”按钮时,我的代码将显示目录中下一个文件的数据 我尝试使用全局变量,但每次按下按钮时,它们似乎都会被初始化。 实现目标的最佳方式是什么?我是否必须使用电子表格作为内存,并从中写入和读取所有内容?或者Excel VBA是否有其他“实时内存”机制 谢谢, Li单击按钮时,通

对不起,这个非描述性的标题,我只是不知道如何描述我的目标。 我是VBA的新手,还不知道事情到底是怎么回事

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

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

谢谢,
Li

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


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

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


您可以将电子表格用作内存。一种方法是将工作表的可见性属性设置为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

然后,您可以将按钮的宏设置为“GetNextFile”,每次单击后它都会在文件中循环。至于全局变量的生存期,只有在重置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

然后,您可以将按钮的宏设置为“GetNextFile”,每次单击后它都会在文件中循环。至于全局变量的生存期,只有在重置VBA项目或通过过程或即时窗口专门初始化全局变量时,才会重新初始化全局变量。

也许这两个函数也可以帮助您:

SaveSetting
GetSetting

如图所示:

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

SaveSetting
GetSetting

如图所示:

也许您可以写入某个文件,并在适当的时间重新读取值。您可以共享您当前拥有的代码吗?我的代码太大,包含许多其他操作,这只会让所有人感到困惑。。我是否解释了我的目标?也许你可以在适当的时候写入某个文件并重新读取值。你可以共享你当前拥有的代码吗?我的代码太大,包含许多其他操作,这只会让每个人都感到困惑。。我能解释我的目标吗?+1正是我的想法。+1正是我的想法。