检查ActiveX标签是否包含字符串的一部分

时间:2018-12-04 02:54:24

标签: vba powerpoint-vba

我正在使用此代码根据标签是否仅包含%符号而不包含其他内容来隐藏标签。

这是代码的这一部分,现在在运行时会出错。错误:“ 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

2 个答案:

答案 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