calcellare valore cella



  • calcellare valore cella
    di Alfredo (utente non iscritto) data: 17/08/2016 12:50:13

    Problema.
    Ringrazio in anticipo chiuque potrà aiutarmi
    Ho un foglio nel quale alla colonna A(precisamente da A3 a A63 )ci sono inseriti numeri da 1 a 61. in un altro foglio ho una scelta casuale tra 1 e 61.
    Vorrei poter cancellare nel primo foglio solo il valore uguale a quello dato dal random.
    Spero di essere stato chiari e che possa aiutarmi qualcuno
    Grazie



  • di Luca73 data: 17/08/2016 13:03:41

    Ciao
    altri ti siuteranno con VBA
    Innanzitutto intruisco che vuoi un confronto a pari riga. Confermi? Ovvero confrontare A5 del Folgio in Esame con A5 del foglio coni random
    io userei questa formula da inserire in A3-A63 che ti fa diventare la cella vuota nel caso la stessa cella del foglio coni numeri random sia uguale.
    Questa va inserita in A3 del foglio in esame, modificare il nome del folgio e poi copiare in basso fino alla riga 63
    =SE(Foglio2!A3=RIF.RIGA()-2;"";RIF.RIGA()-2)

    Ciao
    Luca





  • di Alfredo (utente non iscritto) data: 17/08/2016 13:14:13

    No forse mi sono espresso male io.
    Ti anticipo i ringraziamenti per la risposta e tento di spiegarmi meglio:
    Un pulsante con una macro cancella.
    Esempio: foglio 2 numero uscito (15)
    foglio 1 cancellare solo il numero 15



  • di Vecchio Frac data: 17/08/2016 13:38:26

    Quindi Alfredo non ha una lista di altri 61 numeri casuali, ma un numero solo generato di volta in volta (o inserito a mano, è irrilevante). Poichè la prima lista contiene 61 numeri univoci (non ripetuti), trovare quello estratto e cancellarlo dalla lista iniziale sarà facile.
    La mia domanda è se dopo l'eliminazione deve essere eseguita anche la compattazione della lista, o se le celle cancellate possono essere lasciate in bianco.
    Ciò premesso, invito Alfredo a presentare un pezzo di codice per fare ciò che ha chiesto.
    Se non hai idea ti do qualche spunto: Range rappresenta una o più celle, Find è un metodo (un attributo) dell'oggetto Range che restituisce un risultato.
    Se non hai le basi per stendere codice dovresti almeno prendere la confidenza con l'editor per riuscire a navigare tra gli oggetti mostrati dal Visualizzatore oggetti e la Guida disponibile con il tasto F1.





  • di Alfredo (utente non iscritto) data: 17/08/2016 14:05:56

    Grazie .
    Centrata la richiesta.
    La lista non deve essere compattata
    Il massimo che sono riuscito a fare è:
    Sub Cancella()
    Sheets("Foglio2").Select
    Range("E3").Select
    Sheets("Foglio1").Select
    Range("A3:A63").ClearContents
    End Sub
    che ovviamente non funziona perchè cancella tutto il range
    A3:A63 non leggendo il valore di E3 del foglio 2



  • di Vecchio Frac data: 17/08/2016 14:35:48

    Sì ok, ClearContents è un metodo (cioè una funzione che fa qualcosa) dell'oggetto Range. Se l'oggetto Range è multicella come in questo caso, cancella il contenuto di tutto il range.
    Allora a te serve un metodo (cioè una funzione che fa qualcosa), per cercare qualcosa all'interno di un range.
    Se digiti
    Range("A3:A63"). 
    appena batti il "punto" finale l'Intellisense di VBA (cioè lo strumento che elenca in tempo reale metodi e proprietà degli oggetti) ti mostra quello che puoi fare con quel range. Tra quello che puoi fare c'è Find (lo avevo già detto nel primo post). Sceglilo, poi premi il tasto F1, quindi scegli "Range.Find (metodo)" e leggi un momento come si usa.
    Quando avrai letto la breve guida scoprirai anche che puoi usare variabili per memorizzare valori da riutilizzare. Quindi assegnerai a una variabile il contenuto di E3, lo cercherai nel range della lista di numeri, e se trovato lo cancellerai.
    Prova un po', poi torna qui che ne riparliamo :)





  • di Luca73 data: 17/08/2016 14:46:08

    Ciao Scusate se mi intrometto
    un piccolo spunto di riflessione:
    se le celle da A3 a A63 contengono sempre dei valori da 1 a 61 e devo cercare un numero dato, esiste una correlazione biunivoca tra il numero dato e la riga della cella contenente tale numero (ovvero il numero 16 sarà sempre nella cella A19 e così via.
    Pertanto perchè non sffuttare questa proprietà del tuo esercizio? (suggerimento = proprietà Offset di range)
    Ciao
    Luca





  • di Vecchio Frac data: 17/08/2016 15:01:57

    E come no? certo!!
    ...c'è pure la terza alternativa: senza nemmeno usare .Offset ma solo .Cells (proprio sfruttando la conoscenza a priori che i range della prima lista parte da una cella specifica e che i numeri son in sequenza).
    +1 per Luca, e intanto facciamo arrivare il nostro amico a piccoli passi ^_^
    (morale: ci sono quasi sempre soluzioni diverse per uno stesso problema)





  • di Alfredo (utente non iscritto) data: 17/08/2016 15:02:49

    Dopo aver fatto ammissione di profonda ignoranza nella programmazione.
    Credo che al metodo find di range dovrei usare what ma non so come farlo.
    Capisco di chierere la pappa pronta ma sono certo che può servirmi per iniziare ad imparare.
    Ti ringrazio comunque del tempo che mi stai dedicando



  • di Vecchio Frac data: 17/08/2016 15:15:15

    What è un argomento predefinito di Find (ed è anche l'unico obbligatorio) e indica proprio che cosa stiamo cercando.
    Allora :
    - so cosa sto cercando (foglio2, cella e2)
    - so dove devo cercare (foglio2, range a3:a63)
    - conosco l'istruzione per cercare qualcosa (Find)
    - questa istruzione vuole che le si dica cosa cercare (Find qualcosa)
    - variabili: locazioni di memoria in cui finisce un valore e che pososno essere richiamate e modificate nel codice. Cominciano con una lettera e pososno contenere tipi di valori diversi.
    - una cosa in più: l'istruzione Find si applica a un oggetto range, e restituisce un oggetto range. Come tutti gli oggetti, l'assegnazione si fa con l'istruzione Set (vai a vederla sulla guida): set variabile = oggetto, in questo caso l'oggetto Find che restituisce qualcosa
    - ho detto che se Find trova qualcosa restituisce un oggetto range; la verifica se un oggetto esiste o meno si fa con il test "Is Nothing", per cui si verifica se (If) la variabile oggetto restituita da Find è oppure no "Is Nothing". Se sì, la ricerca è fallita. Se no, la ricerca ha dato esito positivo e si può quindi cancellare la riga corrispondente al valore cercato.
     
    'cominciamo col costruire la procedura
    'questo che comincia con apice è un commento e viene ignorato dal compilatore
    Option Explicit    'serve per la dichiarazione delle variabili
    
    Sub find_clear()     'iniziamo una subroutine di nome find_clear, senza parametri
    Dim f As Integer, c As Range      'dichiariamo le nostre variabili
    .
    .
    End Sub






  • di Vecchio Frac data: 17/08/2016 15:39:31

    Andiamo avanti dunque.
    Ora assegniamo alla variabile f il valore della cella e2 del foglio2 che contiene il numero da cercare.
    Quindi assegniamo alla variabile oggetto c il risultato della ricerca (del valore f appena assegnato) effettuata nel range a3:a63 cioè della lista integrale.
    Ora manca il codice che deve testare l'esistenza o meno del valore f nel range di partenza.
    Con Set hai già detto a VBA di assegnare a c un valore, ma questo valore cambia a seconda che il valore f sia trovato o meno (vedi post precedente). Come si fa il test di verifica?
     
    Option Explicit
    
    Sub find_clear()
    Dim f As Integer, c As Range
        
        f = Sheets("foglio2").Range("e2")    
        
        Set c = Sheets("foglio1").Range("a3:a63").Find(f)
    .
    .
    End Sub






  • di Alfredo (utente non iscritto) data: 17/08/2016 15:44:20

    Sub Cancella()
    With Worksheets("Foglio1").Range("A3:A63")
    Set c = .Find(Worksheets("Foglio2").Range("E3"), LookIn:=xlValues)

    c.Value = ""
    Set c = .FindNext(c)

    End With
    End Sub
    Pensi che possa funzionare?



  • di Vecchio Frac data: 17/08/2016 15:50:00

    cit. "Pensi che possa funzionare?"
    ---> Non hai che da provare ^_^

    Stai facendo progressi.
    La tua procedura però fallisce se il valore da cercare (che si trova in E3) non c'è nel range A3:A63 (perchè magari è già stato cancellato). Ricordi cosa ho detto sul test is Nothing?

    Inoltre non ha senso qui usare FindNext per due motivi: sei alla fine della sub (quindi dopo che trovi un eventuale nuovo valore poi non lo riutilizzi e quindi è inutile), e comunque tu hai detto che i valori della prima lista sono univoci, quindi sai già che non esiste un successivo valore uguale da cercare.






  • di Vecchio Frac data: 17/08/2016 15:58:55

    Concludo con la parte finale della procedura.
    Se c risulta valorizzata perchè Find ha restituito un oggetto,allora cancella il contenuto della cella.
    Tutto qui.

    Poi ci sono le raffinatezze per ridurre il codice o ottimizzarlo, come faceva notare Luca73.


     
    Option Explicit
    
    Sub find_clear()
    Dim f As Integer, c As Range
    
        f = Sheets("foglio2").Range("e2")
        
        Set c = Sheets("foglio1").Range("a3:a63").Find(f)
        
        If Not (c Is Nothing) Then c.ClearContents
        
    End Sub






  • di Alfredo (utente non iscritto) data: 17/08/2016 16:01:20

    Ti ringrazio tanto, sono sicuro di aver appreso qualcosina.
    Farò delle prove e poi posterò il risultato.
    Vi rigrazio tutti



  • di Luca73 data: 17/08/2016 16:56:50

    Ciao
    Giusto per Completezza quello che avevo pensato io era qualcosa del genere:


     
    option Explicit
    
    Sub find_clear()
    Dim f As Integer, c As Range
        f = Sheets("foglio2").Range("e2")
        Sheets("foglio1").Range("a2").offset(f,0).ClearContents
    End Sub






  • di scossa data: 17/08/2016 19:06:05

    Ciao a tutti,

    cit. V.F.: "What è un argomento predefinito di Find (ed è anche l'unico obbligatorio)"

    Solo un highlight: è vero che l'unico argomento obbligatorio del metodo Find è il valore da cercare, però bisogna tenere presente che gli altri parametri mantengono i valori impostati dall'ultima ricerca effettuata (anche se fatta lato celle).
    Quindi, a mio parare, sarebbe bene precisare sempre tutti i parametri.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 17/08/2016 20:14:59

    @Luca73
    Esatto e volendo si può continuare, anche senza variabili :)

    @scossa
    Mi sei mancato, eri in ferie? :)
     
    option Explicit
    
    Sub find_clear()
        Sheets("foglio1").cells(Sheets("foglio2").Range("e2").Value + 2, 1).ClearContents
    End Sub
    






  • di scossa data: 18/08/2016 13:29:06

    cit. V.F.: ".... eri in ferie? :)"

    Anche, ma più che altro il lavoro (per fortuna) mi impegna non poco.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)