Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

X,Y Koordinaten einer angeklickten Linie

Betrifft: X,Y Koordinaten einer angeklickten Linie von: Camille
Geschrieben am: 05.09.2014 18:11:19

Hallo liebes Forum,

Ich suche seit einigen Tagen eine Möglichkeit ein eigentlich simples Problem zu lösen:
Ich habe durch ein VBA-Modul verschiedene Linien in eine leeres Tabellenblatt gezeichnet. Jetzt möchte ich eine dieser Linien per Mausklick auswählen und die Koordinatenpunkte X1, Y1, X2, Y2 erhalten.
Dabei sind:
X1 und Y1 die X- und Y-Koordinate des Anfangspunktes der Linie
X2 und Y2 die X- und Y-Koordinate des Endspunktes der Linie

Ich habe mir immerhin schon den Namen meiner, per Mausklick ausgewählten, Linie über:
Dim LinienName As String
LinienName = Selection.ShapeRange.Name

ausgeben lassen. Als Wert ergibt sich z.B. "Straight Connector 2310".

Jetzt hatte ich gehofft über
Dim X1 As Integer
X1 = ActiveSheet.Shapes(LinienName).Nodes(1).Points(1, 1)

mir die Koordinaten ausgeben zu lassen. Das klappt so einfach aber nicht.

Dann habe ich es mit dieser Methode probiert:
Dim Koor as Variant
Dim X1 As Integer, Y1 as Integer
Koor = ActiveSheet.Shapes(LinienName).Nodes.Item(1).Points
X1 = Koor(1, 1)
Y1 = Koor(1, 2)

Doch das klappt auch nicht.

Hat jemand eine Idee wie ich weiter machen kann? Mir gehen die Ideen aus und mit der normalen Hilfe von Microsoft komme ich leider auch nicht weiter. Ich bin für jeden Denkansatz und Vorschlag dankbar!

Grüße
Camille

  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: Adis
Geschrieben am: 07.09.2014 17:15:43

Hallo

Es gibt das Forum Archiv, aus Neugier habe ich mal reingeschaut. (suche XY Koordinaten)
Es gibt einige Beitraege zu diesem Thema. Anbei der Link einer alten Beispiel Datei.
Hier wird ein Objekt bewegt, ein Trapez. Die Koordinaten werden per Makro gelistet.

https://www.herber.de/bbs/user/8473.xls

Gruss Adis


  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: fcs
Geschrieben am: 08.09.2014 13:40:09

Hallo Camille,

ich hab mit im VBA-Editor mal alle Eigenschaften eines Linienobjektes angesehen.

Ich hab nichts gefunden, mit dem man die Koordinaten von Start- und Endpunkt einer Linie ermitteln kann.

Über die Eigenschaften Top, Left, Height und Width kann man zwar die Koordinaten der 4 Eckpunkte des einhülendne Rechtecks bestimmen, aber es gibt keine Informationen (auch keine indirekten) an welchem der 4 Punkte Start- bzw. Endpukt der Linie sind.
Nodes-Werte wie bei anderen Objekten gibt es keine.

Gruß
Franz


  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: Camille
Geschrieben am: 08.09.2014 20:10:19

Hallo Franz,

Würde das zur Fehlermeldung "Der Index in der angegebenen Sammlung ist außerhalb des zulässigen Bereichs." passen?

@Adis: mit dem Excel-tool habe ich versucht, aber ich schaffe es nicht es auf eine einfach Linie zu übertragen.
Obige Fehlermeldung kommt nämlich, wenn ich folgenden Code versuche:

Dim PointsArray(1 To 2, 1 To 2)
LinienName = Selection.ShapeRange.Name
Set sh = ActiveSheet.Shapes(LinienName)
With sh.Nodes
For i = 1 To 2
PointsArray(1, i) = .Item(1).Points
Next i
End With


Leider ist das Problem also noch nicht gelöst...
Danke für euere Antworten bisher!


  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: Mullit
Geschrieben am: 08.09.2014 20:49:21

Hallo,

VerticalFlip und HorizontalFlip machen die Musik:

Option Explicit

Public Sub test()
Dim sngX1Begin As Single, sngY1Begin As Single, _
  sngX2End As Single, sngY2End As Single
  If TypeOf Selection Is Line Then
    With ActiveSheet.Shapes(Selection.Name)
         sngX1Begin = .Left
         sngX2End = .Left + .Width
         If .VerticalFlip = msoTrue And .HorizontalFlip = msoFalse Or _
           .VerticalFlip = msoFalse And .HorizontalFlip = msoTrue Then
           sngY1Begin = .Top + .Height
           sngY2End = .Top
         Else
           sngY1Begin = .Top
           sngY2End = .Top + .Height
         End If
         MsgBox .Name & vbCr & vbCr & "x1:  " & sngX1Begin & vbCr & _
            "y1:  " & sngY1Begin & vbCr & "x2:  " & sngX2End & vbCr & "y2:  " & sngY2End
    End With
  Else
    MsgBox "Bitte eine Linie auswählen!", vbExclamation
  End If
End Sub




VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß,


  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: fcs
Geschrieben am: 09.09.2014 10:23:20

Hallo Camille, hallo Mullit,

VerticalFlip und HorizontalFlip machen die Musik, aber sie war von Mullit noch nicht ganz zu Ende gespielt.

Mullits Makro berechnet die Koordinaten der beiden Endpunkte, unterscheidet aber noch nicht zwischen Start- und Endpunkt. Mit den folgenden Anpassungen werden auch diese berücksichtigt. X1/Y1 ist dann der Startpunkt, X2/Y2 der Endpunkt.

