Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [VBA] Aggiungere nomi e cognomi ad un elenco evitando ripetizioni (Excel)

    Buongiorno a tutti,

    grazie per avermi accettato, sono nuovo, questo è il mio primo post e sono un super "noob" della programmazione...
    Detto questo, sto cercando di mettere in piedi una funzione che partendo dalla UserForm1 una volta cliccato il tasto 'OK':
    1. legga il nome inserito da me nel campo UserForm1.TextBox1
    2. legga il cognome inserito da me nel campo UserForm1.TextBox2
    3. controlli che nelle colonne B (nome) e C (cognome) del foglio Sheet1 non esita quel nominativo (nome e cognome) e se esistesse restituisca una MsgBox con scritto 'Già Inserito', altrimenti copi il nome ed il cognome nella prima riga disponibile delle colonne B e C

    La logica che ho usato è:
    1. chiedi di complare tutti i campi
    2. controlla che non ci sia il cognome (Colonna C), se non esite scrivi nome e cognome nella prima riga libera
    3. se trova il cognome controlla che il nome sia diverso
    3a. se il nome è uguale restituisci una MsgBox con scritto 'Gi� Inserito'
    3b. se il nome è diverso scrivi nome e cognome nella prima riga libera (qua � dove sono in difficolt�)

    Copio il codice

    codice:
    
    Sub Aggiungi()
    Dim Nam, Sur, z, d
    Dim us As Long
    Set Nam = UserForm1.TextBox1
    Set Sur = UserForm1.TextBox2
    Set z = Sheets("Sheet1").Range("c2:c150").Find(Sur)
    If UserForm1.TextBox1 = "" Or UserForm1.TextBox2 = "" Then
    MsgBox ("Compila i campi")
    Else
    If z Is Nothing Then
    ur = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row
    Sheets("Sheet1").Range("C" & ur + 1).Value = Sur
    Sheets("Sheet1").Range("B" & ur + 1).Value = Nam
    Else
    For Each z In Sheets("Sheet1").Range("c2:c150")
    If Sheets("Sheet1").Cells(z.Row, z.Column - 1) = Nam And Sheets("Sheet1").Cells(z.Row, z.Column) = Sur Then 
    MsgBox ("Già Inserito")
    Else
    ur = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row
    Sheets("Sheet1").Range("C" & ur + 1).Value = Sur
    Sheets("Sheet1").Range("B" & ur + 1).Value = Nam
    Exit For
    End If
    
    
    Next
    End If
    End If
    
    
    End Sub

    La parte in rosso è quella dove faccio pasticcio, se non inserisco quella la funzione gira benone, ma qualora ci fossero due persone con il cognome uguale ma il nome diverso non aggiunge il nuovo nominativo all'elenco.

    Riuscite ad aiutarmi per favore?

    Grazie,
    TheNoobes

  2. #2
    Utente di HTML.it L'avatar di patel
    Registrato dal
    Jan 2008
    Messaggi
    1,994
    prova a spostare l' Exit For sotto il msgbox, se non risolvi allega un file di esempio

  3. #3
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,700
    tralasciando assegnazioni ridondanti e mancanza di indentazione (spero non sia un esercizio didattico), hai debuggato?
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  4. #4
    Quote Originariamente inviata da patel Visualizza il messaggio
    prova a spostare l' Exit For sotto il msgbox, se non risolvi allega un file di esempio

    Buongiorno di nuovo,

    grazie per i riscontri (non è un esercizio didattico, purtroppo sono passati tanti anni da quando a fatica riuscii a sfangare l'esame di C++ )

    Prendendo spunto dal suggerimento di patel e con un numero non definito di tentativi empirici direi che sono giunto ad una funzione che fa bene quello di cui ho bisogno, il gioco era appunto piazzare sia l'exit for sia l'exit sub nel punto giusto (almeno credo).

    Incollo il codice qua sotto sia perché magari viene utile a qualcun altro sia perché ogni possibile miglioria è ben accetta.

    codice:
    Sub Aggiungi()Dim Nam, Sur, z, d
    Dim us As Long
    Set Nam = UserForm1.TextBox1
    Set Sur = UserForm1.TextBox2
    Set z = Sheets("Sheet1").Range("c2:c150").Find(Sur)
    If UserForm1.TextBox1 = "" Or UserForm1.TextBox2 = "" Then
    MsgBox ("Compila i campi")
    Else
    If z Is Nothing Then
    ur = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row
    Sheets("Sheet1").Range("C" & ur + 1).Value = Sur
    Sheets("Sheet1").Range("B" & ur + 1).Value = Nam
    Else
    For Each z In Sheets("Sheet1").Range("c2:c150")
    If Sheets("Sheet1").Cells(z.Row, "B") = Nam And Sheets("Sheet1").Cells(z.Row, "C") = Sur Then
    MsgBox ("Nominativo esistente")
    Exit Sub
    Exit For
    End If
    Next
    
    
    ur = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row
    Sheets("Sheet1").Range("C" & ur + 1).Value = Sur
    Sheets("Sheet1").Range("B" & ur + 1).Value = Nam
    MsgBox ("Nominativo creato")
    End If
    End If
    
    
    
    
    End Sub
    Cercando in rete ho anche trovato utile mettere in cima al modulo
    codice:
    Option Compare Text
    così da rendere la funzione case insensitive.

    Grazie e buona giornata,
    TheNoobest

  5. #5
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,700
    Dato che non è didattica, posto la mia "soluzione" non per denigrare la tua, ma mi sembra più pulita e senza ridondanze:
    codice:
    ' Dim non necessari senza Option Explicit
    Nam = UserForm1.TextBox1
    Sur = UserForm1.TextBox2
    ur = Sheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row
    presente = False
    
    
    For i = 2 To ur
        If Sheets("Sheet1").Range("C" & i) = Sur And Sheets("Sheet1").Range("B" & i) = Nam Then
            presente = True
            Exit For
        End If
    Next i
        
    If presente Then
        MsgBox ("Già Inserito")
    Else
        Sheets("Sheet1").Range("C" & ur + 1).Value = Sur
        Sheets("Sheet1").Range("B" & ur + 1).Value = Nam
    End If
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  6. #6
    Ciao!

    Non mi sento assolutamente denigrato, anzi! Grazie mille per la versione PRO, mi tornerà sicuramente utile anche perché avevo provato a usare for anziché for each ma non avevo avuto grandi risultati.

    BUona serata!

  7. #7
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,700
    Quote Originariamente inviata da TheNoobest Visualizza il messaggio
    Ciao!

    Non mi sento assolutamente denigrato, anzi! Grazie mille per la versione PRO, mi tornerà sicuramente utile anche perché avevo provato a usare for anziché for each ma non avevo avuto grandi risultati.

    BUona serata!
    il "for each" che hai usato non ha senso; z è una variabile da valutare in una raccolta/collezione/oggetto non un valore in un range;
    oltretutto poi usi la variabile per ridondare la verifica di sur ...
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.