形状(工作表)与控件(用户窗体)

时间:2019-04-02 05:47:22

标签: excel vba

我正在尝试调用放置在工作表中的标签,但是我想通过提供名称字符串来动态调用它。

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

Can I reference an object using a string?

我过去已经成功实现了预期的效果,但是那些应用程序都是基于用户形式的。这个没有用户窗体,因此显然我不能使用Userform.Controls?

建议改用Shape,但是每当我要更改形状的标题时,它都说它不具有该属性。我曾尝试过以怪异的方式“组合”标签和形状,但是当然我总是会出现不匹配的情况。

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

Dim shpLabel As Shape

Set shpLabel = Sheet1.Shapes("labelnum" & i)
shpLabel.Caption = "some string"

显然这对某些人有用(也许是旧版本?),但对我来说,它总是会返回该属性丢失的信息。

我希望我不必做这样的事情: Using string as object name

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

2 个答案:

答案 0 :(得分:2)

它有点埋头,这完全取决于标签的类型:

如果是表单控件标签:

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

如果是Activex控件标签:

Sheet1.OLEObjects("LabelName").Object.Caption = "Some string"

答案 1 :(得分:1)

为Michael的出色回答增色不少:

下面的Function使您可以轻松地重命名标签的标题,无论它是ActiveX还是Form控件对象。

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