Ciao Francesco,
avrei bisogno di estrapolare dei dati da una tabella excel che ha per ogni riga: codice cliente, nome cliente, varie colonne di dati come fatturato, modalità pagamento ecc...) e nome venditore.
Io dovrei estrapolare da tale foglio tanti fogli excel quanti sono i venditori; in ogni foglio dovranno quindi esserci solamente tutti i dati relativi ai clienti di quel venditore. Ho provato con cerca vert ma essendoci più valori ricorrenti, non funziona.
Potrebbe funzionare una pivot, ma, visto che per ogni riga cliente dovranno esserci anche delle colonne fisse di note da aggiungere manualmente, non riesco a gestirla.
Un modo per raggiungere questo obiettivo sarebbe sfruttare VBA.
Quindi, a titolo di esempio, prova 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 SH\_Tabella As Worksheet, SH\_Venditore As Worksheet
Dim oTabella As ListObject
Dim Rng\_Tabella As Range
Dim arrDati As Variant, arrVenditori() As Variant
Dim sIntestazione As String, sVenditore As String
Dim i As Long, iColonna As Long, iCtr As Long
Const sFoglio\_Tabella As String = **"Foglio1" '<<=== Modifica**
Const sTabella As String = **"Tabella1" '<<=== Modifica**
Const sColonna\_Venditore As String = **"E" '<<=== Modifica**
Set WB = ThisWorkbook
Set SH\_Tabella = WB.Sheets(sFoglio\_Tabella)
With SH\_Tabella
Set oTabella = .ListObjects("Tabella1")
iColonna = .Columns(sColonna\_Venditore).Column
End With
Set Rng\_Tabella = oTabella.DataBodyRange
sIntestazione = Rng\_Tabella.Offset(-1, 0).Cells(1, sColonna\_Venditore)
arrDati = Rng\_Tabella.Value
For i = 1 To UBound(arrDati) ' items\_range.Rows.Count
If arrDati(i, iColonna) <> "" Then
sVenditore = arrDati(i, iColonna)
DeleteSheetWithoutWarning sVenditore
With WB
Set SH\_Venditore = .Worksheets.Add(After:=.Sheets(.Sheets.Count))
End With
With SH\_Venditore
.Name = sVenditore
.Range("A1").Formula2 = "=" & oTabella.Name & "[#Headers]"
.Range("A2").Formula2 = "=FILTER(" & sTabella & \_
"," & sTabella & "[" & sIntestazione & "] = """ \_
& sVenditore & """)"
.Range("A1").CurrentRegion.EntireColumn.AutoFit
End With
End If
iCtr = iCtr + 1
ReDim Preserve arrVenditori(1 To iCtr)
arrVenditori(iCtr) = sVenditore
Next i
Call MsgBox(Prompt:="Fatto!" & vbNewLine \_
& "I segenti fogli sono ststi creati/aggiornati: " \_
& vbNewLine & vbNewLine & Join(arrVenditori, vbNewLine), \_
Buttons:=vbInformation, \_
Title:="REPORT")
End Sub
'-------->>
Private Sub DeleteSheetWithoutWarning(sheet_name As String)
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Worksheets(sheet\_name).Delete
On Error GoTo 0
Application.DisplayAlerts = True
End Sub
'<<========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel.
- Salva il file con l'estensione xlsm
- Alt+F8 per aprire la finestra di gestione delle macro
- Seleziona Tester
- Esegui
Questo codice presuppone che la tabella originale sia una tabella di Excel. A seconda delle tue esigenze, il codice potrebbe essere modificato automaticamente per creare fogli aggiuntivi ogni volta che un nuovo fornitore viene aggiunto alla tabella dati originale,
Potresti scaricare il mio file di prova Francesco20220823.xlsm
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
