我正在使用此代码根据标签是否仅包含%符号而不包含其他内容来隐藏标签。
这是代码的这一部分,现在在运行时会出错。错误:“ OLEFormat.Object:无效请求。命令不能应用于具有多个形状的形状范围”
正确的代码应该是什么?
If InStr(1, myRange.OLEFormat.Object.Caption, "%", vbTextCompare) > 0 Then
Sub c_Three_RemovePercent()
For slideNumber = 1 To 11
Set mydocument = ActivePresentation.Slides(slideNumber)
mydocument.Select
Dim myArray() As Variant
Dim myRange As Object
myArray = Array("Lbl_V1", "Lbl_V2", "Lbl_V3", "Lbl_V4", "Lbl_V5")
Set myRange = ActivePresentation.Slides(1).Shapes.Range(myArray)
With mydocument.Shapes.Range(myArray)
If InStr(1, myRange.OLEFormat.Object.Caption, "%", vbTextCompare) > 0 Then
mydocument.Shapes(myRange).Visible = False
Else: mydocument.Shapes(myRange).Visible = True
End If
End With
Next slideNumber
End Sub
答案 0 :(得分:1)
所有这些蒙住眼睛的后期绑定成员调用很容易造成混淆:您没有获得 IntelliSense 来帮助您导航可用的成员。
您正在寻找OLEObject
,因此声明一个;分配它:
Dim oleLabel As Excel.OLEObject
Set oleLabel = ActivePresentation.Slides(1).Shapes("SomeShapeName").OLEFormat.Object
现在,您想要该OLEObject
的{{1}}属性中的控件,并将该控件投射到其Object
接口上:
MSForms.Label
现在,您已经可以使用早期绑定的Dim labelControl As MSForms.Label
Set labelControl = oleLabel.Object
接口进行查询,并且 IntelliSense 会一直指导您:
MSForms.Label
If Contains(labelControl.Caption, "%") Then
'...
Else
'...
End If
可能看起来像这样:
Contains
您有一个要迭代的标签控件名称数组-只需对其进行迭代即可:
Public Function Contains(ByVal source As String, ByVal substring As String) As Boolean
Contains = InStr(1, source, substring, vbTextCompare) > 0
End Function
注意如何做:
Dim labelNames As Variant
labelNames = Array("label1", "label2", "label3", ...)
Dim i As Long
For i = LBound(labelNames) To UBound(labelNames)
Set oleLabel = currentSlide.Shapes(labelNames(i)).OLEObject
oleLabel.Visible = Not Contains(labelControl.Caption, "%")
Next
可以重写为:
If BooleanExpression Then
Thing = True
Else
Thing = False
End If
答案 1 :(得分:0)
通常最好检查字符串是否包含vba函数INSTR。基本上在下面的示例中...从第一个位置开始,检查此文本,查找“%”,不区分大小写。
If InStr(1, myRange.OLEFormat.Object.Caption, "%", vbTextCompare) > 0 Then
mydocument.Shapes(myRange).Visible = False
Else: mydocument.Shapes(myRange).Visible = True
End If