gpt4 book ai didi

vba - 使用相对引用为控件重用宏

转载 作者:行者123 更新时间:2023-12-02 16:54:18 26 4
gpt4 key购买 nike

我正在尝试为同事编写一个 Excel 2007 宏,但我的 VBA 技能非常基础(请原谅这个双关语)。本质上,需要发生的是,当单击复选框时,右侧的相邻单元格将填充登录人员的用户名。

到目前为止,这是我想出的代码,可以让我做到这一点:

Sub CheckBox1_Click()
Range("J4").Activate
If ActiveCell.Offset(0, 18).Value = True Then
ActiveCell.Offset(0, 1).Value = Environ("UserName")
Else
ActiveCell.Offset(0, 1).Clear
End If
End Sub

仅供引用,“ActiveCell.Offset(0,18)”指的是链接到相关复选框并包含其真/假值的单元格。

(编辑:此外,单元格 J4 被激活的原因是因为在本例中,它是包含 ActiveX 复选框的单元格)

效果很好,但这不是我的问题。我的问题是这样的:该行中还有 49 个复选框,此工作表上还有 3 行,本书中还有 45 个工作表。我不想为了更改事件单元格而将相同的代码复制粘贴到唯一的宏中。更重要的是,作为一名优秀的程序员,我不应该重复这样的代码。我应该如何写这个,这样我就不必每次都引用不同的单元格?

编辑 2:天啊,兰斯刚刚帮助我意识到我错了。该工作表使用表单控件,而不是 ActiveX 控件。非常抱歉,大家。

最佳答案

虽然使用 Sheet 对象很容易做到这一点,但使用 ActiveX Control 对象却很难做到。您不能在其事件中自引用 ActiveX 控件的名称,除非将其传递给它,并且您也不能引用事件子例程的名称来提取名称,也不能引用调用例程的例程。

我还尝试触发 Worksheet Change 和 SelectionChange 事件,但这些事件不会触发复选框更改,即使它具有发生更改的 LinkedCell

我最终想出的是点击事件的通用包装器,您必须修改字符串以匹配复选框名称:

Private Sub CheckBox1_Click()

NameCopy Me, "CheckBox1"

End Sub

然后是一个 Namecopy 函数,该函数将 LinkedCell 左侧的单元格 -7 设置为名称值。

Public Sub NameCopy(wsheet As Worksheet, cname As String)

If wsheet.OLEObjects(cname).Object.Value = True Then
Range(wsheet.OLEObjects(cname).LinkedCell).Offset(0, -7).Value = Environ("UserName")
End If

End Sub

使用表单复选框会更容易,您可以将此宏用于所有复选框。只需记住将宏设置为:

Public Sub NameCopy()

Dim shp As Shape
Set shp = ActiveSheet.Shapes(Application.Caller)

If shp.ControlFormat.Value = xlOn Then
ActiveSheet.Range(shp.ControlFormat.LinkedCell).Offset(0, -7).Value = Environ("UserName")
End If

End Sub

关于vba - 使用相对引用为控件重用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31036508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com