मैं एक्सेल के भीतर एक वीबीए समाधान विकसित करने की कोशिश कर रहा हूं जो यह पहचान सकता है कि मानक कनेक्टर लाइन के माध्यम से वर्कशीट के भीतर कौन से आकार प्रत्येक दूसरे से जुड़े हुए हैं।

shapes example

उदाहरण के लिए, संलग्न स्निपेट में, मुझे एक कोड बनाने की आवश्यकता है जो यह पहचान सके कि नियंत्रण वर्ग दो लाल वृत्तों से जुड़ा है (शीर्षक जोखिम 1 और जोखिम 2) और एक संदेश बॉक्स में निम्नलिखित आउटपुट करें: "जोखिम 1 और जोखिम 2 नियंत्रण से जुड़े हैं"। मैं कनेक्टर लाइनों को जोड़ने के लिए कोड खोजने में सक्षम हूं, हालांकि मैं यह नहीं समझ सकता कि कनेक्टेड आकृतियों की पहचान कैसे करें। किसी भी मार्गदर्शन की काफी सराहना की जाएगी! मैंने वह कोड भी संलग्न किया है जिसे मैं अब तक ढूंढ पाया हूं।

Sub QuickConnect( )
    Dim s1 As Shape, s2 As Shape, conn As Shape
    
    ' Create a shape
    Set s1 = ActiveSheet.Shapes.AddShape(msoShapeCube, 100, 10, 50, 60)
    
    ' Create another shape
    Set s2 = ActiveSheet.Shapes.AddShape(msoShapeCan, 50, 100, 50, 60)

    ' Create connector with arbitrary coordinates
    Set conn = ActiveSheet.Shapes.AddConnector(msoConnectorCurve, 1, 1, 1, 1)

    ' Connect shapes
    conn.ConnectorFormat.BeginConnect s1, 1
    conn.ConnectorFormat.EndConnect s2, 1
    
    ' Connect via shortest path (changes connection sites)
    conn.RerouteConnections
End Sub
1
Roger Wyllie 11 सितंबर 2020, 09:37

2 जवाब

सबसे बढ़िया उत्तर

आप ConnectorFormat.EndConnectedShape प्रॉपर्टी (Excel) और ConnectorFormat.BeginConnectedShape प्रॉपर्टी (एक्सेल) आप जो चाहते हैं उसे प्राप्त करने के लिए।

तर्क:

  1. सभी कनेक्टर आकृतियों के माध्यम से लूप करें।
  2. आकृतियों का एक अनूठा संग्रह बनाएं जिससे अन्य आकृतियाँ जुड़ी हों।
  3. शुरुआत और अंत आकार के नाम प्राप्त करें।
  4. संबंध ज्ञात कीजिए अर्थात WHO WHO से जुड़ा है।

कोड:

मैंने कोड पर टिप्पणी की है लेकिन यदि आपके पास अभी भी प्रश्न हैं तो बेझिझक पूछें।

Option Explicit

'~~> Change this if your shapes include the below text
Const mySep As String = "MySep"

Sub Sample()
    Dim ws As Worksheet
    Dim shpConnector As Shape
    Dim shpConnectorCount As Long
    Dim i As Long: i = 1
    Dim tmpAr As Variant, itm As Variant
    Dim colConnector As New Collection
    Dim msg As String
    Dim finalOutput As String
    
    '~~> Change this to the relevant sheet
    Set ws = Sheet1
    
    With ws
        '~~> Count the number of connector shapes
        For Each shpConnector In .Shapes
            If shpConnector.Connector Then shpConnectorCount = shpConnectorCount + 1
        Next shpConnector
        
        '~~> If not found then exit sub
        If shpConnectorCount = 0 Then Exit Sub
        
        '~~> Resize array based on connector count
        ReDim tmpAr(1 To shpConnectorCount)
        
        For Each shpConnector In .Shapes
            With shpConnector
                If .Connector Then
                    '~~> Unique collection of shapes to which other
                    '~~> shapes are connected with
                    On Error Resume Next
                    colConnector.Add CStr(.ConnectorFormat.EndConnectedShape.Name), _
                    CStr(.ConnectorFormat.EndConnectedShape.Name)
                    On Error GoTo 0
                    
                    '~~> Store Starting shape and End Shape in an array
                    tmpAr(i) = .ConnectorFormat.BeginConnectedShape.Name & mySep _
                    & .ConnectorFormat.EndConnectedShape.Name
                    i = i + 1
                End If
            End With
        Next
        
        '~~> Loop through the unique collection and the array to create
        '~~> Our necessary output
        For Each itm In colConnector
            msg = ""
            For i = LBound(tmpAr) To UBound(tmpAr)
                If Split(tmpAr(i), mySep)(1) = itm Then
                    msg = msg & "," & Split(tmpAr(i), mySep)(0)
                End If
            Next i
            finalOutput = finalOutput & vbNewLine & Mid(msg, 2) & " is/are connected to " & itm
        Next itm
    End With
    
    MsgBox Mid(finalOutput, 2)
End Sub

कार्रवाई में:

enter image description here

स्क्रीनशॉट:

enter image description here

2
Siddharth Rout 11 सितंबर 2020, 10:26

इसलिए आपको सभी आकृतियों के माध्यम से लूप करने की आवश्यकता है, जांचें कि क्या वे एक कनेक्टर हैं (हाँ, कनेक्टर लाइनें भी आकार हैं)। और फिर आप जांच सकते हैं कि इस कनेक्टर लाइन से कौन सी आकृतियाँ जुड़ी हुई हैं:

गुण .ConnectorFormat.BeginConnectedShape आपको कनेक्टर लाइन के एक छोर पर और दूसरे छोर पर .ConnectorFormat.EndConnectedShape आकार देता है।

इसकी जांच करो:

Option Explicit

Public Sub TestConnections()
    Dim shp As Variant
    For Each shp In Shapes 'loop through all shapes            
        If shp.Connector = msoTrue Then 'check if current shape is a connector
            'BeginConnectedShape is the shape on the beginning side of the connector
            'EndConnectedShape is the shape on the ending side of the connector
            Debug.Print shp.Name _
                        & " connects " & _
                        shp.ConnectorFormat.BeginConnectedShape.Name _
                        & " with " & _
                        shp.ConnectorFormat.EndConnectedShape.Name
        End If
    Next shp 
End Sub

निम्नलिखित आकृतियों के लिए

enter image description here

यह आउटपुट करता है

Curved Connector 3 connects Cube 1 with Can 2
Curved Connector 6 connects Cube 5 with Can 2
3
Pᴇʜ 11 सितंबर 2020, 14:06