Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ActiveSheet.Shapes.AddLine einfärben / formatieren

Forumthread: ActiveSheet.Shapes.AddLine einfärben / formatieren

ActiveSheet.Shapes.AddLine einfärben / formatieren
03.07.2014 13:17:32
Claus

Liebe Excelspezialisten,
mit folgendem Code zeichne ich eine Linie von einem Zellmittelpunkt zum anderen (Zellen variabel, x und y Koords je beginn und ende lbx, lby, lex, ley)
With Cells(xs, ys)
lbx = .Left + .Width / 2
lby = .Top + .Height / 2
End With
With Cells(xz, yz)
lex = .Left + .Width / 2
ley = .Top + .Height / 2
End With
ActiveSheet.Shapes.AddLine lbx, lby, lex, ley
Fragen:
Wie kann ich das erzeugte Objekt benennen, so dass ich es später gezielt ansprechen bzw. löschen kann?
Ich möchte die Farbe des Objekts ändern. Und zwar in die Farbe, die Zelle A1 als Hintergrundfarbe hat. Geht das?
Wie kann ich Anfangs- und Endgestaltung der Linie verändern? (Punkt oder Pfeilspitze)
Gibt es auch eine Funktion, die nur einen Punkt (dann natürlich nur mit lbx und lby) erzeugt?
Vielen Dank und liebe Grüße
Claus

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Probiere es mal...
03.07.2014 14:29:03
Case
Hallo, :-)
... so:
Dim shpLine As Shape
Set shpLine = ActiveSheet.Shapes.AddLine(lbx, lby, lex, ley)
With shpLine
.Name = "Test"
' Weitere Optionen
End With
Set shpLine = Nothing
Servus
Case

Anzeige
AW: Probiere es mal...
03.07.2014 15:34:52
Claus
Danke Case,
also den Namen zu vergeben geht, aber alle anderen Formatierungen bekomme ich so nicht hin. Ich glaube, dass die Syntax beim Aufzeichnen eine andere ist wie die hier, weil ich beim ausführen Fehler bekomme: Laufzeitfehler 438 Objekt unterstützt diese Eigenschaft oder Methode nicht.
Liebe Grüße
Claus

