Gruppierung und Benennung der Formen in Excel mit vba

In Excel vba, ich bin Schaffung von zwei Formen in excel mit vba. Ein Pfeil, der ich den Namen "aro" + i, und ein Textfeld, welches ich mit dem Namen "text" + i, wobei i eine Zahl, die die Anzahl der auf einem Foto.

Also, sagen wir mal für Foto 3 ich will creat Pfeil "aro3" und Textfeld "text3".

Dann möchte ich, um Sie zu gruppieren und benennen Sie die Gruppe "arotext" + i, so "arotext3" in diesem Fall.

Bisher habe ich die Gruppierung und Umbenennung wie diese:

targetSheet.shapes.Range(Array(Arrow.Name, textBox.Name)).Select
Selection.group
Selection.Name = "AroTxt" & Number

die funktioniert auch prächtig in einem sub, aber das will ich jetzt ändern Sie diese in eine Funktion und die Rückgabe der benannten Gruppe, also habe ich versucht, so etwas wie dieses:

Dim arrowBoxGroup as Object
set arrowBoxGroup = targetSheet.shapes.Range(Array(Arrow.Name, textBox.Name))
arrowBoxGroup.group
arrowBoxGroup.Name = "AroTxt" & Number

Ich Probleme bekommen, wenn ich eine neue Gruppe erstellen, die denselben Namen hat wie eines, das bereits erstellt wurde. Also, wenn ich einen zweiten "aro3" und "text3" und versuchen Sie dann, um Sie zu gruppieren und benennen Sie die Gruppe "arotext3" bekomme ich eine Fehlermeldung, weil eine Gruppe mit dem gleichen Namen ist bereits vorhanden.

Die Sache, die ich nicht verstehe, ist, dass, wenn ich Tat dies mit der Methode bezogen auf die Auswahl, die ich umbenennen könnte jede Gruppe mit dem gleichen Namen, wenn ich wollte und würde nicht mehr zu einem Fehler. Warum funktioniert es, wenn unter Bezugnahme auf das Selection-Objekt, aber schlägt fehl, wenn Sie versuchen, verwenden Sie ein zugeordnetes Objekt?

UPDATE:

Da jemand gebeten, den code habe ich so weit unten ist. Pfeil und Textfeld sind ein Pfeil und ein Textfeld, die zeigen in eine Richtung willkürlich definiert durch den Benutzer mit Hilfe eines Formulars.

Dieser erstellt dann ein Pfeil im richtigen Winkel auf dem Ziel-Arbeitsblatt und stellen Sie ein Textfeld mit der angegebenen Anzahl (auch durch die form) am Ende des Pfeils, so dass es effektiv Formen eine Legende. Ich weiß, dass es gibt Legenden, aber Sie tun nicht, was ich will, also musste ich um meine eigenen zu machen.

Habe ich der Gruppe das Textfeld und Pfeil, weil 1) Sie gehören zusammen, 2) ich behalten, welche Legenden haben bereits platziert worden mit der name der Gruppe als Referenz, 3) der Nutzer hat Ort wird die Legende in der rechten Position auf einer Karte, die eingebettet ist in das Arbeitsblatt.

Bisher habe ich es geschafft, diese in eine Funktion, indem Sie den Rückgabewert einer GroupObject. Aber das basiert immer noch auf dem Blatt.Formen.range().Wählen Sie, was meiner Meinung nach ein sehr schlechter Weg, dies zu tun. Ich bin auf der Suche nach einem Weg, sich nicht auf das selection-Objekt.

Und ich würde gerne verstehen, warum das funktioniert, wenn mit Auswahl, scheitert aber bei der Verwendung von stark typisierten Variablen zur Aufnahme der Objekte.

    Public Function MakeArrow(ByVal No As Integer, ByVal angle As Double, ByVal size As ArrowSize, ByVal ArrowX As Double, ByVal ArrowY As Double, ByVal TargetInternalAngle As Double, ByRef targetSheet As Worksheet) As GroupObject

    Dim Number As String
    Dim fontSize As Integer
    Dim textboxwidth As Integer
    Dim textboxheight As Integer
    Dim arrowScale As Double
    Dim X1 As Double
    Dim Y1 As Double
    Dim X2 As Double
    Dim Y2 As Double
    Dim xBox As Double
    Dim yBox As Double
    Dim testRange As Range
    Dim arrow As Shape
    Dim textBox As Shape
'    Dim arrowTextbox As ShapeRange
'    Dim arrowTextboxGroup As Variant

    Select Case size
        Case ArrowSize.normal
            fontSize = fontSizeNormal
            arrowScale = arrowScaleNormal
        Case ArrowSize.small
            fontSize = fontSizeSmall
            arrowScale = arrowScaleSmall
        Case ArrowSize.smaller
            fontSize = fontSizeSmaller
            arrowScale = arrowScaleSmaller
    End Select
    arrowScale = baseArrowLength * arrowScale

    'Estimate required text box width
    Number = Trim(CStr(No))
    Set testRange = shtTextWidth.Range("A1")
    testRange.value = Number
    testRange.Font.Name = "MS P明朝"
    testRange.Font.size = fontSize
    shtTextWidth.Columns(testRange.Column).EntireColumn.AutoFit
    shtTextWidth.Columns(testRange.row).EntireRow.AutoFit
    textboxwidth = testRange.Width * 0.8
    textboxheight = testRange.Height * 0.9
    testRange.Clear

    'Make arrow
    X1 = ArrowX
    Y1 = ArrowY
    X2 = X1 + arrowScale * Cos(angle)
    Y2 = Y1 - arrowScale * Sin(angle)
    Set arrow = AddArrow(X1, Y1, X2, Y2, Number, targetSheet)

    'Make text box
    Set textBox = Addtextbox(angle, Number, fontSize, X2, Y2, textboxwidth, textboxheight, TargetInternalAngle, targetSheet)

    'Group arrow and test box
    targetSheet.shapes.Range(Array(arrow.Name, textBox.Name)).group.Select
    Selection.Name = "AroTxt" & Number

    Set MakeArrow = Selection

