ความคิดเห็น •

  • @filippo61
    @filippo61 3 ปีที่แล้ว +1

    Grazie alla semplicita' con cui spieghi il codice VBA, mi sto appassionando sempre di piu'.

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Mi fa piacere Filippo.

  • @raffaelesala992
    @raffaelesala992 3 ปีที่แล้ว +1

    Chiarissimo, almeno nella spiega. Adesso devo provare.... Comunque, VBA for ever!!👍👍
    Ormai non posso più fare a meno di seguirti. Grazie Nicola

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Ottimo, grazie a te :)

  • @demfra9477
    @demfra9477 3 ปีที่แล้ว +1

    Ciao Nick buon Natale e grazie per questo corso che mi sta facendo finalmente capire come affrontare la creazione di un gestionale completo .

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Ciao, grazie a buone feste anche a te.

  • @francescostentella6809
    @francescostentella6809 3 ปีที่แล้ว +1

    Mi è stato utilissimo. Grazie

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Mi fa piacere, grazie a te per il commento.

  • @armandosamuelli1213
    @armandosamuelli1213 3 ปีที่แล้ว +1

    grazie per la chiarezza ti seguo sempre volentieri

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Ciao Armando, grazie a te per seguirmi.

  • @Sancaru72
    @Sancaru72 3 ปีที่แล้ว +3

    Ho visto molti esempi di filtri dinamici e alcuni molto complessi per fare in un solo campo quello che invece tu fai per qualsiasi campo utilizzando però un metodo più fluido, comprensibile e alla portata di tutti o quasi.

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว +1

      Grazie per il tuo riscontro Sandro, cerco di mantenere le cose più semplici possibili, anche se a volte un po' di complessità è necessaria (e lo sarà nei prossimi video).

  • @mircoastolfi3209
    @mircoastolfi3209 3 ปีที่แล้ว +1

    Sei molto bravo, complimenti e grazie per quello che fai

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Grazie a te per il commento.

  • @pspagnolo68
    @pspagnolo68 3 ปีที่แล้ว +1

    Stupendo!!

  • @marziodemin87
    @marziodemin87 3 ปีที่แล้ว +2

    Ciao, grazie mille per il corso , finalmente grazie a te inizio a capire il VBA ...veramente spieghi bene.....
    mi sento in debito
    .....ho visto in un altro corso l'utilizzo della costante vbTextCompare , penso si possa utilizzare al posto di Ucase, credo si debba utilizzare così
    If InStr(1, (Cells(i, matrice(j))), txtFiltro.Value, vbTextCompare) > 0 Then
    compila_lista
    Exit For
    End If

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว +1

      Ciao Marzio, grazie a te.
      Sì si può usare anche questo sistema, grazie per avermelo segnalato.

  • @alessandromutolo703
    @alessandromutolo703 3 ปีที่แล้ว +1

    complimenti

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Grazie Alessandro

  • @riccardovara2828
    @riccardovara2828 2 ปีที่แล้ว +1

    Ciao Nick. Sto seguendo con attenzione questo tuo belissimo corso e volevo farti una domanda sulla questione "sensitive case" tra maiuscole e minuscole .
    Tu proponi l'aggiunta del comando ucase da aggiungere alla riga di comando ma non si potrebbe più semplicemente aggiungere all'inizio della procedura, il comando " Option Compare Text"?
    Cosi facendo VBA non farebbe distinzioni tra maiuscole e minuscole.......o mi sbaglio?
    Fammi sapere.
    Ciao.

    • @NickTheGeek
      @NickTheGeek 2 ปีที่แล้ว

      Ciao Riccardo, sì senz'altro si può fare anche così; grazie per il suggerimento.

  • @enzomonteleone1961
    @enzomonteleone1961 ปีที่แล้ว +1

    Ciao Nick, complimenti per le tue competenze e per i video che metti a disposizione!!!
    Volevo chiederti se fosse possibile aggiungere in una form una combobox che potesse avere la funzione del filtro auto compilante…. Effettuare lo scroll in elenchi lunghi soprattutto quando non possono essere disposti in ordine alfabetico è complicatissimo!
    Nel caso, potresti fare un video anche in merito?
    Grazie comunque

    • @NickTheGeek
      @NickTheGeek ปีที่แล้ว

      Ciao Enzo, grazie per i complimenti.
      Riguardo a quello che mi chiedi non conosco una soluzione semplice.
      L'unica cosa che mi viene in mente è questa:
      Private Sub ComboBox1_Change()
      With Me.ComboBox1
      .List = Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value
      For i = .ListCount - 1 To 0 Step -1
      If InStr(1, .List(i), .Text, vbTextCompare) = 0 Then .RemoveItem i
      Next
      .ListRows = Application.WorksheetFunction.Min(6, .ListCount)
      End With
      End Sub
      In questo modo però devi aprire manualmente la combo dopo aver scritto il testo che ti interessa.
      Funziona così:
      1) suppongo di avere una lista di valori da A1 in giù, quindi la proprietà List riempie la combo ogni volta che viene modificato il valore al suo interno (evento Change)
      2) il ciclo For verifica i valori all'interno della combo dal basso verso l'alto
      3) la funzione Instr verifica se il testo scritto nella combo compare nei valori elencati al suo interno, e se questo non accade allora l'elemento viene eliminato
      4) la proprietà ListRows riduce il numero di righe in base a quante ce ne sono effettivamente visibili, verificando il numero minimo tra il ListCount (quindi i valori effettivamente rimanenti dopo il ciclo For) e 6, che era il numero di elementi con cui ho fatto la prova; se sono 1000 devi scrivere 1000 al posto di 6
      A questo punto, come ti scrivevo sopra, devi aprire manualmente la combo per vedere solo i valori che contengono la stringa che hai scritto.
      Un modo per ovviare potrebbe essere quello di aggiungere la linea:
      .DropDown
      subito dopo la linea con il .ListRows, in modo da aprire automaticamente la combo; il problema è che quando viene eseguita la prima volta (cioè dopo che hai digitato la prima lettera nella combo) la combo resta sempre aperta e quindi restano sempre visibili le righe vuote al suo interno.

  • @gianniserrano6877
    @gianniserrano6877 ปีที่แล้ว

    Buongiorno Nick. Volevo chiederti se esiste un modo per velocizzare la filtrazione dei dati quando la listbox è molto lunga (oltre 10000 record). Nella mia piccola esperienza l'applicazione di un filtro su una listbox molto lunga produce tempi di risposta altrettanto lunghi. Aspetto un tuo cortese riscontro. Inoltre vorrei sapere se su una listbox operano due o più filtri come si costruisce la precedenza del primo filtro rispetto all'altro o agli altri filtri? Attendo un tuo cortese riscontro. Grazie. ciao

    • @NickTheGeek
      @NickTheGeek ปีที่แล้ว

      Ciao Gianni, non so esserti molto d'aiuto.
      Per velocizzare i filtri potresti provare con le espressioni regolari; non le ho mai usate, puoi trovare informazioni cercando su Google Regex VBA.
      Per i filtri multipli, è poco fattibile per come ho impostato i filtri nelle userform, perché la ricerca dei dati da mostrare e quelli da nascondere viene eseguita sul foglio Excel e non sulla listbox, quindi dopo il primo filtro il foglio Excel resta comunque uguale a prima, e non sarebbe possibile applicare un ulteriore filtro (per meglio dire è possibile, ma sempre sui dati "completi" del foglio e non già filtrati dal primo filtro); quindi le soluzioni che mi vengono in mente sono due: o filtri i dati anche sul foglio Excel (oltre che sulla listbox), e allora ti servirà un foglio di appoggio dove copiare i dati filtrati in modo da non cancellare quelli del foglio di partenza; la vedo difficile soprattutto se hai molte righe; la seconda soluzione è applicare il filtro cercando i dati direttamente nella listbox e non nel foglio excel, ma non l'ho mai fatto quindi non so se possa funzionare.

  • @carminechilo1097
    @carminechilo1097 3 ปีที่แล้ว +1

    Grande. Io continuo a farti i complimenti perchè sei davvero bravo. Solo una curiosità (è più una pippa mentale che altro), ma al posto della matrice, potevo fare un codice del tipo:
    For j=1 to 7
    If j=7 then j=11
    .....
    Next j
    Cosa dici? Tanto è solo per una colonna. Certo, su più colonne, il tuo metodo è più veloce...

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Ciao Carmine, grazie per i complimenti. La tua mi sembra un'ottima idea per risolvere il problema specifico di questo esempio; come hai notato, sarebbe più complicato gestire situazioni in cui ci sono più "salti" tra colonne, ma in questo caso penso proprio che funzionerebbe. Grazie per il suggerimento.

  • @droitaucoeur1
    @droitaucoeur1 3 ปีที่แล้ว

    Ciao Nicola. Avresti potuto mettere tutte le larghezze di tutte le colonne in initialize, però mettendo 0 alle colonne che non volevi vedere nella listbox. Poi mettento For j = 1 To 11, invece di 1 a 6.

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Ciao Jacky, grazie.

  • @claudioc4914
    @claudioc4914 3 ปีที่แล้ว

    Lavoro magnifico !! . Volevo chiederti se puoi aiutarmi a risolvere questo problema : dovrei fare un filtro simile a quello della listbox nel video ma sul foglio1 excel e dovrei filtrare le prime 5 colonne del foglio . Ho fatto vari tentativi ma la mia conoscenza di vba evidentemente non è ancora sufficente . la text di immisione della ricerca dovrebbe essere direttamente sul foglio1 . Grazie !!

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Ciao Claudio. Non sono molto pratico di controlli ActiveX direttamente sul foglio, ma come vorresti fare il filtro? Direttamente sulla tabella cancellando o nascondendo le righe? Oppure creando la tabella filtrata da qualche altra parte nel foglio o nel file?

    • @claudioc4914
      @claudioc4914 3 ปีที่แล้ว

      @@NickTheGeek ciao Nicola la mia idea è quella di nascondere le righe sul foglio per poi lavorare su quelle righe rimaste ,anche se non so ancora se posso utilizzare quelle righe (celle ) per inserire dati da una userform. in alternativa posso utilizzare anche il secondo sistema ,cioè filtrare ed esportare le righe filtrate in un altro file senza cancellare le righe di origine. Grazie

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Nascondere le righe si è rivelato abbastanza complesso, e non so se sarà chiaro il codice che scrivo qui sotto.
      Ho messo diversi commenti e quindi leggerlo direttamente qui non è fattibile, ti consiglio di copiare tutto e incollare nell'editor di VBA.
      Il codice deve essere incollato nel modulo relativo al foglio in cui si trova la tabella con i dati.
      Oltre ai dati, nel foglio ci devono essere anche una casella di testo (TextBox1 nel codice sotto) e un pulsante (CommandButton1 nel codice sotto) inseriti come controlli ActiveX.
      Se non vuoi che, quando nascondi le righe, la casella di testo e il pulsante si spostino, posizionali al di sotto della tabella.
      Dopo le subroutine trovi anche una spiegazione.
      Tieni presente che ho fatto pochissimi test, quindi potrebbero esserci diversi casi in cui il codice non si comporta correttamente.
      Nei prossimi giorni penserò all'altro sistema con una tabella d'appoggio, ma ti chiedo subito se la tabella deve essere in un altro file o in un altro foglio, perché nel tuo commento qui sopra hai scritto file ma non so se in realtà intendevi foglio.
      Per quanto riguarda le righe nascoste, intanto servono due variabili dichiarate a livello di modulo:
      Private prima_riga_vuota As Integer
      Private lunghezza_stringa As Integer
      Poi serve una subroutine sull'evento change della textbox:
      Private Sub TextBox1_Change()
      For k = 1 To Rows.Count ' questo ciclo per k serve a verificare qual è la prima riga vuota dopo la tabella; la variabile tornerà utile per mostrare tutte le righe nel caso la casella di ricerca sia vuota o se la lunghezza della stringa scritta nella textbox è inferiore a quella precedente (cioè se è stato premuto backspace)
      If Cells(k, 1) = "" Then
      prima_riga_vuota = k
      Exit For
      End If
      Next k
      If Len(TextBox1.Value) < lunghezza_stringa Then
      Rows("1:" & prima_riga_vuota).EntireRow.Hidden = False ' se la lunghezza della stringa scritt ain questo momento nella textbox è inferiore alla lunghezza_stringa (cioè alla lunghezza che la stringa aveva prima di questo change), allora vengono mostrate tutte le righe perché il filtro deve essere riapplicato da zero su tutte le righe
      End If
      For i = 2 To prima_riga_vuota ' parto dalla riga 2 perché suppongo che ci siano intestazioni
      contatore = 0 ' il contatore serve a contare quanti campi nella riga non contengono la stringa
      For j = 1 To 5 ' da 1 a 5 perché ti serve verificare le prime 5 colonne
      If TextBox1.Value "" Then
      If InStr(LCase(Cells(i, j)), LCase(TextBox1.Value)) Then
      'Rows(i & ":" & i).EntireRow.Hidden = True
      Exit For ' se la stringa viene trovata, allora si passa alla riga successiva
      ElseIf Not InStr(LCase(Cells(i, j)), LCase(TextBox1.Value)) Then
      contatore = contatore + 1 'se la stringa non viene trovata nella cella, allora il contatore aumenta di uno
      If contatore = 5 Then Rows(i & ":" & i).EntireRow.Hidden = True ' se il contatore è 5, significa che nessuna delle colonne della riga contiene la stringa cercata, quindi la riga viene nascosta
      End If
      ElseIf TextBox1.Value = "" Then
      Rows("1:" & prima_riga_vuota).EntireRow.Hidden = False ' se la stringa da cercare è vuota, significa che si sono cancellati tutti i caratteri, quindi devono essere mostrate tutte le righe della tabella
      End If
      Next j
      Next i
      lunghezza_stringa = Len(TextBox1.Value) ' imposta la lunghezza_stringa all'effettiva lunghezza della stringa, per verificare al successivo change se la nuova lunghezza è inferiore (all'inizio di questa subroutine)
      End Sub
      In pratica:
      1) il ciclo k verifica qual è la prima riga vuota in quel momento; essendoci delle righe nascoste, altri sistemi potrebbero non funzionare, quindi ho preferito usare un For
      2) verifica se la lunghezza della stringa scritta nella textbox è minore di una variabile che viene calcolata solo alla fine (quindi la spiegazione la trovi in fondo, comunque è la lunghezza della stringa alla fine dell'evento change); all'inizio la variabile non è impostata quindi vale zero, perciò la condizione in prima battuta sarà sempre falsa.
      Se invece dovesse essere vera, significa che la lunghezza attuale della stringa è inferiore rispetto al change precedente, quindi è stato premuto il tasto backspace; in tal caso, per non perdere dati, il filtro deve essere rifatto completamente su tutta la tabella, quindi tutte le righe vengono mostrate
      3) i cicli i e j verificano ogni cella della tabella (righe x colonne)
      4) la variabile contatore, inizialmente impostata a zero, servirà a contare quante celle in una stessa riga non contengono la stringa cercata
      5) se la cella contiene la stringa, si passa subito alla riga successiva, perché la riga deve rimanere visibile
      6) se la cella non contiene la stringa, allora la variabile contatore aumenta di 1; se arriva a 5, significa che nessuna delle 5 colonne di quella riga contiene la stringa, quindi la riga viene nascosta
      7) se la textbox è vuota, allora tutte le righe vengono mostrate (forse questa istruzione è inutile, dato che per essere vuota dopo un change significa che prima non lo era, quindi la condizione è già verificata al punto 2)
      8) infine la variabile lunghezza_stringa viene impostata uguale alla lunghezza attuale della stringa; se premi backspace scatta un nuovo change, e stavolta la lunghezza della nuova stringa sarà inferiore a lunghezza_stringa, quindi la condizione del punto 2 diventa vera, e le righe vengono mostrate tutte
      Infine una subroutine sull'evento click del button:
      Private Sub CommandButton1_Click()
      Rows("1:" & prima_riga_vuota).EntireRow.Hidden = False ' la prima_riga_vuota è dichiarata a livello di modulo e viene calcolata nella subroutine dell'evento change
      End Sub
      Il bottone semplicemente ripristina la visualizzazione completa se non si vuole cancellare a mano il contenuto della textbox.

    • @claudioc4914
      @claudioc4914 3 ปีที่แล้ว

      @@NickTheGeek Intanto ti ringrazio per quello che stai facendo , per quanto riguarda l'esportazione io intendevo un altro file (cartella) se pero questo è piu complicato mi arrangio anche se si esportano su un altro foglio dello stesso file.
      Aprofitto per augurarti Buona Pasqua !

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Per scrivere il risultato in un altro file o foglio, il giro è leggermente meno complicato rispetto a nascondere le righe.
      In questo esempio ho evitato il pulsante perché mi sembrava inutile (e forse lo era anche nel primo caso), quindi funziona tutto solo scrivendo o cancellando il contenuto della textbox.
      Anche qui non ho fatto molti test, quindi verifica anche tu.
      Ho usato due file chiamati test.xlsm (quello dove scrivere nella textbox) e test2.xlsm (quello dove incollare i dati copiati dall'altro). I fogli si chiamano rispettivamente Foglio9 e Foglio10 perché erano quelli che avevo a disposizione, ovviamente devi personalizzare in base ai nomi dei tuoi file/fogli.
      Se vuoi solo copiare in un foglio all'interno dello stesso file, semplicemente rimuovi dal codice tutti i riferimenti ai Workbooks.
      Ti raccomando di fare copie di entrambi i file prima di provare il codice, perché se qualcosa va storto potrebbe rovinare il contenuto.
      La subroutine deve essere scritta nel modulo relativo al Foglio9 del file test.xlsm. Nel foglio devono essere presenti la tabella con i dati e la TextBox1.
      Grazie per gli auguri e buona pasqua anche a te.
      Private Sub TextBox1_Change()
      Application.ScreenUpdating = False 'impedisce lo sfarfallio nel passaggio da un foglio all'altro, ma rimane nel caso usi fogli su file diversi, come in questo caso
      ultima_riga = Cells(Rows.Count, "A").End(xlUp).Row
      Workbooks("test2.xlsm").Sheets("Foglio10").Activate 'dato che il codice si trova nel foglio9, ogni volta che si eseguono operazioni su celle del foglio10 è sempre necessario specificarlo (vedi sotto) anche se è stato attivato con questa riga
      ultima_riga_foglio10 = Sheets("Foglio10").Cells(Rows.Count, "A").End(xlUp).Row 'obbligatorio scrivere Sheets("Foglio10") prima di Cells (vedi sopra)
      If ultima_riga_foglio10 1 Then 'se c'è solo l'intestazione non occorre cancellare niente, se invece ci sono anche dati allora cancella tutto il contenuto del Foglio10 tranne le intestazioni
      Sheets("Foglio10").Range(Sheets("Foglio10").Cells(2, 1), Sheets("Foglio10").Cells(ultima_riga_foglio10, 6)).Select
      Selection.ClearContents
      Sheets("Foglio10").Cells(1, 1).Select
      End If
      Workbooks("test.xlsm").Sheets("Foglio9").Activate
      For i = 2 To ultima_riga ' parto dalla riga 2 perché suppongo che ci siano intestazioni
      For j = 1 To 5 ' da 1 a 5 perché ti serve verificare le prime 5 colonne
      If TextBox1.Value "" And InStr(LCase(Cells(i, j)), LCase(TextBox1.Value)) Then 'verifichiamo anche che la textbox non sia vuota, altrimenti tutte le righe della tabella vengono copiate nel foglio10
      Rows(i & ":" & i).Select 'se la stringa è presente nella cella, seleziona e copia la riga
      Selection.Copy
      Workbooks("test2.xlsm").Sheets("Foglio10").Activate
      ultima_riga_foglio10 = Sheets("Foglio10").Cells(Rows.Count, "A").End(xlUp).Row
      Sheets("Foglio10").Range("A" & ultima_riga_foglio10 + 1).Select 'seleziona la prima riga disponibile (colonna A)
      ActiveSheet.Paste 'incolla nella riga selezionata
      Sheets("Foglio10").Cells(1, 1).Select
      Workbooks("test.xlsm").Sheets("Foglio9").Activate
      Application.CutCopyMode = False 'elimina la selezione (il tratteggio) dalla riga copiata
      Cells(1, 1).Select
      TextBox1.Activate
      Exit For 'passa alla riga successiva della tabella
      End If
      Next j
      Next i
      End Sub

  • @droitaucoeur1
    @droitaucoeur1 3 ปีที่แล้ว

    Un'altra cosa che ho dimenticato di dirti, e non è per criticare. Normalmente quando fai un ciclo sulle colonne, avresti dovuto scrivere così:
    For j = 1 To 6
    ListBox1.List(xxxxx.ListCount -1, j -1) = Sheets("xxx").Cells(i, j)
    next j
    ListBox1.List(xxxxx.ListCount -1, 11) = Sheets("xxx").Cells(i, 11)
    Visto gli esempi che hai dato nelle video precedenti.

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Ciao Jacky, grazie.

  • @alfredobusto107
    @alfredobusto107 3 ปีที่แล้ว

    In realtà non è un commento ma una domanda. Se per popolare la lista uso la proprietà Rowsource (perchè ho più di 10 colonne) come posso fare tutto quello che serve nel Change della casella di testo? Se avrai voglia di aiutarmi te ne sarò grato. Comunque grazie in anticipo

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Non ho mai provato, ma in questo caso dovresti filtrare direttamente i dati sul foglio Excel, magari usando un foglio d'appoggio, e quindi usare RowSource sulla tabella filtrata. In pratica, rispetto al video, dovresti applicare la condizione "If Instr()" per scrivere sul foglio d'appoggio anziché direttamente nella listbox.
      Non so se funzionerebbe così, se non ne vieni fuori provo a scriverti un codice d'esempio.

    • @alfredobusto107
      @alfredobusto107 3 ปีที่แล้ว

      @@NickTheGeek si grazie se mi mandi un codice di esempio te ne sarei enormemente grato. Grazie

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว +1

      Non ho provato, ma penso che funzioni: supponiamo di avere 10 colonne del foglio Clienti da copiare nella listbox.
      Il caricamento della listbox all'Initialize sarebbe questo:
      lstArchivioClienti.RowSource = "A2:F" & ultima_riga_clienti
      (supponendo ovviamente di aver già attivato il foglio e calcolato l'ultima_riga_clienti).
      L'evento Change sulla textbox dovrebbe essere questo (qui per brevità non dichiaro le variabili):
      Private Sub txtFiltro_Change()
      riga_da_scrivere = 1
      Sheets("Appoggio").Activate
      Cells.ClearContents
      lstArchivioClienti.RowSource = ""
      Sheets("Clienti").Activate
      ultima_riga_clienti = Cells(Rows.Count, "A").End(xlUp).Row
      For i = 2 To ultima_riga_clienti
      Sheets("Clienti").Activate
      For j = 1 To 10
      If InStr(LCase(Cells(i, j)), LCase(txtFiltro.Value)) Then
      Sheets("Appoggio").Activate
      Cells(riga_da_scrivere, 1) = Sheets("Clienti").Cells(i, 1)
      Cells(riga_da_scrivere, 2) = Sheets("Clienti").Cells(i, 2)
      Cells(riga_da_scrivere, 3) = Sheets("Clienti").Cells(i, 3)
      Cells(riga_da_scrivere, 4) = Sheets("Clienti").Cells(i, 4)
      Cells(riga_da_scrivere, 5) = Sheets("Clienti").Cells(i, 5)
      Cells(riga_da_scrivere, 6) = Sheets("Clienti").Cells(i, 6)
      Cells(riga_da_scrivere, 7) = Sheets("Clienti").Cells(i, 7)
      Cells(riga_da_scrivere, 8) = Sheets("Clienti").Cells(i, 8)
      Cells(riga_da_scrivere, 9) = Sheets("Clienti").Cells(i, 9)
      Cells(riga_da_scrivere, 10) = Sheets("Clienti").Cells(i, 10)
      riga_da_scrivere = riga_da_scrivere + 1
      Exit For
      End If
      Next j
      Next i
      Sheets("Appoggio").Activate
      ultima_riga_appoggio = Cells(Rows.Count, "A").End(xlUp).Row
      lstArchivioClienti.RowSource = "A1:J" & ultima_riga_appoggio
      Sheets("Clienti").Activate
      End Sub
      In pratica:
      1) cancello tutto il contenuto del foglio Appoggio
      2) pulisco la listbox
      3) attivo il foglio Clienti per fare al suo interno la verifica con l'InStr (come mostro nel video, con la differenza che qui non uso la matrice, perché prendo tutte le colonne da 1 a 10)
      4) se la condizione è vera, attivo il foglio Appoggio e scrivo nella prima riga disponibile, individuata dalla variabile riga_da_scrivere
      5) al termine dei due cicli For, uso RowSource per caricare nella listbox il contenuto del foglio Appoggio
      6) al termine riattivo il foglio Clienti (forse istruzione superflua)

    • @alfredobusto107
      @alfredobusto107 3 ปีที่แล้ว

      @@NickTheGeek bene domani provo. Grazie

  • @gennaroscarpati8675
    @gennaroscarpati8675 3 ปีที่แล้ว +1

    Per risolvere il problema della colonna 11 puoi impostare il ciclo for =1 to 11 e subito dopo aggiungere: if j= 7 then j=11

    • @NickTheGeek
      @NickTheGeek 3 ปีที่แล้ว

      Grazie per l'indicazione, mi è stata suggerita anche in un altro commento da qualche parte qui sotto, ed è effettivamente corretta; se però ci fossero più "salti" tra colonne (anziché solo uno come nel video, cioè dalla 6 alla 11) allora la situazione si complicherebbe.

  • @giovannirusso5846
    @giovannirusso5846 2 ปีที่แล้ว

    Ciao Nick, ti seguo con attenzione, è benché abbia copiato tutti i codici mostrati in video non funziona sul mio database, potresti aiutarmi a capire meglio? grazie

    • @NickTheGeek
      @NickTheGeek 2 ปีที่แล้ว

      Ciao Giovanni.
      Se può essere utile, nella descrizione c'è il link per scaricare da GitHub il file che uso nel video.
      Se non risolvi, devo per forza vedere il file, quindi puoi inviarmelo a nickthegeek.yt@gmail.com (cancellando o sostituendo gli eventuali dati sensibili), però ti avviso che al momento non ho molto tempo, quindi ci darò senz'altro un'occhiata ma poi i tempi di risposta dipenderanno dalla complessità. Se mi mandi l'email mi dovresti anche descrivere il problema e indicarmi esattamente quando si verifica.

  • @marzioporro5780
    @marzioporro5780 ปีที่แล้ว

    Ciao Nick
    Seguo con interesse i tuoi video di Excel su TH-cam, soprattutto quelli che riguardano il VBA e vorrei chiederti un aiuto.
    In VBA ho costruito una UserForm tipo maschera, per inserimento dati in un foglio esterno di Excel.
    Le etichette (label)corrispondono ai nomi delle intestazioni delle colonne del foglio di Excel, mentre le caselle di testo(textBox) vengono riempite di volta in volta con nuovi dati.
    Inoltre in basso a dx della maschera è presente un pulsante(CommandButton) rinominato APPLICA.
    Vorrei che al clik su APPLICA, tutti i dati inseriti nella maschera, venissero inseriti nel foglio di Excel, rispettando chiaramente la loro posizione nei campi.
    Se il codice VBA fosse troppo complicato, ti chiedo di lasciar perdere, anche perché sono alle prime armi con il VBA.
    Grazie Marzio
    Se sei d’accordo possiamo sentirci per mail, in modo tale da non intasare il canale la mia è m.porro@tin.it
    ps. hai forse fatto qualche video in merito a quanto sopra?

    • @NickTheGeek
      @NickTheGeek ปีที่แล้ว +1

      Ciao Marzio, se ho capito bene vorresti replicare il contenuto della userform su un foglio Excel.
      La cosa più semplice che mi viene in mente è quella di inserire nel nome delle textbox le "coordinate" delle celle dove il rispettivo valore deve essere scritto.
      Ad esempio, se le textbox formano una griglia di 5 righe per 3 colonne, allora nel foglio excel diciamo che dovrai scrivere le celle da A2 a C6 (saltando la prima riga che contiene le intestazioni).
      Quindi i nomi delle textbox dovranno essere: TextBox21 (cioè seconda riga e prima colonna, A2), TextBox22 (seconda riga e seconda colonna, B2), TextBox23 (seconda riga e terza colonna, C2), etc.
      Poi il codice da scrivere per il click su Applica sarà:
      For i = 2 To 6 ' va dalla riga 2 alla riga 6
      For j = 1 To 3 ' va dalla colonna 1 alla colonna 3
      Cells(i, j) = Me.Controls("TextBox" & i & j) ' scrive in quella cella il contenuto della corrispondente textbox
      Next j
      Next i
      In pratica fa 2 cicli For annidati in modo da passare tutte le celle di quel rettangolo A2:C6, e in ogni cella scrive il valore della corrispondente textbox, sfruttando i valori di riga e colonna, cioè "i" e "j".
      La cosa un po' particolare qui è il Me.Controls, che è la collezione di tutti i controlli presenti nella userform. Tra parentesi ho messo il nome del controllo specifico, quindi la parola TextBox più le "coordinate" i e j.
      Fammi sapere se funziona e se era questo che volevi. Per quanto riguarda l'intasamento del canale non è un problema, ho talmente pochi commenti che li vedo comunque tutti :D anche se non è detto che possa rispondere sempre in tempi brevi.
      Se invece devi mandarmi un file allora puoi inviare a nickthegeek.yt@gmail.com

    • @marzioporro5780
      @marzioporro5780 ปีที่แล้ว +1

      @@NickTheGeek Grazie Nick ci sentiamo presto