2017-10-15 57 views
0

程序:Excel 2016.如何在Excel工作表中定位特定形狀

我有一張有很多形狀的工作表。他們每個人都有自己的特定名稱,其中大部分都是標籤。我想改變自己的caption屬性,但我不能找到一種方法,但稱他們通過一個像這樣的:

LblLabel_1.Caption = ... 
    LblLabel_2.Caption = ... 
    LblLabel_3.Caption = ... 

相反,我一直在尋找這樣的事情:

For BytCounter01 = 1 to 255 
     Shapes("LblLabel_" & BytCounter01).Caption = ... 
    Next 

這一個將導致錯誤438,基本上說Caption不適用於此對象。它仍然是目標,因爲此代碼:

Debug.print Shapes("LblLabel_" & BytCounter01).Name 

將返回我的名字。

尋找一個解決方案:

-i've試圖控制(「LblLabel_」 & BytCounter01),而不是形狀(「LblLabel_」 & BytCounter01),但因爲控制它不會工作只爲用戶窗體,不用於牀單;

-i've已嘗試過形狀(「LblLabel_」& BytCounter01).TextFrame.Characters.Text,但它會再次返回錯誤438;

- 由於標籤是一個組的一部分,我都試過

Shapes("ShpGroupOfShapes01").GroupItems(ShpShapeIndex).Caption 

Shapes("ShpGroupOfShapes01").GroupItems(ShpShapeIndex).TextFrame.Characters.Text 

但同樣得到了438。

是否真的沒有辦法輕鬆地在工作表上定位特定標籤並更改標題?

謝謝。

編輯:感謝Excelosaurus,問題解決了。由於我的標籤是ActiveX控件我不得不使用這樣的事情:

For BytCounter01 = 1 to 255 
     Shapes("LblLabel_" & BytCounter01)OLEFormat.Object.Object.Capti‌​on = ... 
    Next 

您可以檢查他的反應和更多細節的意見。再次感謝Excelosaurus!

回答

0

要更改形狀的文字內容,用.TextFrame2.TextRange.Text如下圖所示:

shtShapes.Shapes(sShapeName).TextFrame2.TextRange.Text = sShapeCaption 

其中shtShapes是從Visual Basic編輯器中項目資源管理器看到您的工作表的對象的名稱,

VBE showing worksheet codename

sShapeName是含有所述目標形狀的名稱的字符串變量,以及

sShapeCaption是一個包含所需標題的字符串變量。

代碼示例如下。我已經引入了一個函數來檢查工作表上的形狀是否存在。

Option Explicit 

Public Sub SetLabelCaptions() 
    Dim bCounter As Byte 
    Dim sShapeName As String 
    Dim sShapeCaption As String 

    For bCounter = 1 To 255 
     sShapeName = "LblLabel_" & CStr(bCounter) 

     If ShapeExists(shtMyShapes, sShapeName) Then 
      sShapeCaption = "Hello World " & CStr(bCounter) 
      shtMyShapes.Shapes(sShapeName).TextFrame2.TextRange.Text = sShapeCaption 
     Else 
      Exit For 
     End If 
    Next 
End Sub 

Public Function ShapeExists(ByVal pshtHost As Excel.Worksheet, ByVal psShapeName As String) As Boolean 
    Dim boolResult As Boolean 
    Dim shpTest As Excel.Shape 

    On Error Resume Next 
    Set shpTest = pshtHost.Shapes(psShapeName) 
    boolResult = (Not shpTest Is Nothing) 
    Set shpTest = Nothing 

    ShapeExists = boolResult 
End Function 

結果應該是這樣的:

enter image description here

+0

謝謝你的回覆。我已經在我的文件中測試了這個命令,但它給了我運行時錯誤5.我將嘗試在一個全新的文件中複製你的例子,以便我可以正確地檢查它。 –

+0

我已經複製了該文件,但行shtMyShapes.Shapes(sShapeName).TextFrame2.TextRange.Text = sShapeCaption正在返回運行時錯誤«'-2147024809(80070057)':指定的值超出允許值»(我已翻譯了描述,所以可能不準確)。我看不出我做錯了什麼。 –

+0

好吧,你的「標籤」不是常規的形狀;它們是從「開發人員」選項卡插入的表單控件或ActiveX控件。 窗體控件:'shtMyShapes.Shapes(sShapeName).OLEFormat.Object.Caption = sShapeCaption' ActiveX控件:'shtMyShapes.Shapes(sShapeName).OLEFormat.Object.Object.Caption = sShapeCaption' – Excelosaurus

0

您不能將Caption分配給形狀。 (形狀沒有標題)。一種方法是遍歷所有的形狀,並建立一個小桌子,告訴你什麼遍歷下一:

Sub WhatDoIHave() 
    Dim kolumn As String, s As Shape 
    Dim i As Long, r As Range 

    kolumn = "Z" 
    i = 1 

    For Each s In ActiveSheet.Shapes 
     Set r = Cells(i, kolumn) 
     r.Value = i 
     r.Offset(, 1).Value = s.Name 
     r.Offset(, 2).Value = s.Type 
     r.Offset(, 3).Value = s.TopLeftCell.Address(0, 0) 
     i = i + 1 
    Next s 

End Sub 

這對於我的樣品產生:

enter image description here

看見我有兩種形式和ActiveX (OLE)控件,我知道接下來要循環什麼。然後,我通過編號引用控件並在適當的情況下分配標題。

+0

謝謝您的答覆。當你說你「知道接下來要循環什麼」和「通過編號引用控件並在適當時分配一個標題」時,你的意思是你可以做到這一點,或者代碼本身可以做到這一點?你如何通過數字來引用控件並改變他的標題? –

相關問題