controllo somma format tabella



  • controllo, somma format tabella
    di Francesco (utente non iscritto) data: 05/10/2012 16:53:28

    Ciao a tutti
    sempre io (è un pochino che chiedo aiuto)
    Sto cercando di copiare celle specifiche in un range prestabilito per creare una fattura.
    le righe da copiare sono indicate da "si" o "SI" che viene inserito a mano in un determinato range di controllo.
    il codice qui sotto che adattato alle mie esigenze funziona solo se nel range di controllo ci sono i valori "si" o "SI" .
    dopo aver copiato le righe mi fa una somma e mi riporta altri dati
    se valori "SI" o "si" non ci sono mi va in errore (penso in loop). come posso gestire aggiustarlo ? è una settimana che ci lavoro ma non ci riesco
    non riesco a codificare che se il range di controllo è vuoto non deve fare nulla
     
    Sub nota()
        Dim rng As Range
        Dim cella As Range
        Dim y As Integer
       Dim tabella As Range
       Dim somma As Range
       
         
        Sheets("foglio1").Activate
        Sheets("foglio1").Range("a22:k100000").ClearContents
        Sheets("foglio1").Range("a22:k100000").ClearFormats
        y = 2
        With Sheets("elenco 3")
        
                Set rng = Range(.Cells(2, 8), .Cells(2, 8).End(xlDown))
               
            For Each cella In rng
                If cella.Offset(0, 5) = "si" Or cella.Offset(0, 5) = "SI" Then
                   cella.Offset(0, 4).Copy Destination:=Cells(y + 20, 10)
                   cella.Offset(0, 3).Copy Destination:=Cells(y + 20, 9)
                   cella.Offset(0, 2).Copy Destination:=Cells(y + 20, 8)
                   cella.Offset(0, 1).Copy Destination:=Cells(y + 20, 7)
                   cella.Offset(0, -2).Copy Destination:=Cells(y + 20, 6) ' costo
                   cella.Offset(0, -3).Copy Destination:=Cells(y + 20, 5)
                   cella.Offset(0, -4).Copy Destination:=Cells(y + 20, 4)
                   cella.Offset(0, -5).Copy Destination:=Cells(y + 20, 3)
                   cella.Offset(0, -6).Copy Destination:=Cells(y + 20, 2)
                   cella.Offset(0, -7).Copy Destination:=Cells(y + 20, 1)
                   cella.Copy Destination:=Cells(y + 20, 11)
                                   
                      y = y + 1
                  End If
           Next cella
             End With
        
         With Sheets("foglio1")
       Set tabella = Range(.Cells(22, 1), .Cells(22, 11).End(xlDown))
       tabella.Borders.LineStyle = xlDot
    
         Set somma = Range([I22], [I22].End(xlDown)) ' imposto range per somma
        [I22].End(xlDown).Select 'seleziono ultima cella
        ActiveCell.Offset(4, 0) = WorksheetFunction.Sum(somma) 'mi sposto ed eseguo somma
        ActiveCell.Offset(4, 0).Font.Bold = True
        ActiveCell.Offset(4, -1) = "Totale"
        ActiveCell.Offset(4, -1).Font.Bold = True
        ActiveCell.Offset(4, -1).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, -2).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, -3).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, -4).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, -5).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, -6).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, -7).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, -8).Interior.Color = RGB(217, 217, 217)
        ActiveCell.Offset(4, 0).Interior.Color = RGB(217, 217, 217)
       ActiveCell.Offset(4, 1).Interior.Color = RGB(217, 217, 217)
       ActiveCell.Offset(4, 2).Interior.Color = RGB(217, 217, 217)
      
       End With
     
        
    End Sub



  • di Vecchio Frac data: 05/10/2012 18:19:33

    Se nel range voluto non c'è la dicitura che hai impostato non si crea errore: semplicemente non viene fatto niente (il ciclo For Each continua indisturbato per tutte le celle del range).
    Piuttosto chiediti cosa accade se viene immesso un valore tipo "sì" oppure "Si"... apparentemente questa scelta è corretta ma il tuo codice non la gestisce (tu gestisci solo "si" oppure "SI", le maiuscole e minuscole contano).
    Per ovviare puoi immettere una convalida dei dati nelle celle specifiche che accetti solo "sì" e "no" e quindi il codice sa che si aspetta la scritta "sì" esattamente come da te voluta.

    Se questa soluzione non ti garba puoi ancora rimediare alle maiuscole/minuscole eseguendo il controllo dopo aver minuscolizzato tutto ed eliminato gli spazi non necessari:
    If LCase(Trim(cella.Offset(0, 5)) = "si") Then ....

    Oppure ancora (e meglio) puoi controllare che la prima lettera sia "s" oppure "S":
    If LCase(Trim(cella.Offset(0, 5)) Like "[sS]") Then ....

    Altre ottimizzazioni e miglioramenti sono possibili, ma comunque da quel che mi sembra di capire anche se nelle celle specifiche non ci sono i valori desiderati non si dovrebbe scatenare alcun errore.
    Se ottieni un messaggio di errore, indicaci dove il codice si blocca e il messaggio di errore.
    Se Excel si inchioda per troppo tempo allora è qualcos'altro.






  • di Francesco (utente non iscritto) data: 05/10/2012 18:26:41

    Hai ragione tu ! hai ragione! devo immettere una convalida dei dati nelle celle specifiche che accetti solo "sì" e "no" e quindi il codice sa che si aspetta la scritta "sì" esattamente come da me voluto. In origine volevo che si creassero in automatico tanti checkbox quante righe e far fare il lavoro in base al true or false.
    purtroppo non ci sono riuscito ed ho optato (ho tentato si intende) per inserire "SI" o "si" nella righa che si vuole far copiare nella fattura.
    non è propriamente un errore il ciclo continua formattando la tabella fino all'ultima riga e poi mi appare schermata debug!



  • di Vecchio Frac data: 05/10/2012 18:31:04

    Abbi pazienza, ma ho di là un bambino urlante che mi distrae :)
    Cosa significa "appare schermata debug"? c'è dunque qualche errore che ferma tutto? allora dicci quale errore e quale riga viene evidenziata.
    Ancor meglio, allega un piccolo file con la macro nefanda e con dati fittizi ^_^





  • di Francesco (utente non iscritto) data: 05/10/2012 18:39:56

    allego ! nel file capisci anche a che cosa mi occorre la funzione confronto!
    spero che tu possa apprezzare che mi sono rivolto a voi per le cose importanti che che devo essere certo che funzionino (il confronto deve essere perfetto)
    mi pare di aver fatto un discreto lavoro per uno che pasticcia con vba da 3 settimane (ho bisogno incoraggiamento )



  • di Francesco (utente non iscritto) data: 05/10/2012 18:46:49

    ho un problema tanto per cambiare pechè il file excel continua a crescere in termini mb? 2 mega per nulla



  • di Francesco (utente non iscritto) data: 05/10/2012 20:22:12

    Prima lancia macro "Nota" per vedere il risulatato che ottengo e voglio poi togli colonna M i "si" e rilancia macro per vedere il problema



  • di Vecchio Frac data: 05/10/2012 20:30:30

    Già ma come forse sai ho solo Excel 2003.
    Quindi devo fare i salti mortali per aprire un file di una versione superiore... oppure attendere che mi reinstallo la macchina virtuale :)
    Non so dirti perchè il file cresca di dimensioni.
    Comunque sono più che convinto che tu abbia fatto "un discreto lavoro per uno che pasticcia con vba da 3 settimane" :D





  • di Francesco (utente non iscritto) data: 05/10/2012 20:48:29

    Grazie per complimento -
    Harrybosch fa fatto tanto !!
    per fare una citazione "sono salito sulle spalle di un gigante" ^_^

    (non sapevo avessi versone 2003)



  • di Vecchio Frac data: 05/10/2012 20:48:54

    Ho reinstallato, aperto, capito :)
    Naturalmente si blocca nella funzione Sum di Worksheetfunction, nel caso non ci siano celle da sommare (se non ci sono "si" non ci sono valori da sommare).
    Quello che devi fare è evitare tutte le operazioni che coinvolgono la somma e la formattazione delle celle se y è 2: al termine del ciclo For Each quindi, prima di With Sheets("foglio1") scrivi: If y > 2 then e chiudi questo If alla fine del codice, dopo End With e prima di End Sub
    Tra parentesi, è anche il motivo della crescita abnorme della dimensione del file (formattavi i bordi di tabella di inutili righe vuote, per tutte le righe restanti del foglio, cioè oltre riga un milione :)





  • di Francesco (utente non iscritto) data: 05/10/2012 21:06:39

    Avevo capito che era la funziona somma il problema (toglievo righe di codice per vedere dove dava problemi ^_^ ) ma non avevo capito come risolverlo.
    avevo provato con if e la funzione go to per fargli saltare il processo della tabella ma ovviamente non specificando y>2 Non funzionava

    Grazie



  • di HarryBosch data: 05/10/2012 21:43:47

    Sempre io...
    ti ho ripostato il file dove ho inserito una variante, nel modulo 2, che non utilizza la Sum di Worksheetfunction ma che tiene conto della somma mentre recupera i dati.
    Verifica se funziona a dovere...



  • di Francesco (utente non iscritto) data: 05/10/2012 21:50:49

    si funziona a dovere (sballa solo se nel elenco 3 tra due righe ce nè una che non ha valore da sommare).
    Wow snellito il codice e reso molto elegante e funzionale. immaginavo che si potesse fare ..... (cercavo usare union)



  • di Francesco (utente non iscritto) data: 05/10/2012 21:59:41

    Occhio Herry (lo dico con assoluta umiltà) nella tua variante se non c'è il "si" fa lo stesso errore che avevo prima del consiglio di Vecchio Frack



  • di HarryBosch data: 05/10/2012 22:01:49

    Come sballa? finché ci sono solo "celle" vuote dovrebbe andare correttamente, anche se manca il valore da sommare; semmai non funziona se c'è una riga intera vuota, esattamente per questa istruzione:
    Set rng = .[h2].CurrentRegion





  • di Vecchio Frac data: 05/10/2012 22:04:49

    Bravo Vanni, molto più compatto ed efficiente, sapevo che si poteva contare su di te :)

    ...anche se non mi piace questo:
    If UCase(x) = UCase("si") Then...

    potevi scrivere semplicemente If UCase(x) = "SI" Then... ^_^





  • di HarryBosch data: 05/10/2012 22:05:03

    con il file che hai postato, non mi risulta questo errore; se non c'è il "si" la riga viene semplicemente saltata... ma il ciclo si ferma alla fine dell'intervallo preso in partenza, sempre con
    Set rng = .[h2].CurrentRegion

    Quale errore ti genera esattamente?



  • di Francesco (utente non iscritto) data: 05/10/2012 22:06:21

    Allegato SBALLA
    - lancia cosi come è e guarda risultato
    - togli tutti i si e lancia macro




  • di Vecchio Frac data: 05/10/2012 22:07:09

    Confermo che il codice di Vanni funziona bene anche se non ci sono celle con "si".
    La formattazione finale sarà magari bruttina ma tutto fila liscio come l'olio :)
    Sicuro di lanciare la nuova macro di Vanni?





  • di Vecchio Frac data: 05/10/2012 22:09:23

    L'allegato SBALLA funziona bene mi sembra... dobbiamo metterci d'accordo sul significato di "sballa" :)





  • di Francesco (utente non iscritto) data: 05/10/2012 22:10:01

    il file contenuto nel zip - sballa è il suo codice (io sogno certi livelli)

    mi sento un pochino in imbarazzo lo fatto notare solo perchè mi sembrate gente sempre pronta a mettervi in gioco



  • di HarryBosch data: 05/10/2012 22:10:37

    Confermo che funziona perfettamente!



  • di HarryBosch data: 05/10/2012 22:12:46

    e se tolgo tutti i si ovviamente la tabella rimane vuota e il totale esce 0...

    dov'è che non ci incontriamo?



  • di Francesco (utente non iscritto) data: 05/10/2012 22:16:47

    Capito in SBALLA coesistono 2 moduli 1 con il vecchio e l'altro con il nuovo

    TOLTO IL MODULO SBAGLITATO FUNZIONAAAAAAAAAAAAAAAAA!!!



  • di HarryBosch data: 05/10/2012 22:19:02

    lol



  • di Francesco (utente non iscritto) data: 05/10/2012 22:40:35




  • di Vecchio Frac data: 06/10/2012 08:00:15

    LOL, avrei dovuto (potuto) pensarci.
    Le Sub (o Function) nei Moduli hanno la precedenza sulle Sub (o Function) omonime presenti nei fogli.