在工作表上的列表或组合框中添加标签。

问题描述 投票:0回答:1

我有一个加载了单元格地址的数组,这些地址被粘贴到一个处理工作表标签顺序的子中。我希望能够在该数组中输入一个控件名称,即 "MyListBox",并让我的函数来处理它。然而,我无法在.activate方法中解决这个问题。如果我隐式地命名控件,它就会工作,但我需要它 "宏扩展解析 "到实际的控件名称,这样我就可以说Array(x).Activate。

这是我正在摸索的代码,但没有用。我已经尝试过使用和不使用MSFORMs声明。我试过连接命令 "activesheet." & arr(x)和许多其他东西。我很确定我可能遗漏了一些简单的东西,但似乎找不到。

Sub TabIntercept()

Dim arr, a, x, nxt, sel
Dim cMyListBox As MSForms.ListBox

If TypeName(Selection) <> "Range" Then Exit Sub 'Exit if (eg) a shape is selected

Set sel = Selection.Cells(1) 'if multiple cells selected use the first...

arr = GetTabOrder(ActiveSheet.Name) 'this function loads the tab order from a table

If UBound(arr) = -1 Then
    Application.OnKey "{TAB}"
    Exit Sub
End If


For x = LBound(arr) To UBound(arr)

    If Left(arr(x), 3) = "lst" Or Left(arr(x), 3) = "cmb" Then 'Look for a control - they all start with lst/cmb

        Set cMyListBox = Sheets("Resources & Process").arr(x) 'HERE IS THE ISSUE
        arr(x).Activate
    End If

    If sel.Address() = sel.Parent.Range(arr(x)).Address() Then
        'loops back to start if at end...
        nxt = IIf(x = UBound(arr), LBound(arr), x + 1)
        sel.Parent.Range(arr(nxt)).Select
        Exit For
    End If
Next x

End Sub
excel vba controls
1个回答
0
投票
Set cMyListBox = Sheets("Resources & Process").arr(x) 'HERE IS THE ISSUE

首先,声明一个 Worksheet 的变量;该页的 Workbook.Sheets 属性返回一个 Object,所以所有这些成员调用都是隐式的后期绑定,你在没有编译器协助的情况下蒙着眼睛编码。

Dim sheet As Worksheet
Set sheet = ActiveWorkbook.Worksheets("Resources & Process")

注意 ActiveWorkbook 修饰语:如果你有特定的 Workbook 的对象,就用它来代替。但考虑总是限定 Workbook 成员的调用,否则你就会隐含地引用任何 ActiveWorkbook 是,最终那将不是你所期待的工作簿。

现在 sheet.arr(x) 是不可能的,因为 IntelliSense 现在,当你键入时,你会发现 . 点运算符:一个 Worksheet 对象必须暴露一个名为 arr 的工作。

你要做的,是得到 OLEObject 名为 无论价值多少 arr(x) 是。

你从 Worksheet.OLEObjects 属性,如果成功的话,你就找到了你的MSForms控件--但它被包裹在一个OLE对象中,现在我们只需要解开它:

Dim oleControl As OLEObject
Set oleControl = sheet.OLEObjects(arr(x))

如果成功了,你就找到了你的MSForms控件 - 但它被包裹在一个OLE对象中,我们现在只需要解开它。

Set cMyListBox = oleControl.Object

如果失败了,那么MSForms控件与声明的类型 cMyListBox. 但现在你得到 IntelliSense 并对其进行成员调用的编译时验证:如果你输入了 cMyListBox. 还有一个 Activate 成员,那么在运行时调用应该是有效的。

© www.soinside.com 2019 - 2024. All rights reserved.