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
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bereich.Gruppe einen Wert zurückgibt. Sie könnten versuchen:
Ich vermute, dass die aktuelle Auswahl wird aktualisiert, wenn die folgenden in Ihrer früheren Arbeit:
was verursacht den Unterschied.
Zur info, ich bin mit Excel 2010 und können nicht duplizieren Sie die original-code-snippet, das je nach Auswahl (bekomme ich einen Fehler mache "Auswahl.Name = ", gibt das Objekt unterstützt keine Eigenschaft.)
Ok, bekomme ich diese zu arbeiten:
Natürlich, wie die anderen snippet-ich schlage vor, dieser weist die Gruppe s Rückgabewert, so dass die Auswahl in Auswahl.Gruppe und Auswahl.Namen beziehen sich auf verschiedene Gegenstände, die ich denke, ist, was Sie wollen.
Ja, ich denke, dass in Ihrer version von Excel, die Auswahl wechselt zwischen Auswahl.Gruppe und Auswahl.Namen, die macht es anders als mit Ihrem eigenen Variablen. (Ich weiß, es tut in mir, aber wahrscheinlich auch etwas anders.) Ich denke, dass wir experimentell finden würde, über Auswahl an.Gruppe.Auswählen/Auswahl.Name= stabiler als Auswahl.Gruppe/Auswahl.Name= across-Versionen von Excel, denn das braucht mehr Kontrolle (der Wechsel von Objekt -) Auswahl (bezieht sich auf).
InformationsquelleAutor Erik Eidt
Es ist, weil Sie die Speicherung der neuen Gruppen, die als ein Objekt manuell nun, dass dieser Fehler aufgetreten ist. Sie sind wahrscheinlich nicht in der Lage, etwas zu tun mit der mehrere Instanzen von "AroTxt" & Number, die Sie erstellt haben. Da excel nicht in der Lage sein zu entscheiden, welche Gruppe du meinst.
Excel sollten nicht zulassen, diese aber nicht immer warnen, dass dies passiert ist, aber Fehler, wenn Sie versuchen, wählen Sie eine Gruppe, die einen doppelten Namen.
Selbst wenn dies nicht der Fall, es ist nicht eine gute Praxis, haben doppelte Variablennamen. Wäre es nicht besser, sich zu fügen Sie die zusätzlichen Pfeil und Textfeld ist die Gruppe?
So, um Ihr problem zu lösen müssen Sie überprüfen, um zu sehen, ob die Gruppe schon vorhanden ist, bevor Sie es speichern. Vielleicht löschen Sie, wenn vorhanden, oder die der Gruppe Hinzugefügt werden.
Hoffe, das hilft
InformationsquelleAutor royka
Edit: Wie es immer zu gehen scheint, der Fehler begann aufspringen, nachdem ich geklickt Einreichen. Ich werde basteln, um ein bisschen mehr, aber echo @royka in Fragen, wenn Sie wirklich brauchen, zu geben, die den gleichen Namen mehrere Formen.
Den code unten scheint zu tun, was Sie suchen (die Formen erstellt, Ihnen Namen geben und dann eine Gruppe). In der grouping-Funktion, verließ ich die "AroText" Nummer die selbe ist nur zu sehen, wenn ein Fehler passieren würde (Tat es nicht). Es scheint, dass beide Formen den gleichen Namen haben, aber was unterscheidet Sie ist Ihre
Shape.ID
. Was ich sagen kann, ist, wenn Sie sagenActiveSheet.Shapes("My Group").Select
ist, wird es markieren Sie das element, mit, dem Namen mit der niedrigsten ID (, warum können Sie zwei Dinge mit dem gleichen Namen, keine Ahnung 🙂 ).Es ist nicht ganz eine Antwort auf Ihre Frage, "warum" (ich war nicht in der Lage zu replizieren den Fehler), aber das wird sich hoffentlich geben Sie eine Art und Weise "wie".
Seine Antwort übernimmt keine Objekte auf der Seite, aber funktioniert perfekt. Wenn Sie wollen, dass es ein zweites mal auszuführen, müssen Sie eine Schleife durch alle vorhandenen Objekte und finden, wo es aufgehört hat und die for-Schleife aus.
InformationsquelleAutor RocketDonkey