Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Vladimiro,
Ciao Norman,
Ho alcune ulteriori domande:
- I valori in ogni riga dell'intervallo C23:F27 sono inseriti manualmente o sono il risultato di formule ? Sono inseriti manualmente
- Nel primo caso, i valori vengono inseriti in sequenza nelle celle della riga o i dati vengono copiati nella riga in un'unica operazione di copia ? Vengono inseriti in sequenza.
- Con riferimento al secondo scenario, se la riga da cui partire fosse (ad esempio) la riga 28 con un nuovo inserimento nell'intervallo di celle C28 : F28, ho ragione nel ritenere che l'intervallo B23:B27 debba essere copiato nell'intervallo A23: A27? Esatto.
Un ulteriore domanda.
Siccome c'è la possibilità di avere anche valore nullo nelle celle della colonna B, naturalmente dopo aver inserito i dati nell'intervallo C : F della riga corrispondente, crea qualche problema nella macro?
Esempio:
Come puoi vedere, nella riga 28, dopo aver inserito i dati nell'intervallo di celle C28 : F28, il valore della cella B28 è nullo e di conseguenza, con la macro, dovrebbe essere nullo anche il valore della cella A28 rimanendo nullo anche nei futuri inserimenti:
A condizione di aver compreso appieno, nel caso del primo scenario, nel modulo di codice del foglio di interesse prova:
'========>>
Option Explicit
'-------->>
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, Rng2 As Range, RngA As Range, RngB As Range, rRow As Range
Const sIntervallo As String = "D:F" 'D23:F27"
Const iPrimaRiga As Long = 23
With Me.Range(sIntervallo)
Set Rng = .Columns(.Columns.Count)
Set Rng = Rng.Resize(Me.UsedRange.Rows.Count - iPrimaRiga + 1).Offset(iPrimaRiga - 1)
End With
Set Rng2 = Intersect(Rng, Target)
If Not Rng2 Is Nothing Then
On Error GoTo XIT
Application.EnableEvents = False
For Each rRow In Rng2.Cells
With rRow
Set RngA = Intersect(.EntireRow, Me.Columns("A"))
Set RngB = Intersect(.EntireRow, Me.Columns("B"))
If IsEmpty(RngA) Then
RngA.Value = RngB.Value
End If
End With
Next rRow
End If
XIT:
Application.EnableEvents = True
End Sub
'<<========
Nel caso del secondo scenario, prova qualcosa del genere:
'========>>
Option Explicit
'-------->>
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, Rng2 As Range, Rng3 As Range
Dim RngA As Range, RngB As Range, rRow As Range
Dim bFlag As Boolean
Const sIntervallo As String = "D:F"
Const iPrimaRiga As Long = 23
Const iRiga\_da\_Partire As Long = 28
With Me.Range(sIntervallo)
Set Rng = .Columns(.Columns.Count)
Set Rng = Rng.Resize(Me.UsedRange.Rows.Count - iPrimaRiga + 1).Offset(iPrimaRiga - 1)
End With
Set Rng2 = Intersect(Rng, Target)
If Not Rng2 Is Nothing Then
bFlag = Rng2.Row = iRiga\_da\_Partire
On Error GoTo XIT
Application.EnableEvents = False
If bFlag Then
Set Rng3 = Intersect(Rng.Resize(iRiga\_da\_Partire - iPrimaRiga).EntireRow, Me.Columns("B"))
Rng3.Offset(0, -1).Value = Rng3.Value
End If
For Each rRow In Rng2.Cells
With rRow
Set RngA = Intersect(.EntireRow, Me.Columns("A"))
Set RngB = Intersect(.EntireRow, Me.Columns("B"))
If IsEmpty(RngA) Then
RngA.Value = RngB.Value
End If
End With
Next rRow
End If
XIT:
Application.EnableEvents = True
End Sub
'<<========
Potresti scaricare il mio file di prova Vladimiro20210609.xlsm
===
Regards,
Norman