Sfarfallio



  • Sfarfallio
    di Tullio (utente non iscritto) data: 04/11/2013 11:13:21

    Buongiorno a tutti,
    avrei ancora un problemino, lo sfarfallio del monitor, che non riesco ad eliminare da questa sub che
    lavorando su alcune celle del foglio "fattura" le copia in una riga del foglio "Archivio".
    Se utilizzo l'istruzione remmata non sfarfalla ma fa una copia fisica delle celle, vale a dire che quello
    che copia sono anche i formati e questo non lo vorrei, c'è modo di impostare il Copy_destination come il
    PasteSpecial ? Oppure evitare lo sfarfallio con la sub attuale?
    Grazie in anticipo.
    Tullio
     
    Sub archivia()
    
    Dim RF, CF As Variant
    Application.ScreenUpdating = False
    RF = Array(12, 17, 15, 26, 56, 56, 57, 57, 58, 58)
    CF = Array(5, 3, 3, 5, 4, 5, 4, 5, 4, 5)
    Dim Riga, Colonna, maxcolonna,n As Integer
    maxcolonna = 10
    Riga = 4
    Colonna = 1
    Sheets("archivio").Select
    Cells(Riga, Colonna).Select
    While Not Cells(Riga, Colonna) = "" ' Controlla tutte le righe della prima colonna
        Riga = Riga + 1                 ' se sono vuote
    Wend
    
    For n = 1 To maxcolonna
        If n = 2 Then
         Colonna = Colonna + 2
        End If
            Sheets("fattura").Select
            Cells(RF(n), CF(n)).Select   'DA COPIARE
            Selection.Copy
            Sheets("archivio").Select
            Cells(Riga, Colonna).Select
            Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= False, Transpose:=False
    
            'Sheets("Fattura").Cells(RF(n), CF(n)).Copy Destination:=Sheets("Archivio").Cells(Riga, Colonna)
    
            Colonna = Colonna + 1
    Next
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    End Sub



  • di gaetanopr data: 04/11/2013 11:21:19

    se ho capito bene basta aggiungere questa parte, che elimina le formattazioni e non i contenuti

    ClearFormats
    quindi dievnta
     
    Sheets("Fattura").Cells(RF(n), CF(n)).Copy Destination:=Sheets("Archivio").Cells(Riga, Colonna).ClearFormats 



  • di Vecchio Frac data: 04/11/2013 11:23:49

    Non serve preselezionare ogni cella.
    Inoltre sono convinto che puoi copiare i dati tutti in una volta, non riga per riga (individui l'esatto range, lo copi, lo incolli).
    Se il metodo "range.Copy Destination" è veloce e efficiente, utilizzalo comunque, poi sul range di destinazione fai un bel .ClearFormats e sei a posto.





  • di Vecchio Frac data: 04/11/2013 11:24:49

    Caspita, gaetano mi ha battuto sul tempo ^_^
    Però dubito che puoi fare tutto su un'unica istruzione. Magari anche sì, chi lo sa, basta provare :)





  • di gaetanopr data: 04/11/2013 11:30:43

    Ciao V.F si nota sempre la tua assenza anche se breve, anch'io purtroppo sono senza pc anzi sono con un pc senza excel, quindi le prove le lasciamo al nostro amico Tullio



  • di Vecchio Frac data: 04/11/2013 11:41:08

    cit. "si nota sempre la tua assenza"
    ---> un complimento audace... siamo pieni di vuoto insomma oppure siamo assordati dal silenzio :)





  • di Tullio (utente non iscritto) data: 04/11/2013 11:50:19

    Ciao gaetanopr,
    ho aggiunto il .ClearFormats ma mi da errore di run_time 1004.
    Ciao VecchioFrac,
    "Non serve preselezionare ogni cella.
    Inoltre sono convinto che puoi copiare i dati tutti in una volta, non riga per riga (individui l'esatto range, lo copi, lo incolli).
    Se il metodo "range.Copy Destination" è veloce e efficiente, utilizzalo comunque, poi sul range di destinazione fai un bel .ClearFormats e sei a posto."
    E' probabile che non mi sia speigato bene: Le celle da copiare sono quelle dell'array RF e CF, quindi una quà e una là, e le devo copiare una dopo l'altra tutte in una sola riga dell'altro foglio. E' possibile farlo evidenziando un range?
    Non serve preselezionare ogni cella - Quindi potrei "Cells(RF(n), CF(n)).Selection.Copy" ?
    Grazie
    Tullio




  • di Tullio (utente non iscritto) data: 04/11/2013 12:00:34

    Scusate non avevo scritto tutto.
    Errore 1004 - Errore nel metodo Copy per la classe Range
    Tullio



  • di gaetanopr (utente non iscritto) data: 04/11/2013 12:04:23

    Quindi prova suddividendola in due istruzioni
    Ciao



  • di Tullio (utente non iscritto) data: 04/11/2013 12:10:34

    Scusa ma non capisco,
    cosa è da suddividere in due istruzioni?
    Tullio



  • di gaetanopr (utente non iscritto) data: 04/11/2013 12:11:50

    Prima effettui la copia e dopo togli le formattazioni
     
    Sheets("Fattura").Cells(RF(n), CF(n)).Copy Destination:=Sheets("Archivio").Cells(Riga, Colonna)
    Sheets("Archivio").Cells(Riga, Colonna).ClearFormats 



  • di Tullio (utente non iscritto) data: 04/11/2013 12:18:08

    Ok. Fatto ma si presenta un'altro inconveniente:
    i dati copiati sono:

    Nome Cliente
    data progetto
    riferimento progetto
    importo progetto
    scadenza progetto

    toglie la formattazione alla data e mi da il numero seriale, toglie i simboli € dagli importi e la scadenza è sempre un numero seriale.
    Suggerimenti ?
    Grazie.
    Tullio



  • di gaetanopr (utente non iscritto) data: 04/11/2013 12:24:40

    Senza file è un pò difficile aiutarti, comunque nella seconda istruzione invece della variabile colonna indica direttamente la colonna di rifermento che non deve essere formattata.



  • di Tullio (utente non iscritto) data: 04/11/2013 12:25:48

    Grazie, ho inserito un if che condiziona la formattazione delle colonne.
    Tullio



  • di gaetanopr (utente non iscritto) data: 04/11/2013 12:27:14

    esempio se non devi formattare la colonna dove è indicato il "Nome Cliente" e questa è la colonna D
    l'istruzione diventa, poi dipende quali sono le colonne per cui la formattazione non deve cambiare?
     
    Sheets("Archivio").Cells(Riga, 4).ClearFormats 



  • di Grograman data: 04/11/2013 12:30:06

    Ma il file con la struttura reale dei dati è visionabile?



  • di Tullio (utente non iscritto) data: 04/11/2013 12:35:22

    Volevi dire
     
    Sheets("Archivio").Cells(Riga, 4)



  • di Tullio (utente non iscritto) data: 04/11/2013 12:38:51

    Certo, intendi il foglio da copiare ?



  • di Tullio (utente non iscritto) data: 04/11/2013 16:26:36

    Ciao a tutti,
    ho allegato il file dal quale ricavo i dati (celle evidenziate in grigio) da copiare su una riga dell'"Archivio" e come vedete oltre ad una casella di convalida dati che però non dà problemi ci sono altre celle formattate in modo diverso, vorrei che in Archivio fossero tutte trascritte senza grassetto, così come sono e tutte con lo stesso carattere.
    Tullio



  • di Tullio (utente non iscritto) data: 04/11/2013 17:12:34

    VecchioFrac,
    come al solito in due parole hai centrato il problema, l'hai risolto e ora ti meriti il sentito e dovuto GRAZIE.
    La sub l'ho modificata secondo le tue istruzioni (credo) e funziona come dovrebbe e non sopratutto non sfarfalla.
    Allego codice:
     
    Sub archivia()
    
    Dim RF, CF As Variant
    Application.ScreenUpdating = False
    RF = Array(12, 17, 15, 26, 56, 56, 57, 57, 58, 58)
    CF = Array(5, 3, 3, 5, 4, 5, 4, 5, 4, 5)
    Dim Riga, Colonna, maxcolonna, n As Integer
    maxcolonna = 10
    Riga = 4
    Colonna = 1
    Sheets("archivio").Select
    Cells(Riga, Colonna).Select
    While Not Cells(Riga, Colonna) = "" ' Controlla tutte le righe della prima colonna
        Riga = Riga + 1                 ' se sono vuote
    Wend
    
    For n = 1 To maxcolonna
        If n = 2 Then
         Colonna = Colonna + 2
        End If
            Sheets("fattura").Select
            Cells(RF(n), CF(n)).Copy  
            Sheets("archivio").Select
            Cells(Riga, Colonna).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Colonna = Colonna + 1
    Next
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    End Sub
    



  • di Tullio (utente non iscritto) data: 04/11/2013 17:18:23

    Grazie anche a tutti gli altri che sono intervenuti, imparo sempre qualcosa.
    Tullio



  • di Vecchio Frac data: 04/11/2013 17:53:51

    Io? fatto niente, forse volevi ringraziare gaetano che ha fatto il lavoro sporco ^_^





  • di Tullio (utente non iscritto) data: 04/11/2013 18:48:56

    Certo che ringrazio gaetano e l'ho già fatto, ma il tuo input sul come utilizzare il Copy senza Select unito al Paste special mi ha fatto lavorare un pò ma era quello che cercavo.
    Tullio.



  • di gaetanopr data: 04/11/2013 19:12:25

    cit>>Certo che ringrazio gaetano e l'ho già fatto
    --di nulla
    cit>>, ma il tuo input sul come utilizzare il Copy senza Select unito al Paste special mi ha fatto lavorare un pò ma era quello che cercavo.
    Tullio.

    Ciao Tullio, riguarda il codice, se ci fai caso non occorre nemmeno selezionare i fogli.
    La selezione è tipica del registratore di macro, che nell'interfaccia excel questo è normale, in quanto devi prima selezionare una o più celle per lavorarci ma in Vba questo non occorre.



  • di Tullio (utente non iscritto) data: 04/11/2013 19:22:47

    Non è per mettere in dubbio quello che mi dici gaetanopr, ma come fa il VBA a sapere su quale foglio deve agire ? Vuoi dire che se inserisco il codice così funziona ugualmente ?

     
    Sub archivia()
    
    Dim RF, CF As Variant
    Application.ScreenUpdating = False
    RF = Array(12, 17, 15, 26, 56, 56, 57, 57, 58, 58)
    CF = Array(5, 3, 3, 5, 4, 5, 4, 5, 4, 5)
    Dim Riga, Colonna, maxcolonna, n As Integer
    maxcolonna = 10
    Riga = 4
    Colonna = 1
                                                                                                              'Sheets("archivio").Select
                                                                                                              'Cells(Riga, Colonna).Select
    While Not Cells(Riga, Colonna) = "" ' Controlla tutte le righe della prima colonna
        Riga = Riga + 1                 ' se sono vuote
    Wend
    
    For n = 1 To maxcolonna
        If n = 2 Then
         Colonna = Colonna + 2
        End If
                                                                                                              ' Sheets("fattura").Select
            Cells(RF(n), CF(n)).Copy   'DA COPIARE
                                                                                                              ' Sheets("archivio").Select
            Cells(Riga, Colonna).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Colonna = Colonna + 1
    Next
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    End Sub
    



  • di gaetanopr (utente non iscritto) data: 04/11/2013 19:30:39

    Ciao Tullio io ho detto che non occorre selezionare ma il nome lo devi indicare



  • di Tullio (utente non iscritto) data: 04/11/2013 19:40:27

    Grande, se continuiamo così fra un pò il codice non occorre nemmeno che lo scriva.
    Grazie di nuovo. Avevo scritto qualche Km di codice e ora siamo si e no a venti righe.



  • di Vecchio Frac data: 05/11/2013 08:29:30

    cit. "se inserisco il codice così funziona ugualmente?"
    ---> I riferimenti ai range si intendono al foglio attivo della cartella (file Excel) attiva.
    Solo quando si vuole agire su range diversi è necessario qualificarli, solitamente con l'indicazione del foglio seguito dal punto e dal range interessato.

    Se è attivo il "foglio1", i codici seguenti sono equivalenti:
    Range("A1") = 15
    Sheets("Foglio1").Range("A1") = 15
    Worksheets("Foglio1").Range("A1") = 15
    Activesheet.Range("A1") = 15
    With Sheets("Foglio1")
    .Range("A1") = 15
    End With


    cit. "fra un pò il codice non occorre nemmeno che lo scriva"
    ---> LOL