Ciao Samuele,
Ho una tabella che va da C8 ad L8 con tante righe. Devo creare una macro associata ad un pulsante in modo tale che mi copi soltanto le righe che presentano un determinato valore, 0 nella colonna J oppure un valore <della data di oggi che si trova nella Colonna G. Queste righe che presentano questi valori devono essere tagliate e incollate in un'altra tabella che si trova su un altro foglio della stessa cartella.
Se disponi di Excel 365, potresti ottenere i risultati desiderati con una semplice formula.
Più in particolare se i dati di origine si trovano in una tabella Excel, Tabella1, e le colonne G e J della tabella hanno le intestazioni Dati e Importo, la seguente formula estrarrà i dati richiesti:
**=FILTRO(Tabella1;(Tabella1[Importo]=0)\*(Tabella1[Data]<OGGI()))**
Tieni presente che questa formula deve essere inserita solo in una cella poiché la funzione FILTRO() si espande automaticamente per restituire tutti i dati richiesti.
Se hai una versione precedente di Excel, o se preferisci sfruttare VBA, potresti provare qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Alt+IM per inserire un nuovo modulo di codice
- Nel nuovo modulo vuoto, incolla il seguente codice:
'========>>
Option Explicit
'-------->>
Public Sub Tester()
Dim WB As Workbook
Dim srcSH As Worksheet, destSH As Worksheet
Dim srcRng As Range, destRng As Range, headerRng As Range
Dim oTabella As ListObject
Dim arrIn As Variant, arrOut As Variant
Dim i As Long, j As Long, iCtr As Long
Dim UB As Long, UB2 As Long
Const sFoglio\_Sorgente As String = **"Foglio1" '<<=== Modifica**
Const sFoglio\_Destinazione As String = **"Foglio2" '<<=== Modifica**
Const sTabella As String = **"Tabella1" '<<=== Modifica**
Set WB = ThisWorkbook
With WB
Set srcSH = .Sheets(sFoglio\_Sorgente)
Set destSH = .Sheets(sFoglio\_Destinazione)
End With
Set oTabella = srcSH.ListObjects(sTabella)
With oTabella
Set srcRng = .DataBodyRange
Set headerRng = .HeaderRowRange
End With
arrIn = srcRng.Value2
UB = UBound(arrIn)
UB2 = UBound(arrIn, 2)
ReDim arrOut(1 To UB, 1 To UB2)
For i = 1 To UB
If arrIn(i, 5) < Date And arrIn(i, 8) = 0 Then
iCtr = iCtr + 1
For j = 1 To UB2
arrOut(iCtr, j) = arrIn(i, j)
Next j
End If
Next i
Set destRng = destSH.Range("A2")
With destRng
destSH.Range(.Cells(1), .End(xlDown)).Resize(, UB2).ClearContents
.Resize(iCtr, UB2).Value = arrOut
.Cells(0).Resize(1, UB2).Value = headerRng.Value
End With
End Sub
'<<========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel.
- Salva il file con l'estensione xlsm
- Assegna la macro Tester al tuo pulsante
Potresti scaricare il mio file di prova Samuele20230101.xlsm In cui dimostro sia la formula che l'approccio VBA.
A causa di un problema con l'attuale editor del forum, che inserisce righe vuote indesiderate nel codice copiato dal forum, suggerirei di copiare il mio codice direttamente dal mio file di prova.
===
Regards,
Norman
