Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Guandrake,
volendo utilizzare un approcio differente, senza la necessità di filtrare i dati della tabella si potrebbe pensare ad una macro come quella di questo file di esempio:
File esempio: File Esempio #3
Questa la macro, che utilizza alcune delle variabili nominate come nella precedente, che elabora i dati dopo che gli stessi sono memorizzati in una matrice andando a modifivare i valori presenti nella matrice per poi riportare la stessa matrice dati nella medesima posizione originaria.
'---
Option Explicit
Sub ElaboraTabellaDati()
Const sNomeFoglioTabella As String = "Foglio1"
Const sPrimaCellaTabella As String = "A1"
Const sColonnaCriterio As String = "J"
Const sColonnaTesto As String = "F"
Const sColonnaDaCopiare As String = "O"
Const sColonnaInCuiIncollare As String = "R"
Const sCriterio As String = "LAN"
Dim Twb As Workbook
Dim WsTabella As Worksheet
Dim rTabellaDati As Range
Dim NumeroRecord As Long
Dim arrDati() As Variant
Dim iPrimaColonna As Long
Dim iColCriterio As Long
Dim iColTesto As Long
Dim iColDaCopiare As Long
Dim iColInCuiIncollare As Long
Dim valCriterio As String
Dim i As Long
On Error GoTo Errore
Set Twb = ThisWorkbook
Set WsTabella = Twb.Worksheets(sNomeFoglioTabella)
With WsTabella
With .Range(sPrimaCellaTabella)
With .CurrentRegion
NumeroRecord = .Rows.Count - 1
If NumeroRecord = 0 Then Exit Sub
Set rTabellaDati = .Offset(1).Resize(NumeroRecord)
arrDati = rTabellaDati.Value
'arrDati = rTabellaDati.Formula
End With
iPrimaColonna = .Columns(1).Column
End With
iColCriterio = .Columns(sColonnaCriterio).Column - iPrimaColonna + 1
iColTesto = .Columns(sColonnaTesto).Column - iPrimaColonna + 1
iColDaCopiare = .Columns(sColonnaDaCopiare).Column - iPrimaColonna + 1
iColInCuiIncollare = .Columns(sColonnaInCuiIncollare).Column - iPrimaColonna + 1
End With 'WsTabella
For i = 1 To NumeroRecord
valCriterio = UCase(Right(arrDati(i, iColCriterio), Len(sCriterio)))
Select Case valCriterio
Case sCriterio
arrDati(i, iColTesto) = "CD"
arrDati(i, iColInCuiIncollare) = arrDati(i, iColDaCopiare)
arrDati(i, iColDaCopiare) = Empty
Case Is <> sCriterio
arrDati(i, iColTesto) = "DVD"
End Select
Next i
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
rTabellaDati.Value = arrDati
'rTabellaDati.Formula = arrDati
MsgBox "Elaborazione terminata.", vbInformation, "ElaboraTabellaDati"
RiprendiErrore:
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.EnableEvents = True
End With
Exit Sub
Errore:
MsgBox "Errore n. " & Err.Number & vbNewLine & _
Err.Description, vbCritical, "Errore VBA"
Resume RiprendiErrore
End Sub
'---
Nota che se nella tua tabella fossero presenti delle formule da preservare potresti sostituire
arrDati = rTabellaDati.Value
con
'arrDati = rTabellaDati.Formula
e
rTabellaDati.Value = arrDati
con
'rTabellaDati.Formula = arrDati
dove adesso sono attive le righe dove vengono utilizzati i valori e non le "formule"
A mio parere questo tipo di approccio è più "elastico" e nel caso di molte righe di dati più rapido nell'esecuzione.
ciao