Excel 我应该设置OLEObject或OLEObject.Object的Enabled属性吗?

Excel 我应该设置OLEObject或OLEObject.Object的Enabled属性吗?,excel,vba,Excel,Vba,我正在做一个Excel VBA项目。在Sheet1中,我有一个表,每行有3个命令按钮。在这个表之外,我有另一个名为“cbSwap”的命令按钮。当我点击这个按钮时,它会打开一个用户表单。此用户表单有2个文本框和一个按钮。用户表单从两个文本框中获取两个值,并将它们传输到名为SwapTwoRange的函数。此函数接受这些值,并将它们用作Excel范围名称。下面是函数: Function SwapTwoRange(val1 As String, val2 As String) Dim arr1 As

我正在做一个Excel VBA项目。在Sheet1中,我有一个表,每行有3个命令按钮。在这个表之外,我有另一个名为“cbSwap”的命令按钮。当我点击这个按钮时,它会打开一个用户表单。此用户表单有2个文本框和一个按钮。用户表单从两个文本框中获取两个值,并将它们传输到名为SwapTwoRange的函数。此函数接受这些值,并将它们用作Excel范围名称。下面是函数:

Function SwapTwoRange(val1 As String, val2 As String)
  Dim arr1 As Variant, arr2 As Variant
  Dim Rng1 As Range, Rng2 As Range

  Set Rng1 = ThisWorkbook.Sheets("Sheet1").Range("row" & val1)
  Set Rng2 = ThisWorkbook.Sheets("Sheet1").Range("row" & val2)

  Application.ScreenUpdating = False
  arr1 = Rng1.Value
  arr2 = Rng2.Value
  Rng1.Value = arr2
  Rng2.Value = arr1
  Application.ScreenUpdating = True

  'No problem occured until here.

  If (WorksheetFunction.CountA(Rng1) = 0) Then
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbStartRow" & val1).Object.Enabled = True
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbEndRow" & val1).Object.Enabled = False
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbClearRow" & val1).Object.Enabled = False
  Else
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbStartRow" & val1).Object.Enabled = False
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbEndRow" & val1).Object.Enabled = True
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbClearRow" & val1).Object.Enabled = True
  End If

  If (WorksheetFunction.CountA(Rng2) = 0) Then
    ThisWorkbook.Sheets("Sheet1").OLEObjects("cbStartRow" & val2).Object.Enabled = True
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbEndRow" & val2).Object.Enabled = False
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbClearRow" & val2).Object.Enabled = False
  Else
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbStartRow" & val2).Object.Enabled = False
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbEndRow" & val2).Object.Enabled = True
      ThisWorkbook.Sheets("Sheet1").OLEObjects("cbClearRow" & val2).Object.Enabled = True
  End If
End Function
cbStartRow、cbEndRow和cbClearRow是Sheet1表格行中的命令按钮。当if块执行时,它们看起来就像我想要的那样被启用/禁用。但当我选择(例如)一个禁用的命令按钮并查看其属性时,其启用的属性为。而且这个程序并没有像我想的那样工作。我必须使用输入到文本框中的值引用命令按钮名称(例如,如果textbox1的值为“1”,则第一个if-else块将更改cbStartRow1、cbEndRow1和cbClearRow1的Enabled属性)


没有这个问题我怎么做?在过去的8天里,我一直在互联网论坛上寻找解决方案,但我找不到正确的解决方案。请帮忙。无论如何,谢谢。

我只在第三方ActiveX控件中使用了
OLEObject.Object
,VBA不知道这些控件的属性在哪里

因此,请尝试只引用
OLEObject
,而不是
OLEObject.Object
。然后,
Enabled
属性实际属于
OLEObject
-您可以检查

例如,您的代码是:

ThisWorkbook.Sheets("Sheet1").OLEObjects("cbStartRow" & val1).Enabled = True
不是:

您可以用一个较小的示例来尝试这种方法。只需创建一个新工作簿并插入一个按钮,然后将其放入
Sheet1
的代码模块。然后运行
Test1

Option Explicit

Sub Test1()

    Dim obj As OLEObject

    Set obj = ThisWorkbook.Worksheets("Sheet1").OLEObjects(1)

    obj.Enabled = True
    Debug.Print obj.Enabled

    obj.Enabled = False
    Debug.Print obj.Enabled

    obj.Enabled = True
    Debug.Print obj.Enabled

End Sub
这将输出:

True
False
True
True
True
True
然后运行
Test2

Sub Test2()

    Dim obj As OLEObject

    Set obj = ThisWorkbook.Worksheets("Sheet1").OLEObjects(1)

    obj.Object.Enabled = True
    Debug.Print obj.Enabled

    obj.Object.Enabled = False
    Debug.Print obj.Enabled

    obj.Object.Enabled = True
    Debug.Print obj.Enabled

End Sub
这将输出:

True
False
True
True
True
True

我只在第三方ActiveX控件中使用了
OLEObject.Object
,VBA不知道属性在哪里

因此,请尝试只引用
OLEObject
,而不是
OLEObject.Object
。然后,
Enabled
属性实际属于
OLEObject
-您可以检查

例如,您的代码是:

ThisWorkbook.Sheets("Sheet1").OLEObjects("cbStartRow" & val1).Enabled = True
不是:

您可以用一个较小的示例来尝试这种方法。只需创建一个新工作簿并插入一个按钮,然后将其放入
Sheet1
的代码模块。然后运行
Test1

Option Explicit

Sub Test1()

    Dim obj As OLEObject

    Set obj = ThisWorkbook.Worksheets("Sheet1").OLEObjects(1)

    obj.Enabled = True
    Debug.Print obj.Enabled

    obj.Enabled = False
    Debug.Print obj.Enabled

    obj.Enabled = True
    Debug.Print obj.Enabled

End Sub
这将输出:

True
False
True
True
True
True
然后运行
Test2

Sub Test2()

    Dim obj As OLEObject

    Set obj = ThisWorkbook.Worksheets("Sheet1").OLEObjects(1)

    obj.Object.Enabled = True
    Debug.Print obj.Enabled

    obj.Object.Enabled = False
    Debug.Print obj.Enabled

    obj.Object.Enabled = True
    Debug.Print obj.Enabled

End Sub
这将输出:

True
False
True
True
True
True

val1 As String
val2 As String
的值是什么?val1和val2是从用户表单文本框中获取的变量。用户表单有两个文本框。每一行代表表1中的一行。用户表单从用户处获取值,以便它能够理解哪些行将被交换。例如如果用户为textbox1输入“1”,为textbox2输入“3”,并单击按钮,则将调用SwapTwoRange函数。函数将获取这两个值,并处理两行(第1行和第3行;以及这两行中的按钮)上的所有内容。
val1作为字符串
val2作为字符串
的值是什么?val1和val2是从用户表单文本框中获取的变量。用户表单有两个文本框。每一行代表表1中的一行。用户表单从用户处获取值,以便它能够理解哪些行将被交换。例如如果用户为textbox1输入“1”,为textbox2输入“3”,并单击按钮,则将调用SwapTwoRange函数。函数将接受这两个值,并处理两行(第1行和第3行;以及这两行中的按钮)上的所有内容。是的!这就创造了魔法,它完美地工作了!谢谢你的回复。干得好!对这就创造了魔法,它完美地工作了!谢谢你的回复。干得好!