【问题标题】:Store User input and use for another subprocess存储用户输入并用于另一个子流程
【发布时间】:2015-01-24 06:56:40
【问题描述】:

我有两个相互依赖的子进程。

第一个(合并)获取用户选择的文件并打开它们并合并到当前工作表中。 变量“Files”存储用户选择的路径和文件名

在用户对合并的工作表进行一些更改并按下工作表上分配给“更新”宏的按钮之后。

第二个子(更新)使用用户“文件”已经提供的相同输入,并找到更新单元格所在的工作表并粘贴新值。

请建议一种将用户输入用于“更新”子流程的方法。

Sub Consolidate()
Dim Files as Variant
Files = Application.GetOpenFilename("Excel Files (*.xl*), *.xl*", Title:="Select files         to Consolidate", MultiSelect:=True)
For Z = LBound(Files) To UBound(Files)
    tem = Split(Files(Z), "\")
    If (tem(UBound(tem)) <> ThisWorkbook.Name) Then

* code to consolidate* 
end sub

Sub update()

Call gotoLastModified
Application.ScreenUpdating = True
Application.DisplayAlerts = False

For Z = LBound(Files) To UBound(Files)
tem = Split(Files(Z), "\")
* code to update sheet

结束子

【问题讨论】:

  • 一种简单的方法是将信息写入隐藏的工作表,然后从同一个工作表中检索它。您可以使用 VBA 中的Visible = xlVeryHidden,这样用户就无法轻松取消隐藏它。当您需要在关闭和打开工作簿后检索信息时,此方法效果很好。

标签: vba excel


【解决方案1】:

您需要使用全局变量。为此,请在例程之外声明变量,所有函数都可以使用该变量查看和编辑内容。

试试这个来熟悉自己:

Dim files As Variant

Sub Consolidate()
files = 1
End Sub

Sub Update()
MsgBox files
End Sub

如果您先运行 Update()MsgBox 将出现空,因为文件尚未设置。如果您运行 Consolidate(),然后再次运行 Update(),您将看到 files 已更新。

【讨论】:

    【解决方案2】:

    如果您将Consolidate 转换为函数,并修改update 以获取参数:

    Function Consolidate() as Variant
        ...
        Consolidate = Files
    End Function
    
    Sub update(Files as Variant)
        ...
    End Sub
    

    然后您可以将Consolidate 的结果传递给update

    【讨论】:

      【解决方案3】:

      我相信如果您将Dim Files as Variant 行更改为:

      Public Files as Variant
      

      并将其移动到第一个子之前,这应该可以工作。将其移到子组件之外并使其公开应该使其可用于宏中的所有子组件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-25
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 2014-09-17
        • 2011-03-03
        • 2019-06-11
        相关资源
        最近更新 更多