VBA filtrare univoci e mostrarli

Davide78

New Member
Joined
Apr 20, 2023
Messages
17
Office Version
  1. 2019
Platform
  1. Windows
Salve, uso abitualmente una macro molto utile (della quale non ricordo la provenienza) che mi permette di filtrare i valori univoci di una selezione.
La macro prevede che il risultato debba essere incollato a partire da una cella che da scegliere durante il procedimento.
Mi piacerebbe invece che questo risultato fosse semplicemente mostrato in una finestra come quelle che si creano quando si realizza una useform, scegliendo magari in un secondo momento di copiare questi valori e di incollarli dove si vuole.
Come dovrebbe essere corretta la macro?


Ringrazio anticipatamente
 

Excel Facts

Waterfall charts in Excel?
Office 365 customers have access to Waterfall charts since late 2016. They were added to Excel 2019.
Non e' chiaro l'obiettivo, visto che la macro già scrive l'elenco degli "unici", quindi potrebbe essere sufficiente visualizzare quell'elenco sapendo che e' a disposizione anche dopo.
Comunque, per provare come viene:
-nel tuo progetto vba aggiungi una userform e inseriscigli un TextBox
-nelle proprietà del Textbox setta Multiline = True e Scrollbar = 3 ScrollbarBoth
-fai la form e il textbox abbastanza larghi da contenere le stringhe che ci scriveremo
-aggiungi alla tua macro le righe necessarie per popolare il textbox e visualizzare la form (le righe marcate +):
VBA Code:
Areavalori.AdvancedFilter Action:=xlFilterCopy, copytorange:=Celladestinazione, Unique:=True
UserForm1.TextBox1.Text = (Application.WorksheetFunction.TextJoin(Chr(10), True, Celladestinazione.CurrentRegion))     '+
UserForm1.Show                                                                                                         '+
End Sub
(presuppone che la form si chiami userform1 e il textbox TextBox1; adatta se hai modificato i nomi agli elementi)

Potrebbe piuttosto essere utile creare un foglio dedicato solo a contenere l'elenco degli "Unici", in modo da sapere sempre dove si trovano (ora l'utente sceglie la posizione di destinazione.
Ad esempio, se chiamiamo questo foglio UniciZc allora la macro potrebbe essere:
VBA Code:
Sub Filtra_Univoci22()
Dim Areavalori As Range
'Dim Celladestinazione As Range
Set Areavalori = Application.InputBox(prompt:="Seleziona i valori da filtrare (RICORDARSI INTESTAZIONE):", Type:=8)
'Set Celladestinazione = Application.InputBox(prompt:="Seleziona la cella dove incollare:", Type:=8)
'Areavalori.AdvancedFilter Action:=xlFilterCopy, copytorange:=Celladestinazione, Unique:=True
Sheets("UniciZc").Range("A1").CurrentRegion.ClearContents
Areavalori.AdvancedFilter Action:=xlFilterCopy, copytorange:=Sheets("UniciZc").Range("A1"), Unique:=True
'
'Ancora utile??
UserForm1.TextBox1.Text = (Application.WorksheetFunction.TextJoin(Chr(10), True, Sheets("UniciZc").Range("A1").CurrentRegion))
UserForm1.Show
'
End Sub
Ho lasciato ma "commentate" le righe che sono state sostituite solo per evidenziare le modifiche, possono essere rimosse.

Fai sapere...
 
Upvote 0
Intanto grazie, mi sembra di averle seguite ma ottengo errore, due domande:
1) la riga Set Celladestinazione = Application.InputBox(prompt:="Seleziona la cella dove incollare:", Type:=8) va eliminata, corretto? la "destinazione" dovrebbe essere la textbox
2) la riga Set Areavalori = Application.InputBox(prompt:="Seleziona i valori da filtrare (RICORDARSI INTESTAZIONE):", Type:=8) va invece lasciata, corretto?

L'errore che mi viene indicato è: Errore di runtime 5 chiamata di routine o argomento non validi
Ecco la mia correzione

VBA Code:
Sub Filtra_Univoci()
Dim Areavalori As Range
Dim Celladestinazione As Range
Set Areavalori = Application.InputBox(prompt:="Seleziona i valori da filtrare (RICORDARSI INTESTAZIONE):", Type:=8)
Areavalori.AdvancedFilter Action:=xlFilterCopy, copytorange:=Celladestinazione, Unique:=True
UserForm1.TextBox1.Text = (Application.WorksheetFunction.TextJoin(Chr(10), True, Celladestinazione.CurrentRegion))     '+
UserForm1.Show
End Sub

E in caso servisse il mio file

Grazie per le indicazioni
 
Upvote 0
Il textbox vive fintanto che non chiudi la userform, non e’ un elemento che puoi usare come storage per quando “in un secondo tempo li vorrai incollare dove si vuole”; quindi Set Celladestinazione = Application.InputBox(etc etc ) deve rimanere

A questo punto secondo me ti conviene usare il secondo metodo, basato sulla Sub Filtra_Univoci22, che mette di default la lista dei valori filtrati nel foglio UniciZc (che potrebbe anche essere nascosto); con questa Sub devi solo indicare l’area da filtrare.