Anzeige
AW: Probiere es mal...
03.07.2014 18:40:46
fcs
Hallo Claus,
hier Beispiele, wie man Shapes formatieren kann.
Wenn man solche Funktionen öfter mal nutzen möchte oder mehrfach in der gleichen Datei, dann sollte man Subs erstellen, an die die Parameter (Start, Ziel, Farbe, etc) für die Erstellung übergeben werden.
Einen Punkt kann man als gefülltes Oval mit gleicher Höhe und Breite (=Durchmesser) darstellen.
Gruß
Franz
Sub MalenShapes()
With ActiveSheet
'Malen Linie01
Call MalenLinie(rngZelleS:=.Cells(2, 2), rngZelleZ:=.Cells(5, 4), _
strName:="Linie01", lngFarbe:=.Range("A1").Interior.Color)
'MalenPunkt01
Call MalenPunkt(rngZelle:=.Cells(2, 3), Diameter:=10, strName:="Punkt01", _
lngFarbe:=.Range("A1").Interior.Color)
End With
End Sub
Sub LoeschenShapes()
Call ShapeLoeschen("Linie01")
Call ShapeLoeschen("Punkt01")
End Sub
Sub MalenLinie(rngZelleS As Range, rngZelleZ As Range, strName, lngFarbe As Long, _
Optional dblWeight As Double = 2, _
Optional lngBeginArrowheadStyle As Long = 6, _
Optional lngEndArrowheadStyle As Long = 2, _
Optional lngArrowheadLength As Long = 3, _
Optional lngArrowheadWidth As Long = 3)
'Zeichnet eine Linie zwischen den Mittelpunkten zweier Zellen
'rngZelleS = Startzelle für Linie
'rngZelleZ = Zielzelle für Linie
'Arroheadstyles:
'1 = msoArrowheadNone
'2 = msoArrowheadTriangle
'3 = msoArrowheadOpen
'4 = msoArrowheadStealth
'5 = msoArrowheadDiamond
'6 = msoArrowheadOval
'-2 = msoArrowheadStyleMixed
'Arroheadlength:
'1 = msoArrowheadShort
'2 = msoArrowheadLengthMedium
'3 = msoArrowheadLong
'-2 = msoArrowheadLengthMixed
'ArroheadWidth:
'1 = msoArrowheadNarrow
'2 = msoArrowheadWidthMedium
'3 = msoArrowheadWide
'-2 = msoArrowheadWidthMixed
Dim objShape As Shape
Dim lbx, lby, lex, ley, xs, ys, xz, yz
On Error GoTo Fehler
With rngZelleS
lbx = .Left + .Width / 2
lby = .Top + .Height / 2
End With
With rngZelleZ
lex = .Left + .Width / 2
ley = .Top + .Height / 2
End With
Set objShape = ActiveSheet.Shapes.AddLine(lbx, lby, lex, ley)
With objShape
.Name = strName
With .Line
.ForeColor.RGB = lngFarbe
.Weight = dblWeight 'Linienbreite
'Startpunkt Line
.BeginArrowheadStyle = lngBeginArrowheadStyle
.BeginArrowheadLength = lngArrowheadLength
.BeginArrowheadWidth = lngArrowheadWidth
'Endpunkt Linie
.EndArrowheadStyle = lngEndArrowheadStyle
.EndArrowheadLength = lngArrowheadLength
.EndArrowheadWidth = lngArrowheadWidth
End With
End With
Fehler:
With Err
Select Case .Number
Case 0
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub
Sub MalenPunkt(rngZelle As Range, Diameter, strName As String, lngFarbe As Long)
'Malt Punkt (Kreis) mit Durchmesser mitten in Zelle
Dim objShape As Shape
Dim lbx, lby
On Error GoTo Fehler
With rngZelle
lbx = .Left + .Width / 2 - Diameter / 2
lby = .Top + .Height / 2 - Diameter / 2
End With
Set objShape = ActiveSheet.Shapes.AddShape(msoShapeOval, lbx, lby, Diameter, Diameter)
With objShape
.Name = strName
With .Line
.ForeColor.RGB = lngFarbe
.Weight = 1 'Linienbreite
End With
With .Fill
.ForeColor.RGB = lngFarbe
End With
End With
Fehler:
With Err
Select Case .Number
Case 0
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub
Sub ShapeLoeschen(strShape As String, Optional objSheet As Object)
On Error GoTo Fehler
If objSheet Is Nothing Then Set objSheet = ActiveSheet
objSheet.Shapes(strShape).Delete
Fehler:
With Err
Select Case .Number
Case 0
Case -2147024809 'Shape mit Name nicht gefunden
Resume Next
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub

Anzeige
AW: Probiere es mal...
04.07.2014 08:47:55
Claus
Hallo Franz,
super, vielen Dank hierfür. Jetzt komme ich echt weiter bei meiner Aufgabenstellung.
Genau so mache ich das, ich baue die gewünschten Dinge als Subs ein mit Übergabe der Parameter (Start, Ziel, Farbe, etc) für die Erstellung.
Hab jetzt noch nicht alles ausprobiert, aber die ersten beiden haben funktioniert, ich denke der Rest geht dann auch.
Liebe Grüße
Claus

Anzeige
;
Anzeige

Infobox / Tutorial

ActiveSheet.Shapes.AddLine einfärben und formatieren


Schritt-für-Schritt-Anleitung

Um eine Linie in Excel VBA mit ActiveSheet.Shapes.AddLine zu erstellen und zu formatieren, befolge diese Schritte:

  1. Linie hinzufügen: Verwende den Befehl ActiveSheet.Shapes.AddLine, um eine Linie zwischen zwei Zellen zu zeichnen.

    Dim lbx As Double, lby As Double, lex As Double, ley As Double
    With Cells(xs, ys)
       lbx = .Left + .Width / 2
       lby = .Top + .Height / 2
    End With
    With Cells(xz, yz)
       lex = .Left + .Width / 2
       ley = .Top + .Height / 2
    End With
    Dim shpLine As Shape
    Set shpLine = ActiveSheet.Shapes.AddLine(lbx, lby, lex, ley)
  2. Linie benennen: Um die Linie später gezielt anzusprechen, kannst du ihr einen Namen geben.

    shpLine.Name = "MeineLinie"
  3. Farbe ändern: Um die Farbe der Linie in die Hintergrundfarbe einer bestimmten Zelle zu ändern, nutze den folgenden Code:

    With shpLine.Line
       .ForeColor.RGB = ActiveSheet.Range("A1").Interior.Color
    End With
  4. Linienformatierung: Du kannst die Start- und Endgestaltung der Linie anpassen, indem du die Eigenschaften für Pfeilspitzen festlegst:

    With shpLine.Line
       .BeginArrowheadStyle = 2 ' Pfeilspitze
       .EndArrowheadStyle = 3 ' Offene Pfeilspitze
    End With

