Excel VBA如何从Workbook_Open模块取变量供命令按钮模块调用实现游戏重置
VBA Excel《War》卡牌游戏重置功能实现方案
方案1:标准模块存全局初始值(适配小型项目,实现成本最低)
这是最适合小型VBA项目的实现方式,逻辑清晰易维护:
- 插入新的标准模块,命名为
mod_GameConfig - 在模块顶部声明公共常量存储固定初始值,声明公共变量存储需要从Excel表动态读取的初始值
- 在
ThisWorkbook的Workbook_Open事件中完成动态初始值的一次性记录 - 在标准模块中封装通用的
ResetGame公共子过程,所有重置场景(游戏结束、重置按钮点击)直接调用该过程即可
代码示例
mod_GameConfig 模块代码
Option Explicit ' 固定初始常量,无需动态修改的参数直接定义为常量 Public Const INIT_BASE_SCORE As Long = 0 Public Const INIT_TOTAL_CARDS As Long = 52 ' 动态初始值,存储启动时单元格的初始状态 Public INIT_PLAYER1_DISPLAY_CELL As Range Public INIT_PLAYER2_DISPLAY_CELL As Range Public INIT_DECK_AREA As Range ' 通用重置过程,所有重置场景统一调用 Public Sub ResetGame() ' 重置双方分数 Sheet1.Range("A1").Value = INIT_BASE_SCORE Sheet1.Range("B1").Value = INIT_BASE_SCORE ' 重置牌堆逻辑(替换为你自己的牌堆初始化代码) Call ShuffleDeck ' 重置界面单元格为初始状态 Sheet1.Range(INIT_PLAYER1_DISPLAY_CELL.Address).Value = INIT_PLAYER1_DISPLAY_CELL.Value Sheet1.Range(INIT_PLAYER2_DISPLAY_CELL.Address).Value = INIT_PLAYER2_DISPLAY_CELL.Value End Sub
ThisWorkbook 代码
Private Sub Workbook_Open() ' 项目启动时记录所有动态初始值 With mod_GameConfig Set .INIT_PLAYER1_DISPLAY_CELL = Sheet1.Range("C2") Set .INIT_PLAYER2_DISPLAY_CELL = Sheet1.Range("C3") Set .INIT_DECK_AREA = Sheet1.Range("D2:D53") End With End Sub
重置按钮点击事件代码
Private Sub btnResetGame_Click() ' 直接调用公共重置过程即可 Call mod_GameConfig.ResetGame End Sub
方案2:类模块封装公共属性(适配中大型项目,封装性更强)
如果项目后续有扩展需求,不想定义过多全局变量,可以用单例类封装所有游戏配置和重置逻辑:
- 插入类模块,命名为
cls_GameManager,在类的属性面板将PredeclaredId设置为True - 将初始值定义为类的私有成员,通过只读公共属性对外暴露,重置逻辑封装为类的公共方法
代码示例
cls_GameManager 类模块代码
Option Explicit ' 私有成员存储初始值 Private p_initBaseScore As Long Private p_initPlayer1Cell As Range ' 类初始化时自动赋值初始值 Private Sub Class_Initialize() p_initBaseScore = 0 Set p_initPlayer1Cell = Sheet1.Range("C2") End Sub ' 公开只读属性,外部只能读取不能修改初始值 Public Property Get InitBaseScore() As Long InitBaseScore = p_initBaseScore End Property Public Property Get InitPlayer1Cell() As Range Set InitPlayer1Cell = p_initPlayer1Cell End Property ' 封装重置方法 Public Sub ResetGame() Sheet1.Range("A1").Value = InitBaseScore Sheet1.Range(InitPlayer1Cell.Address).Value = InitPlayer1Cell.Value ' 其他重置逻辑 End Sub
调用方式(重置按钮/游戏结束场景)
' 直接调用单例类的重置方法 cls_GameManager.ResetGame
注意要点
- 所有重置场景统一调用同一个公共重置过程,不要在不同模块重复写重置逻辑,避免后续迭代时需要多处修改
- 如果初始值支持用户自定义,可以单独建一个隐藏的配置工作表存储初始值,重置时直接读取配置表数值即可,不需要存在变量中
- 不要在局部过程中用
Static关键字存储初始值,跨模块无法访问,维护成本极高
内容的提问来源于stack exchange,提问作者user58518
相关产品推荐
相关产品推荐