Public Sub test()
  Dim sngX1Begin As Single, sngY1Begin As Single, _
    sngX2End As Single, sngY2End As Single
  If TypeOf Selection Is Line Then
    With ActiveSheet.Shapes(Selection.Name)
         sngX1Begin = .Left
         sngX2End = .Left + .Width
         If .HorizontalFlip = msoFalse Then
            sngX1Begin = .Left
            sngX2End = .Left + .Width
            If .VerticalFlip = msoFalse Then
              sngY1Begin = .Top
              sngY2End = .Top + .Height
            Else
              sngY1Begin = .Top + .Height
              sngY2End = .Top
            End If
         Else
            sngX1Begin = .Left + .Width
            sngX2End = .Left
            If .VerticalFlip = msoFalse Then
              sngY1Begin = .Top
              sngY2End = .Top + .Height
            Else
              sngY1Begin = .Top + .Height
              sngY2End = .Top
            End If
         End If
         MsgBox .Name & vbCr & vbCr & "x1:  " & sngX1Begin & vbCr & _
            "y1:  " & sngY1Begin & vbCr & "x2:  " & sngX2End & vbCr & "y2:  " & sngY2End
    End With
  Else
    MsgBox "Bitte eine Linie auswählen!", vbExclamation
  End If
End Sub



  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: Camille
Geschrieben am: 09.09.2014 18:11:41

Hallo Mullit, hallo fcs!

Danke danke Danke! Es ist genau DAS was ich gebraucht habe. Und der Code ist auch noch komplett dabei!! Ich bin begeistert und kann euch nicht genug danken.

Der Code klappt auch wunderbar in der 2010er Version.

Gruß
Camille


  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: Mullit
Geschrieben am: 09.09.2014 19:33:27

Hallo,

@Camille:
top::

@Franz:
Was willst Du mir da erzählen???
Du mußt wohl Dein Klavier mal nachstimmen....
Dein Programm ist falsch!

sngX1Begin
sngY1Begin
sind bei mir immer die Anfangskoordinaten.

sngX2End
sngY2End
sind bei mir immer die Endkoordinaten.
Beides wird in der Msgbox korrekt ausgegeben.

Dein Programm gibt falsche Werte aus, wenn man die Linien dreht:
In X1 steht dann bei Dir der grössere Wert und bei einer aufsteigenden Linie in Y1 der kleinere Wert, bei einer abfallenden Linie in Y1 der grössere Wert: Das ist natürlich genau verkehrt herum...

Du darfst dem X1 Wert nicht .Left + .Width und im doppelten True-Fall für HorizontalFlip und VerticalFlip dem Y1-Wert nicht .Top + .Height zuweisen!!
s.a.:

Public Sub test()
  Dim sngX1Begin As Single, sngY1Begin As Single, _
    sngX2End As Single, sngY2End As Single
  If TypeOf Selection Is Line Then
    With ActiveSheet.Shapes(Selection.Name)
         sngX1Begin = .Left
         sngX2End = .Left + .Width
         If .HorizontalFlip = msoFalse Then
            sngX1Begin = .Left
            sngX2End = .Left + .Width
            If .VerticalFlip = msoFalse Then
              sngY1Begin = .Top
              sngY2End = .Top + .Height
            Else
              sngY1Begin = .Top + .Height
              sngY2End = .Top
            End If
         Else
            sngX1Begin = .Left + .Width
            sngX2End = .Left
            If .VerticalFlip = msoFalse Then
              sngY1Begin = .Top
              sngY2End = .Top + .Height
            Else
              sngY1Begin = .Top + .Height
              sngY2End = .Top
            End If
         End If
         MsgBox .Name & vbCr & vbCr & "x1:  " & sngX1Begin & vbCr & _
            "y1:  " & sngY1Begin & vbCr & "x2:  " & sngX2End & vbCr & " _
y2:  " & sngY2End
    End With
  Else
    MsgBox "Bitte eine Linie auswählen!", vbExclamation
  End If
End Sub

Gruß,


  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: Mullit
Geschrieben am: 10.09.2014 00:43:30

Hallo Franz,

da muß ich mich korrigieren:
Du bezogst Dich mit Deinem Prog auf den 'StartZeichnungspunkt'.
Von der Ansicht her ist Dein Programm korrekt: top::

Ich nahm an, Camille wollte die koordinatensystembezogenen XY-Daten haben....
Da könnte ich natürlich falsch liegen...

Gruß, Mullit


  

Betrifft: AW: X,Y Koordinaten einer angeklickten Linie von: fcs
Geschrieben am: 10.09.2014 00:53:44

Hallo Mullit,

@Franz:
Was willst Du mir da erzählen???
Du mußt wohl Dein Klavier mal nachstimmen....
Dein Programm ist falsch!

Ich denke nach mehrfachem Probieren besteht bei deiner und meiner Version noch Bedarf zum Nachstimmen.

In nachfolgender Grafik hab ich mal verschiedene Linien gestestet. Bei Linie 1 bis 5 hab ich die Linien jeweils vom Startpunkt zum Endpunkt gezeichnet ohne weitere Aktionen wie Drehen oder Kippen.
Bei der 6. Linie hab ich Linie 1 kopiert, verschoben und um 180° gedreht.

Während meine Version nach meinem Verständnis bei den Linien 1 bis 5 Start- und Endpunkt jeweils korrekt ermittelt, funktioniert sie bei der gedrehten Linie nicht mehr. Deine Makroversion liefert bei einigen Richtungen der Linie nach meinem Verständnis nicht die korrekten Start- und End-Koordinaten.

Ich hab jetzt keine Lust auch noch eine Korrektur für den Drehwinkel der Linien einzubauen, nur weil man bei Microsoft nicht in der Lage ist, die Objektdaten komplett im VBA-Objekt abzubilden.

Gruß
Franz