Corrispondenza univoca tra due Shape



  • Corrispondenza univoca tra due Shape di Massi data: 10/01/2017 14:45:07

    Buongiorno a tutti.
    Premetto che uso vba da 1 anno circa ma lo riprendo oggi dopo 6 o 7 mesi e (sempre da autodidatta).

    Ho un pulsante "CREAFRECCIA" che con una macro inserisce in due righe differenti due Shapes (in una riga una "msoShapeDownArrow", nell'altra riga una "msoShapeUpArrow").
    Queste Shapes vengono sempre create nella colonna "A". Inoltre "frecciasu" e "frecciagiu" non finiscono mai nella stessa riga e "frecciasu" sarà sempre in una riga maggiore di frecciagiu.

    Ad esempio se frecciagiu viene creata nella riga 22, la sua posizione sarà la cella [A22], quindi frecciasu sarà in una cella della colonna A in una riga maggiore di 22.

    Contemporaneamente alla creazione delle shape, vengono assegnate due macro:
    - la prima è assegnata a "frecciagiu", in modo che premendo sulla shape la vista del foglio di excel si sposti sulla riga dove si trova "frecciasu" e me la evidenzi;
    - la seconda è assegnata a "frecciasu", in modo che premendo sulla shape la vista del foglio di excel si sposti sulla riga dove si trova "frecciagiu" e me la evidenzi.

    Io però ogni volta che premo il pulsante "CREAFRECCIA", creo una nuova "frecciagiu" e una nuova "frecciasu", che si troveranno su due nuove righe, differenti da tutte le altre frecce precedenti.

    Vorrei che premendo su una qualsiasi "frecciagiù" la vista di excel si sposti ed evidenzi la riga della sua corrispondente "frecciasu" e viceversa.

    Ad esempio premo il pulsante "CREAFRECCIA" e mi crea le prime due frecce, "frecciagiu" nella riga 21, e "frecciasu" nella riga 41.
    In seguito ripremo il pulsante "CREAFRECCIA" e mi crea altre due frecce, "frecciagiu" nella riga 22 e "frecciasu" nella riga 33.

    Vorrei ottenere questo:
    -premendo la frecciagiu nella riga 21, vorrei che la vista e la selezione si spostasse nella riga 41;
    -premendo la frecciagiu nella riga 22, vorrei che la vista e la selezione si spostasse nella riga 33;
    -premendo la frecciasu nella riga 41, vorrei che la vista e la selezione si spostasse nella riga 21;
    -premendo la frecciasu nella riga 33, vorrei che la vista e la selezione si spostasse nella riga 22;
    -ecc...

    Grazie a chi riuscirà ad aiutarmi!
    Massi


  • di Gianfranco data: 10/01/2017 14:56:08

    ciao
    non è che potresti allegare un file o almeno
    scrivere le macro che utilizzi?


  • di Massi data: 10/01/2017 17:02:05

    Chiedo scusa, inserisco il codice VBA.
     
    '------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------
    
    'Il seguente codice è una parte di un codice più ampio. Qui c'è solo la parte in cui vengono create le Shapes frecciagiu e frecciasu;
    
    
    'CREAZIONE FRECCIAGIU
    
    Dim cellafrecciagiu As Range
    Dim frecciagiu As Shape
    Set cellafrecciagiu = sheets("Foglio1").Cells(riga1, 1)
    Set frecciagiu = sheets("Foglio1").Shapes.AddShape(msoShapeDownArrow, Left:=cellafrecciagiu.Left + 5, Top:=cellafrecciagiu.Top + 2, Width:=cellafrecciagiu.Width - 10, Height:=cellafrecciagiu.Height - 4)
    frecciagiu.ShapeStyle = msoShapeStylePreset38
    frecciagiu.Adjustments.Item(1) = 0.25
    frecciagiu.Adjustments.Item(2) = 0.5
    frecciagiu.Name = riga1
    frecciagiu.OnAction = "versogiu"
    
    
    'CREAZIONE FRECCIASU
    
    Dim cellafrecciasu As Range
    Dim frecciasu As Shape
    Set cellafrecciasu = sheets("Foglio1").Cells(riga2, 1)
    Set frecciasu = sheets("Foglio1").Shapes.AddShape(msoShapeUpArrow, Left:=cellafrecciasu.Left + 5, Top:=cellafrecciasu.Top + 2, Width:=cellafrecciasu.Width - 10, Height:=cellafrecciasu.Height - 4)
    frecciasu.ShapeStyle = msoShapeStylePreset39
    frecciasu.Adjustments.Item(1) = 0.25
    frecciasu.Adjustments.Item(2) = 0.5
    frecciasu.Name = riga2
    frecciasu.OnAction = "versosu"
    
    '------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------
    
    'macro di prova, premendo su frecciagiu mi porta alla riga della rispettiva frecciasu (lo so è completamente sbagliata!)
    Sub versogiu()
        Dim eShape As Shape
        Dim sShape As Shape
        Dim MyRange As Range
        Set MyRange = activesheet.Range("A17:A1000")
        For Each eShape In activesheet.Shapes
            If Not Intersect(Range(eShape.TopLeftCell.Address), MyRange) Is Nothing Then
                ShpRow = eShape.TopLeftCell.Row
                If eShape.Name = ShpRow And eShape.ShapeStyle = msoShapeStylePreset39 Then
                    ActiveWindow.ScrollRow = ShpRow
                    activesheet.Range("B" & ShpRow & ":BC" & ShpRow).Select
                    GoTo Fine
                Else
                End If
            End If
        Next
    Fine:
    End Sub
    
    '------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------
    
    'macro di prova, premendo su frecciasu mi porta alla riga della rispettiva frecciagiu
    Sub versosu()
    End Sub


  • di patel data: 10/01/2017 19:17:56

    allega un file di esempio funzionante


  • di Massi data: 13/01/2017 15:46:29

    Ho allegato il file originale (inserimento di fatture fondamentalmente) togliendo dati sensibili e semplificando il suo funzionamento alla problematica di questa discussione.
    Cliccando il pulsante [+] si apre una userform che tramite "voce1" mi fa inserire i dati in tabella.
    Inserendo i valori nella userform "Voce1" possono presentarsi due situazioni: i dati vengono scritti su una riga (fatture che scadono lo stesso mese di emissione) oppure i dati vengono scritti su due righe (fatture che scadono mesi successivi al mese di emissione).
    Nel secondo caso, vengono create due frecce nella colonna "A" (una rossa, frecciagiu, e una verde, frecciasu).
    Ogni volta che aggiungo dei dati in tabella quindi potrebbero crearsi altre frecciagiu e freccia su e potrei ritrovarmi con 100 frecciagiu e 100 frecciasu.
    Quello che vorrei fare e che cliccando su una frecciagiu essa mi porti a visualizzare e mi evidenzi la sua frecciasu corrispondente.