2017-10-15 10 views
0

プログラム:Excel 2016.Excelシートで特定の形状をターゲットにする方法

私は多くの形のシートを持っています。それぞれに固有の固有の名前が付いていて、ほとんどがラベルです。私は、彼らのキャプションプロパティを変更したいが、私は方法を見つけることができませんが、このような一つ一つそれらを呼び出す:

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

代わりに、私はこのような何かを探していた。

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

この1エラー438が発生します。基本的にキャプションはこのオブジェクトには使用できません。次のコードからオブジェクトをターゲットにします。

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

私はその名前を返します。解決策を探してい

-i'veではなく、シェイプのコントロール(「LblLabel_」& BytCounter01)(「LblLabel_」& BytCounter01)を試みたが、それが制御するので動作しませんが唯一のユーザーフォームのためである、ではありませんシートの場合。

-i'veはShapes( "LblLabel_" & BytCounter01).TextFrame.Characters.Textを試みましたが、エラー438を再度返します。ラベル-since

がグループの一部である、私は

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

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

の両方を試してみましたが、再び438を持っています。

シート上の特定のラベルを簡単にターゲティングし、キャプションを変更する方法はありませんか?

ありがとうございます。

EDIT:Excelosaurusのおかげで、問題は解決しました。私のラベルはActiveXコントロールがあるので、私はこのようなものを使用する必要があります:

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

あなたは彼の応答や詳細についてのコメントを確認することができます。おかげさまでExcelosaurus!

答えて

0

、以下に示すよう.TextFrame2.TextRange.Textを使用し、形状のテキストコンテンツを変更するには:プロジェクトエクスプローラで、Visual Basic Editorから分かるようにshtShapesは、ワークシートのオブジェクトの名前です

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

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

OK "ラベル"は通常の図形ではありません。フォームコントロールか、開発者タブから挿入された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

ご返信いただきありがとうございます。 「次に何をループするかを知っている」と「番号でコントロールを参照し、必要に応じてキャプションを割り当てる」と言うとき、あなたはそれを行うことができますか、コード自体で行うことができますか?番号でコントロールをどのように参照し、キャプションを変更しますか? –

関連する問題