Excel 形状(工作表)与控件(用户表单)

Excel 形状(工作表)与控件(用户表单),excel,vba,Excel,Vba,我试图调用工作表放置的标签,但我希望通过提供名称字符串来动态调用它 我尝试了很多建议,这一条给了我最大的希望: 我在过去成功地达到了预期的效果,但这些应用程序都是基于用户表单的。这个没有userforms,所以显然我不能使用Userform.Controls 建议改用Shape,但每当我想更改Shape的标题时,它都会说它并没有那个属性。我尝试过以奇怪的方式“组合”标签和形状,但当然我总是不匹配 我将使用链接答案中的示例 Dim shpLabel As Shape Set shpLabel

我试图调用工作表放置的标签,但我希望通过提供名称字符串来动态调用它

我尝试了很多建议,这一条给了我最大的希望:

我在过去成功地达到了预期的效果,但这些应用程序都是基于用户表单的。这个没有userforms,所以显然我不能使用Userform.Controls

建议改用Shape,但每当我想更改Shape的标题时,它都会说它并没有那个属性。我尝试过以奇怪的方式“组合”标签和形状,但当然我总是不匹配

我将使用链接答案中的示例

Dim shpLabel As Shape

Set shpLabel = Sheet1.Shapes("labelnum" & i)
shpLabel.Caption = "some string"
显然,这对某些人(可能是旧版本?)有效,但对我来说,它总是返回丢失的属性

我希望我不必做这样的事情:


我想这样做的主要原因是速度和尺寸。该文件已经非常慢了,我担心这样的递归代码只会让它变得更糟。

它有点隐蔽,这取决于它是哪种类型的标签:

如果是表单控件标签:

Sheet1.Shapes("LabelName").Textframe.Characters.Text = "Some string"
Sheet1.OLEObjects("LabelName").Object.Caption = "Some string"
如果是activex控件标签:

Sheet1.Shapes("LabelName").Textframe.Characters.Text = "Some string"
Sheet1.OLEObjects("LabelName").Object.Caption = "Some string"

除了Michael的精彩回答之外:

以下
函数
使您能够轻松重命名标签的标题,无论是ActiveX还是表单控件对象

Function changename(shapename As String, newname As String, workbookname As String, sheetname As String)
With Workbooks(workbookname).Sheets(sheetname)
    If .Shapes(shapename).Type = 12 Then
        Set shp = .OLEObjects(shapename).Object
        shp.Caption = newname
    Else
        Set shp = .Shapes(shapename)
        shp.TextFrame.Characters.Text = newname
    End If
End With
End Function
那么你可以这样称呼它

Sub ChangeShapeCaption()

changename "Label1", "The caption has changed", "Book1", "Sheet1"

End Sub

它是什么样的形状?你是如何添加它的?哦,它是标签,就像在示例中一样,它已经存在了。数百个标签和每个标签上的几十个不同操作。谢谢,是ActiveX版本起作用了。我必须记住这一点。@JohnT请注意ActiveX不会在Office 64位下运行。因此,将来您可能会看到一些错误弹出。@L8n鉴于我的项目在Office 64位上存在许多ActiveX控件,并且有多台计算机使用它,我认为这是错误的statement@TimStack我的回答是基于我们遇到的问题和这一点。对于2013版,他们明确指出ActiveX组件是问题的根源(可以解决),在Office环境的更高版本中,这似乎已经得到解决。所以,是的,一般的说法似乎是错误的,但我仍然会注意它。不需要将ActiveX作为布尔值传递。您可以使用
Shp.type
检查形状的类型。如果是表单控件,则
Shp.Type=8
如果是ActiveX控件,则
Shp.Type=12
甚至更好@SiddharthRout,我已相应地编辑了我的答案