07/05/2023 - Marius44 ha scritto:
Ciao
Come ottieni questa riga: “Pertanto in Range Address mi ritrovo questa selezione:”
Prova a pubblicare il codice che utilizzi.
Ciao,
Mario
Ciao
semplicemente su evento Change del foglio di lavoro
Private Sub Worksheet_Change(ByVal Target As Range)
Se premuto il tasto Canc nel Range Target si ha le aree selezionata
e in questo esempio si ha: $11:$11,$A$13,$A$14,$16:$16,$A$18,$A$19,$10:$1
da questo range devo solo trattare ciò che non è “Riga Intera” e passare alla mia Function solo le altre aree selezionate
Potrei Splittare la stringa in un Array e costruire un nuovo oggetto Range da passare alla mia Function, però se c'è un metodo più consono sarebbe molto meglio.
Per esempio mi sono creato questa function per avere un range senza le aree di righe intere:
Sub myNewRange(ByRef Target As Range)
' create an array by splitting the range
Dim arySplit() As String
arySplit = Split(Target.Address, ",")
' create string for the new range
Dim strNewRange As String
Dim iX As Integer
For iX = 0 To UBound(arySplit)
If Range(arySplit(iX)).Columns.Count < ActiveSheet.Columns.Count Then strNewRange = strNewRange & IIf(Trim(strNewRange) = vbNullString, "", ",") & arySplit(iX)
Next iX
' return new range
If strNewRange <> vbNullString Then Set Target = Range(strNewRange) Else Set Target = Nothing
End Sub
quindi passo alla function l'oggetto range = $11:$11,$A$13,$A$14,$16:$16,$A$18,$A$19,$10:$10
e la function mi ritorna un oggetto Ragne = $A$13,$A$14,$A$18,$A$19
Non mi piace un granchè questo metodo e preferirei usare un approccio migliore se esiste.
A questo punto la mia Function riceve l'oggetto Range per eliminare il contenuto di talune celle con il For Each In Selection:
Private Sub Worksheet_Change(ByVal Target As Range)
' if column 1 and cell => 1 and <= max number cells... clean up the celles
If Target.Column = 1 And Target.Rows.Count >= 1 And Target.Columns.Count <= iColumnE Then
' set EnableEvents to prevent recursive calls to worksheet event functions
Application.EnableEvents = False
' clean up the cells
MyClearRowsMultiple Target
' set EnableEvents to restore events
Application.EnableEvents = True
End If
End Sub
___________________________________________________________________________________________________________________________
In un Modulo viene richiama la Function MyClearRowsMultiple :
' CLEAR ROW ON SINGLE OR MULTIPLE SELECTION
Sub MyClearRowsMultiple(Target As Range)
Dim rngCellSelect As Range
Dim rngCell As Range
' if the cell is selected in column 1 then it clears the area in the row
If Not Intersect(Range("A:A"), Target) Is Nothing Then
For Each rngCell In Selection
' check only column 1
If rngCell.Column = 1 Then
' clear from column start to column end the contents of the row
rngCell.Range(Cells(rngCell.Count, iColumnS - 1), Cells(rngCell.Count, iColumnE)).ClearContents
' save last selected cell
Set rngCellSelect = rngCell
End If
Next rngCell
' move to the last selected cell
rngCellSelect.Select
End If
End Sub
Obbiettivo: Evitare che il loop For Each range In Selection legga inutilmente tutte le celle per le righe intere selezionate. E' solo perdita di tempo perchè basterebbe leggere e scorrere solo le celle che non appartengano a Righe Intere.
(per lo scopo prefissato funziona, ma legge una miriade di celle inutilmente)
Grazie