Excel 我应该设置OLEObject或OLEObject.Object的Enabled属性吗?
我正在做一个Excel VBA项目。在Sheet1中,我有一个表,每行有3个命令按钮。在这个表之外,我有另一个名为“cbSwap”的命令按钮。当我点击这个按钮时,它会打开一个用户表单。此用户表单有2个文本框和一个按钮。用户表单从两个文本框中获取两个值,并将它们传输到名为SwapTwoRange的函数。此函数接受这些值,并将它们用作Excel范围名称。下面是函数: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
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行;以及这两行中的按钮)上的所有内容。是的!这就创造了魔法,它完美地工作了!谢谢你的回复。干得好!对这就创造了魔法,它完美地工作了!谢谢你的回复。干得好!