Häufige Fehler und Lösungen

  • Laufzeitfehler 438: Dieser Fehler tritt auf, wenn eine Eigenschaft oder Methode nicht unterstützt wird. Stelle sicher, dass du die richtigen Objekte und Eigenschaften verwendest. Überprüfe die Syntax und die Objektreferenzen in deiner VBA-Umgebung.

  • Objekt nicht gefunden: Wenn du versuchst, eine Linie zu löschen, die nicht existiert, erhalte den Fehler "Shape mit Name nicht gefunden". Überprüfe den Namen des Objekts, das du löschen möchtest.


Alternative Methoden

  • Anstelle von ActiveSheet.Shapes.AddLine, könntest du ActiveSheet.Shapes.AddShape verwenden, um eine Linie oder einen Punkt zu zeichnen:

    Set objShape = ActiveSheet.Shapes.AddShape(msoShapeLine, lbx, lby, lex - lbx, ley - lby)
  • Erstelle eine separate Subroutine, um die Linie zu zeichnen, was die Wiederverwendbarkeit des Codes erhöht.


Praktische Beispiele

Hier sind einige praktische Beispiele, die dir helfen, die AddLine Funktion zu nutzen:

  1. Linie zwischen zwei Zellen:

    Sub LinieZeichnen()
       Dim lbx, lby, lex, ley
       ' Koordinaten festlegen
       lbx = Cells(1, 1).Left + Cells(1, 1).Width / 2
       lby = Cells(1, 1).Top + Cells(1, 1).Height / 2
       lex = Cells(3, 3).Left + Cells(3, 3).Width / 2
       ley = Cells(3, 3).Top + Cells(3, 3).Height / 2
       ' Linie hinzufügen
       ActiveSheet.Shapes.AddLine lbx, lby, lex, ley
    End Sub
  2. Punkt in einer Zelle zeichnen:

    Sub PunktZeichnen()
       Dim lbx, lby
       lbx = Cells(2, 2).Left
       lby = Cells(2, 2).Top
       ActiveSheet.Shapes.AddShape(msoShapeOval, lbx, lby, 10, 10)
    End Sub

Tipps für Profis

  • Nutze Variablen für die Zellkoordinaten (lbx, lby, lex, ley), um den Code flexibler zu gestalten.
  • Erstelle Subroutinen für wiederkehrende Aufgaben. Das verbessert die Lesbarkeit und Wartbarkeit des Codes.
  • Verwende die With-Anweisung, um den Code effizienter zu gestalten und die Schreibweise zu reduzieren.

FAQ: Häufige Fragen

1. Wie kann ich die Linienbreite ändern?
Du kannst die Linienbreite mit der Eigenschaft .Weight anpassen:

shpLine.Line.Weight = 3 ' Setzt die Breite auf 3 Punkte

2. Kann ich die Farbe des Punktes ändern?
Ja, du kannst die Farbe des Punktes anpassen, indem du die Füllfarbe des Shapes änderst:

With objShape.Fill
    .ForeColor.RGB = RGB(255, 0, 0) ' Rot
End With

3. Gibt es eine Möglichkeit, die Linie zu animieren?
VBA hat keine native Animationsfunktion. Du kannst jedoch die Linie wiederholt neu zeichnen, um einen Animationseffekt zu erzielen.

4. Wie lösche ich eine Linie?
Nutze die Methode Shapes.Delete:

ActiveSheet.Shapes("MeineLinie").Delete

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige