errore nel codice



  • errore nel codice
    di Dani (utente non iscritto) data: 22/08/2012 12:12:07

    Buongiorno, io ho creato un bottone con dietro questo codice.
    io ho due fogli uno chiamato Dati con quattro colonne A1:cognome, B1:nome, C1:indirizzo, D1:telefono.
    Poi ho un foglio scheda con le stesse colonne. in questo foglio ho inserito il bottone.
    Io vorrei che cliccando sul bottone viene inserito il dato della colonna D1 nel campo corrispondente nel foglio Dati ma dove il nome e il cognome sono gli stessi.

    IL codice mi da errore... perchè?

     
    Private Sub CommandButton1_Click()
     
    Dim NewLig As Long
    NewLig = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
    
    For i = 1 To Worksheets("DATI").Range("A65536").End(xlUp).Row
    
    If Worksheets("DATI").Range("A" & i).Value = Worksheets("SCHEDA").Range("A6").Value And Worksheets("DATI").Range("B" & i).Value = Worksheets("SCHEDA").Range("B6").Value Then
    Numlig = i
    End If
    Next i
    With Worksheets("DATI")
        .Range("D" & NewLig).Value = Worksheets("SCHEDA").Range("D6").Value
        
       
    End With
    
    End Sub



  • di Vecchio Frac data: 22/08/2012 13:34:53

    E qual è il messaggio di errore?

    Sicuramente ti fermi in questo punto:
    NewLig = .Cells(.Rows.Count, "A").End(xlUp).Row + 1

    In parole molto povere, il punto da solo a inizio parola non può stare se non è preceduto da un With qualcosa :)
    Serve per riferirsi ad un oggetto, ai suoi metodi e alle sue proprietà ma se l'oggetto non è stato indicato, non si riferisce a niente e si solleva l'errore.

    Credo che NewLig indichi il numero di riga della seconda cella di cui è composto un presumibile intervallo nella colonna A (cosa che puoi ottenere anche con Selection(2).Row senza tutto quell'ambaradan).

    Non ho esaminato il resto del codice :)





  • di HarryBosch data: 22/08/2012 14:04:27

    si... dice bene Francesco ovviamente..
    aggiungerei anche un paio di cosette:
    - vedo due variabili diverse: e il valore assunto successivamente da NumLig non viene più riutilizzato (presumibilmente dovrebbe essere la stessa variabile)
    - sul foglio "SCHEDA" si controlla un unico nominativo, dato dalle celle A6 e B6. Così però non vedo la necessità di un secondo foglio; qual'è lo scopo esatto?
    Nel senso, bisogna invece controllare tutti i valori del foglio "scheda" e inserire tutti i dati della colonna D nel foglio "Dati" (al corrispettivo nominativo ovviamente)?

    Ciao, Vanni


  • Dani
    di Dani (utente non iscritto) data: 22/08/2012 14:35:53

    Si ho corretto. si io ho fatto un esempio però in realtà ho fatto una lista combinata con tutti i cognomi poi con il comando cerca.vert visualizzo tutti i valori riferiti a quel cognome. la colonna D è un valore che viene aggiornato quindi quello che vorrei fare è attraverso un bottone inserire il dato della colonna D riferito a quel record.

     
    Private Sub CommandButton1_Click()
     
    Dim NewLig As Long
    NewLig = Worksheets("SCHEDA").Cells(.Rows.Count, "D").End(xlUp).Row + 1
    
    For i = 1 To Worksheets("DATI").Range("A65536").End(xlUp).Row
    'toutes les lignes donc
    If Worksheets("DATI").Range("A" & i).Value = Worksheets("SCHEDA").Range("A6").Value And Worksheets("DATI").Range("B" & i).Value = Worksheets("SCHEDA").Range("B6").Value Then
    Numlig = i
    End If
    Next i
    
    With Worksheets("DATI")
    .Cells(.Rows.Count, "D").End(xlUp).Row 1
    End With
    
    End Sub



  • di Vecchio Frac data: 22/08/2012 15:36:34

    Qui c'è parecchia confusione.
    Rileggi anche il post di HarryBosch...
    Butta via tutto questo codice raffazzonato o copiato male, che tra parentesi continuerà a darti errore perché non l'hai mica corretto bene (lo riesci a vedere l'errore?), e prova a scrivere su un foglio che cosa vuoi *esattamente*, da quale dato parti e a quale risultato vuoi arrivare (riscrivi meglio insomma la tua ultima frase, "quello che vorrei fare è attraverso un bottone inserire il dato della colonna D riferito a quel record")
    Cerca di essere più preciso: non hai fatto una "lista combinata" che è altra cosa; non utilizzi affatto cerca.vert, che è una funzione di Excel, ma ne simuli il comportamento e non certo per "visualizzare tutti i valori"; la colonna D non "è un valore che viene aggiornato" (è solo una colonna, che contiene o no dei valori).
    Ottimizzare il codice, bè, quello è un passo successivo ;)




  • Dani
    di Dani (utente non iscritto) data: 22/08/2012 15:52:37

    Allora partiamo dall'inizio
    io ho un foglio dati con questi campi Nome, Cognome, Indirizzo, Telefono
    questo foglio si chiama Dati

    poi ho un foglio scheda con
    A6 : nome
    B6 : cognome
    C6: indirizzo
    D6: Telefono

    sempre in questo foglio ho fatto nella cella A4 un "bottone" in cui esce come elenco tutti i cognomi che sono stati inseriti nel foglio Dati colonna cognomi
    una volta selezionato il valore dall'elenco, nei campio sotto vengono visualizzate tutte le informazioni che riguardano quel cognome grazie al comando cerca.vert.
    tranne per il telefono che è un campo al momento vuoto.
    poi l'utente inserirà il telefono e grazie ad un bottone vorrei inserire questo valore nella scheda dati nel posto corretto ovvero dove combaciano nome e cognome e indirizzo.

    ho provato a fare un codice ma forse ho sbagliato perchè non sono brava e sto imparando.

    spero sia più chiaro ora.
    grazie mille



  • di Vecchio Frac data: 22/08/2012 21:18:32

    Adesso lo scenario è chiaro, hai un elenco a discesa che valorizza i campi che identificano l'utente :)
    Hai fatto bene a provarci, ma bisogna essere più completi nel proporre i quesiti, così si evitano molti post introduttivi inutili ;)
    Supponiamo quindi che l'utente inserisca il telefono in D6.
    Un pulsante lì vicino, "Aggiorna dati", deve cercare l'utente in foglio Dati e inserire il valore appena digitato nella corrispondente colonna D.
    A parte i molti modi per implementare questa soluzione (Vanni ti proporrà un userform, che non è una cattiva idea ^_^), un codice semplice per fare questo potrebbe essere simile a quello che ti allego.
     
    Option Explicit 
    
    Private Sub CommandButton1_Click()
    Dim ac as Range
    
        For Each ac in [dati!a1].CurrentRegion.Resize(columnsize:=1)
            If ac = [scheda!a6] And ac.Offset(0, 1) = [scheda!b6] Then
                Sheets("dati").Cells(ac.Row, 4) = [scheda!d6]
            End If
        Next
    End Sub






  • di Dani (utente non iscritto) data: 23/08/2012 08:45:33

    grazie mille funziona benissimo......

    grazie ancora



  • di Dani (utente non iscritto) data: 23/08/2012 09:28:39

    ma se volessi aggiungere altri campi, ovvero incollare anche la riga 7 e la riga 8 ed inserirle nelle colonne rispettivamente E e F, come posso fare? come ho fatto io non funziona
     
    Private Sub CommandButton1_Click()
    Dim ac As Range
    
        For Each ac In [dati!a1].CurrentRegion.Resize(columnsize:=1)
            If ac = [scheda!a6] And ac.Offset(0, 1) = [scheda!b6] Then
                Sheets("dati").Cells(ac.Row, 4) = [scheda!d6] And   Sheets("dati").Cells(ac.Row, 5) = [scheda!e6]
                
            End If
        Next
        
        Worksheets("SCHEDA").Range("A6").ClearContents
    End Sub



  • di Vecchio Frac data: 23/08/2012 10:14:19

    Ragionare in pseudocodice va bene, ma poi devi tradurlo nel modo corretto.
    Hai scritto:
    Sheets("dati").Cells(ac.Row, 4) = [scheda!d6] And Sheets("dati").Cells(ac.Row, 5) = [scheda!e6]

    che per te significa "in corrispondenza dell'utente da me cercato, in colonna D metti il valore di D6 e in colonna E metti il valore di E6". A parte che tu nel testo parli di E e F, ma l'AND non funziona così, nel senso che è solo un operatore logico per fare confronti e si usa tipicamente con If ... Then oppure con assegnazioni a sinistra dell'operatore di uguale; il risultato dell'espressione è sempre un valore booleano, cioè vero (true) o falso (false).
    Esempi:
    If valore1 = "abc" And valore2 = "def" Then ...
    valore = (cognome = "Rossi") And (nome = "Mario")

    Dovrai quindi effettuare le assegnazioni alle celle in modo esplicito, una per ogni cella coinvolta.
    Si può anche utilizzare una struttura for tra le celle coinvolte ma non complichiamoci la vita :)

     
    Option Explicit
    
    Private Sub CommandButton1_Click()
    Dim ac As Range
    
        For Each ac In [dati!a1].CurrentRegion.Resize(columnsize:=1)
            If ac = [scheda!a6] And ac.Offset(0, 1) = [scheda!b6] Then
                Sheets("dati").Cells(ac.Row, 4) = [scheda!d6]
                Sheets("dati").Cells(ac.Row, 5) = [scheda!e6]
                Sheets("dati").Cells(ac.Row, 6) = [scheda!f6]
            End If
        Next
    
        [scheda!a6].ClearContents
    End SUb






  • di Dani (utente non iscritto) data: 23/08/2012 12:13:00

    si anch'io ho fatto come hai scritto te ma non funziona.



  • di Vecchio Frac data: 23/08/2012 12:59:08

    Non funziona? non vedo perché...
    Il codice è banale, si limita a trascrivere dati da una cella all'altra.
    Ottieni qualche messaggio di errore? il codice si ferma su qualche punto?
    Non compaiono i dati che vorresti? vengono copiati dati diversi?
    Suggerisco di postare il file in formato .ZIP o .RAR con dati di esempio.





  • di Dani (utente non iscritto) data: 23/08/2012 13:41:27

    avevo sbagliato una cosa.... ora funziona molto bene. grazie mille



  • di Vecchio Frac data: 23/08/2012 13:46:05

    Hai allegato un file di esempio, hai bisogno di unire i due thread e confezionare un file funzionante secondo i tuoi bisogni?
    Se invece consideri chiusa questa parte della problematica, rispondi spuntando la checkbox qui a fianco in corrispondenza di "Discussione risolta", thx :)





  • di Dani (utente non iscritto) data: 23/08/2012 14:30:18

    No sono due esercizi diversi. Grazie per l'aiuto