'    Set arrowTextbox = targetSheet.shapes.Range(Array(arrow.Name, textBox.Name))
'    Set arrowTextboxGroup = arrowTextbox.group
'    arrowTextboxGroup.Name = "AroTxt" & Number
'
'    Set MakeArrow = arrowTextboxGroup

End Function

Private Function AddArrow(ByVal StartX As Double, ByVal StartY As Double, ByVal EndX As Double, ByVal EndY As Double, ByVal Number As String, ByRef targetSheet As Worksheet) As Shape

    Set AddArrow = targetSheet.shapes.AddLine(StartX, StartY, EndX, EndY)
    With AddArrow
        .Name = "Aro" & Number
        With .Line
            .BeginArrowheadStyle = msoArrowheadTriangle
            .BeginArrowheadLength = msoArrowheadLengthMedium
            .BeginArrowheadWidth = msoArrowheadWidthMedium
            .ForeColor.RGB = RGB(0, 0, 255)
        End With
    End With

End Function

Private Function Addtextbox(ByVal angle As Double, ByVal Number As String, ByVal fontSize As Integer, ByVal arrowEndX As Double, ByVal arrowEndY As Double, ByVal Width As Integer, ByVal Height As Integer, ByVal LimitAngle As Double, ByRef targetSheet As Worksheet) As Shape

    Dim xBox, yBox As Integer
    Dim PI As Double
    Dim horizontalAlignment As eTextBoxHorizontalAlignment
    Dim verticalAlignment As eTextBoxVerticalAlignment

    PI = 4 * Atn(1)

    If LimitAngle = 0 Then
        LimitAngle = PI / 4
    End If

    Select Case angle
        'Right
        Case 0 To LimitAngle, 2 * PI - LimitAngle To 2 * PI
            xBox = arrowEndX
            yBox = arrowEndY - Height / 2
            horizontalAlignment = eTextBoxHorizontalAlignment.left
            verticalAlignment = eTextBoxVerticalAlignment.Center
        'Top
        Case LimitAngle To PI - LimitAngle
            xBox = arrowEndX - Width / 2
            yBox = arrowEndY - Height
            horizontalAlignment = eTextBoxHorizontalAlignment.Middle
            verticalAlignment = eTextBoxVerticalAlignment.Bottom
        'Left
        Case PI - LimitAngle To PI + LimitAngle
            xBox = arrowEndX - Width
            yBox = arrowEndY - Height / 2
            horizontalAlignment = eTextBoxHorizontalAlignment.Right
            verticalAlignment = eTextBoxVerticalAlignment.Center
        'Bottom
        Case PI + LimitAngle To 2 * PI - LimitAngle
            xBox = arrowEndX - Width / 2
            yBox = arrowEndY
            horizontalAlignment = eTextBoxHorizontalAlignment.Middle
            verticalAlignment = eTextBoxVerticalAlignment.top
    End Select

    Set Addtextbox = targetSheet.shapes.Addtextbox(msoTextOrientationHorizontal, xBox, yBox, Width, Height)
    With Addtextbox
        .Name = "Txt" & Number
        With .TextFrame
            .AutoMargins = False
            .AutoSize = False
            .MarginLeft = 0#
            .MarginRight = 0#
            .MarginTop = 0#
            .MarginBottom = 0#
            Select Case verticalAlignment
                Case eTextBoxVerticalAlignment.Bottom
                    .verticalAlignment = xlVAlignBottom
                Case eTextBoxVerticalAlignment.Center
                    .verticalAlignment = xlVAlignCenter
                Case eTextBoxVerticalAlignment.top
                    .verticalAlignment = xlVAlignTop
            End Select
            Select Case horizontalAlignment
                Case eTextBoxHorizontalAlignment.left
                    .horizontalAlignment = xlHAlignLeft
                Case eTextBoxHorizontalAlignment.Middle
                    .horizontalAlignment = xlHAlignCenter
                Case eTextBoxHorizontalAlignment.Right
                    .horizontalAlignment = xlHAlignRight
            End Select
            With .Characters
                .Text = Number
                With .Font
                    .Name = "MS P明朝"
                    .FontStyle = "標準"
                    .size = fontSize
                    .Strikethrough = False
                    .Superscript = False
                    .Subscript = False
                    .OutlineFont = False
                    .Shadow = False
                    .Underline = xlUnderlineStyleNone
                    .ColorIndex = xlAutomatic
                End With
            End With
        End With
        .Fill.Visible = msoFalse
        .Fill.Solid
        .Fill.Transparency = 1#
        With .Line
            .Weight = 0.75
            .DashStyle = msoLineSolid
            .style = msoLineSingle
            .Transparency = 0#
            .Visible = msoFalse
        End With
    End With


End Function
Ich glaube, Sie brauchen, um mehr details zu bieten, was Sie versucht haben, um som-Hilfe. Zum Beispiel, was ist das Pfeil-und textBox-Objekte und wie Sie Sie zuordnen? Warum brauchen Sie, um Sie zu gruppieren?
Bisschen ein update. Ich hatte, um die oben genannten code in Excel 2007 heute, und es brach auf die Auswahl.Namen bit. Vielleicht ist dies nur funktionierte, weil einige Fehler in Excel 2003 (und früheren?).

InformationsquelleAutor yu_ominae | 2012-08-17

Schreibe einen Kommentar