Non allegare file Zip: i file excel sono gia' file zippati, quindi il guadagno e' marginale e si aggiunge solo il processo di unzipping ed estrazione.
Ciao
 
Upvote 0
Ciao, ho seguito il tuo consiglio e ho provato la tua macro e usare un foglio di appoggio può essere molto utile anche se un pò scomodo perchè dovrei crearlo su ogni file dove mi serve, ti chiedo questo però, da poco ho imparato a sfruttare il file/cartella personal.xlsb e a renderlo sempre attivo e visibile, si potrebbe creare li il foglio UniciZC? come si dovrebbe correggere la tua macro Filtra_Univoci22?

Continuo però a cercare una soluzione del tipo "aziona una macro e mostra i risultati in qualcosa che poi scompare" e vorrei mostrarti una soluzione che ho trovato googolando, ecco il link:
Vorrei usare la textbox nella useform che mi hai fatto preparare al posto della combobox che richiede questa macro.

Grazie di nuovo per tuoi aiuti e suggerimenti
 
Upvote 0
Non capisco se stai solo facendo pratica o vuoi risolvere un problema; ne' mi e' chiaro se la lista ti basta visionarla e poi puo' scomparire o se invece deve rimanere a disposizione.

Per usare la Sub Filtra_Univoci22 sfruttando il file Personal devi indirizzare in modo esplicito workbook & Worksheet; esempio:
VBA Code:
Sub Filtra_Univoci33()
Dim Areavalori As Range
'Dim Celladestinazione As Range
Set Areavalori = Application.InputBox(prompt:="Seleziona i valori da filtrare (RICORDARSI INTESTAZIONE):", Type:=8)
'Set Celladestinazione = Application.InputBox(prompt:="Seleziona la cella dove incollare:", Type:=8)
'Areavalori.AdvancedFilter Action:=xlFilterCopy, copytorange:=Celladestinazione, Unique:=True
Workbooks("PERSONAL.XLSB").Sheets("UniciZc").Range("A1").CurrentRegion.ClearContents
Areavalori.AdvancedFilter Action:=xlFilterCopy, copytorange:=Workbooks("PERSONAL.XLSB").Sheets("UniciZc").Range("A1"), Unique:=True
'
'Ancora utile??
UserForm1.TextBox1.Text = (Application.WorksheetFunction.TextJoin(Chr(10), True, Workbooks("PERSONAL.XLSB").Sheets("UniciZc").Range("A1").CurrentRegion))
UserForm1.Show
'
End Sub
Ovviamente userai il nome del TUO file personal.xyz

Noterai che ho immaginato di avere su Personal un foglio UniciZc in modo che in futuro, quando ti verra' in mente di usare Personal per altri scopi ancora, non ci sia conflitto sull'uso dei fogli

Una macro che visualizza in un Userform-Textbox l'elenco degli unici senza nessun obiettivo di conservazione:
VBA Code:
Sub Univoci_123()
Dim Areavalori As Range, UList As String, myC As Range, myOut(), oCnt As Long
'
Set Areavalori = Application.InputBox(prompt:="Seleziona i valori da filtrare (RICORDARSI INTESTAZIONE):", Type:=8)
ReDim myOut(1 To Areavalori.Rows.Count)
For Each myC In Areavalori
    If IsError(Application.Match(myC.Value, myOut, False)) Then
        oCnt = oCnt + 1
        myOut(oCnt) = myC.Value
    End If
Next myC
'
UserForm1.TextBox1.Text = Application.WorksheetFunction.TextJoin(Chr(10), True, myOut)
UserForm1.Show
End Sub
(presuppone la presenza della Userform con il Textbox, come era per la Sub Filtra_Univoci22 e come sarebbe per la Sub Filtra_Univoci33)
 
Upvote 0
Solution
Ciao e intanto grazie ancora delle spiegazioni...sicuramente voglio risolvere un problema, ma mi piace risolverlo come ho già in mente di utilizzare la soluzione nelle varie casistiche quotidiane e inoltre non mi dispiace l'idea di fare della pratica se intravedo la possibilità di capirci qualcosa.
Con le tue indicazioni ho corretto la macro Filtra_Univoci22() inserendola nel file personal.xlsb e sembra funzionare perfettamente!
Invece, per la macro Univoci_123(), anch'essa inserita nel file personal.xlsb, assieme alla useform con la textbox, ottengo sempre un errore di runtime 438 proprietà o metodi non supportati dall'oggetto e in debug la riga che viene indicata è:
UserForm1.TextBox1.Text = Application.WorksheetFunction.TextJoin(Chr(10), True, myOut)

Se ti viene in mente cosa potrebbe essere bene, altrimenti va benissimo l'aiuto che mi hai già dato del quale ti ringrazio nuovamente
 
Upvote 0
Controlla sul foglio Excel se hai la funzione Testo.Unisci, non ricordo se Office 2019 ce l'aveva (ma sembrerebbe di no)
 
Upvote 0

Forum statistics

Threads
1,223,228
Messages
6,170,871
Members
452,363
Latest member
merico17

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top