AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79146192
Accepted
Forward Ed
Forward Ed
Asked: 2024-11-01 04:02:01 +0800 CST2024-11-01 04:02:01 +0800 CST 2024-11-01 04:02:01 +0800 CST

如何将信息从表单传递到子表单

  • 772

就声明一个可以被调用并且可以从任何地方保留信息的变量而言,这个问题似乎与我所寻找的完全一致。

我有一个用户表单,它以字符串形式提供项目编号和文件路径,还有另一个布尔值,用于确定是否选择了“确定”或“取消”按钮,以及当进程返回到子进程时如何继续。从我所做的研究来看,似乎表明最简单的方法是通过全局变量。虽然这可能是最简单的方法,但它是正确的方法吗?

我尝试将变量声明放在代码表顶部,位于 Sheet3 中第一个 sub/fun 之前,我的大部分代码都在这里,并且用于启动用户窗体的按钮单击代码也在这里。我还尝试将其放在 ThisWorkBook 中的代码顶部。我还尝试将其放在相关用户窗体的代码页顶部。

我只在一个地方声明它们。我不会同时在多个地方声明它们。

当我在 Sheet3 上声明时,在用户窗体代码中的子部分出现错误

在此处输入图片描述

相关代码:

Private Sub OKBtn_Click()
    
    strPPTFilepath = PPTPath.text
    strProjectNumber = ProjectNoTextBox.text
    bCancelled = False
    
End Sub

当我在 ThisWorkBook 中声明它时,我得到:

在此处输入图片描述

导致错误的代码位于Sheet3中,如下所示:

Private Sub LoadPPT_Click()

Dim frm As PPT_Picker_Form
Dim wbPPT As Workbook
Dim wsPPT As Worksheet
Dim rngTopLeft As Range
Dim lngLastUsedRow As Long
Dim lngLastCo As Long

'Public strPPTFilepath As String
'Public strProjectNumber As String
    
    Set frm = UserForms.Add(PPT_Picker_Form.Name)
    frm.ListData = ThisWorkbook.Worksheets("Project Numbers").ListObjects("Project_Number_List").DataBodyRange
    
    frm.show
    
    Unload frm
    
    If bCancelled Then '<----this is the undeclared variable
        Exit Sub
    End If
    
    'Define PPT Table
        
    Set wbPPT = Workbooks.Add(strPPTFilepath)
    Set wsPPT = wbPPT.Worksheets("Fee Estimate")
    
    'Find top left corner
    With wsPPT.Cells
        Set rngTopLeft = .Find("WBS Code", LookIn:=xlValues)
        
        If rngTopLeft Is Nothing Then
            'nothing found
            'add a manual cell picker routine
          
        End If
    End With
    'Find last row
    'find Right edge
    
   ' strProjectNumber

End Sub

当我在用户表单代码区域中声明它时,我在相同的位置收到与上述相同的错误。

问题

将信息从表单传递到 Sheet3 上的子表单的正确方法是什么?

更新

天哪,我不敢相信我忘了显示声明变量的代码,所以这里是:

'set it so that all subs and functions require variables to be dimensioned
Option Explicit

'variable available across all modules?
Public strPPTFilepath As String
Public strProjectNumber As String
Public bCancelled As Boolean
vba
  • 2 2 个回答
  • 52 Views

2 个回答

  • Voted
  1. Tim Williams
    2024-11-01T07:04:48+08:002024-11-01T07:04:48+08:00

    您还可以在表单模块的顶部声明一个公共变量:

    Public bCancelled As Boolean

    这可以通过用户窗体中的代码进行设置,并通过调用代码读取:

    Dim frm As PPT_Picker_Form, wasCancelled As Boolean
    '...
    '...
    Set frm = New PPT_Picker_Form
    frm.Show
    wasCancelled = frm.bCancelled 'read the value from the form
    Unload frm                    '...before unloading it
    '...
    '...
    

    这避免创建项目级全局变量。

    • 2
  2. Best Answer
    taller
    2024-11-01T04:53:36+08:002024-11-01T04:53:36+08:00

    您可以使用公共变量,以便脚本可以从 和工作表模块访问它UserForm。ThisWorkbook公共变量应在标准模块中声明,而不是在其他模块中声明。

    在 VBA 编辑器(VBE)中Insert -> Module,在窗口中添加以下行Code。

    Option Explicit
    
    'variable available across all modules?
    Public strPPTFilepath As String
    Public strProjectNumber As String
    Public bCancelled As Boolean
    

    Microsoft 文档:

    公共变量可以在项目中的任何过程中使用。如果在标准模块或类模块中声明了公共变量,则也可以在引用声明了公共变量的项目的任何项目中使用它。[来自:声明变量]

    • 1

相关问题

  • 搜索括号内的文本并设置其格式

  • 使用 VBA 将形状分配给 Powerpoint 中的组

  • Word VBA,将光标移动到编号列表中下一个数字的开头

  • 使用 vba 宏为每个帐户执行 Outlook 规则

  • 从访问 OLE 对象中提取文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve