Formattazione particolare



  • Formattazione particolare
    di Eddy (utente non iscritto) data: 14/12/2012 16:03:50

    Formattazione particolare e somma quando vuota di Edoardo (utente non iscritto) data: 14/12/2012 15:58:36

    Ciao a tutti!

    Premetto che non sono programmatore, mi diletto solo con l'uso delle Macro registrate. Ma con quelle non riesco a fare quello che vorrei per questo file.
    Dal mio gestionale ricevo una file dati Excel con colonne standard ma lunghezza di righe sempre diversa;
    Io devo formattarlo in un modo sempre standard in modo che il mio cliente lo possa leggere in automatico col suo sistema informatico.

    Queste sono le operazioni automatiche che non riesco a fare:
    1) nella cella C8: devo mettere la data di oggi (ma quando riapro il file deve rimanere la data messa la prima volta)
    2) nella cella C9: devo inserire il nome del file
    3) a partire dalla riga 12: devo inserire una riga vuota ogni volta che, la cella A e la cella B sono diverse dalla cella A o B della riga sopra (operatori logici corretti)
    4) a partire dalla riga 12, per ogni riga vuota che ho inserito, nelle celle O di riga deve fare la somma di tutte le celle soprastanti, ma della colonna N, fermandosi ogni volta che trova una riga vuota.
    4b) Formula come il punto 4 ma spostata 2 celle a dx. Quindi a partire dalla riga 12, per ogni riga vuota che ho inserito, nelle celle Q di riga deve fare la somma di tutte le celle soprastanti, ma della colonna P, fermandosi ogni volta che trova una riga vuota.
    5) Finito l'inserimento delle somme parziali del punto 4, in fondo alle colonne O e Q, saltare una riga e fare la somma totale di tutte somme parziali nelle righe soprastanti.

    C'è qualcuno che mi aiuta con il codice?
    Ho allegato i 2 file per semplificare la cosa


    Grazie a tutti per la collaborazione!!



  • di Vecchio Frac data: 14/12/2012 21:42:56

    Non è impossibile da realizzare ma ci vuole un po' di cura.
    Personalmente adesso non ho possibilità di dedicarmi.
    Se vedi però che nei prossimi giorni non ricevi risposte, fai un up per ricordarcelo :)





  • di Textomb data: 15/12/2012 21:28:02

    Ho provato a scrivere due righe che svolgono il compitino (credo...)
    Ci sono alcuni passaggi che non ho capito bene e quindi, nel caso, andrebbero adattati.
    Nel caso puoi darmi ulteriori indicazioni...
    Ovviamente i due file devono essere entrambi aperti. Quello del Gestionale e quello della tabella elaborata
    Ho supposto che il file proveniente dal gestionale si chiama "file da gestionale.xls"
    La seguente routine va lanciata dal file in cui deve essere elaborata la tabella.

     
    Option Explicit
    
    Sub Importa()
    
    Dim i As Integer, FileGest As Worksheet, EFile As Worksheet, EFileFR As Integer, FileGestFR As Integer
    Set FileGest = Workbooks("file da gestionale.xls").Worksheets(1)
    Set EFile = Worksheets(ActiveSheet.Name)
    ' La prima cosa che faccio è svuotare la tabella da eventuali valori precedenti. Nel caso potrebbero inficiare i risultati
    EFileFR = EFile.Range("a" & Rows.Count).End(xlUp).Row
    EFile.Range("a12:s" & EFileFR).Clear
    ' Adesso gli appiccico i dati della tabella proveniente dal gestionale
    FileGest.Range("a1").CurrentRegion.Offset(1).Copy EFile.Range("a12")
    'Ricalcolo EFileFR che mi serve per il ciclo successivo
    EFileFR = EFile.Range("a" & Rows.Count).End(xlUp).Row
    ' inizio con l'elaborazione dei punti
    EFile.[c8] = Now() ' questo scrive la data
    EFile.[c9] = "NomeFile" 'non ho capito da dove dovrei prendere il nome del file
    
    ' inizio con aggiungere le righe laddove necessarie
    For i = EFileFR To 13 Step -1
    If EFile.Range("a" & i) <> EFile.Range("a" & i - 1) Or EFile.Range("b" & i) <> EFile.Range("b" & i - 1) Then
    EFile.Range("a" & i).EntireRow.Insert
    End If
    Next
    
    ' Adesso EFileFR sarà ancora diverso. Lo ricalcolo perchè mi serve per il ciclo successivo
    EFileFR = EFile.Range("a" & Rows.Count).End(xlUp).Row
    
    ' adesso posso fare le somme laddove servono
    Dim MyRange As Range, MyCell As Range, PrevCell As Integer
    Set MyRange = EFile.Range("a12:a" & EFileFR + 1)
    
    PrevCell = 12 ' Inizzializzo la variabile
    
    
    Do
    Set MyCell = MyRange.Find(what:="", LookIn:=xlValues)
    
    With MyCell
    .Value = "Totale"
    .Font.Bold = True
    End With
    
    EFile.Range("o" & MyCell.Row).Value = WorksheetFunction.Sum(EFile.Range("n" & MyCell.Row - 1 & ":n" & PrevCell))
    EFile.Range("q" & MyCell.Row).Value = WorksheetFunction.Sum(EFile.Range("p" & MyCell.Row - 1 & ":p" & PrevCell))
    
    PrevCell = MyCell.Row + 1
    
    Loop Until MyCell.Row = EFileFR + 1
    
    ' Adesso ho ultimato le somme e devo solo inserire i totali alla fine della tabella e applico un minimo di formattazione alla tabella
    
    With EFile.Range("a12").End(xlDown).Offset(2)
    .Value = "Totale Generale"
    .Font.Bold = True
    .Offset(, 14).Value = WorksheetFunction.Sum(EFile.Range("o12:o" & EFileFR + 1))
    .Offset(, 16).Value = WorksheetFunction.Sum(EFile.Range("q12:q" & EFileFR + 1))
    End With
    
    EFile.Range("a12").CurrentRegion.Offset(1).Font.Size = 8
    Union(EFile.Range("o12:o" & EFileFR + 3), EFile.Range("q12.q" & EFileFR + 3)).NumberFormat = "#,#.00"
    
    End Sub
    



  • di Vecchio Frac data: 17/12/2012 15:13:31

    Textomb è stato bravissimo, mi ha preceduto alla grande e ha pure formattato il foglio come si deve :)
    Mi permetto di allegare comunque la mia revisione dell'intera procedura, un po' perchè è più breve :) e un po' per fornire un approccio leggermente diverso al problema.
    Il codice chiede, all'avvio, di scegliere il file proveniente dal gestionale e quindi lo importa come richiesto effettuando gli shifting delle righe nonchè le somme volute.
    Non prevede però alcuna formattazione, nè di testo, nè nei numeri, anche perchè il cliente di Eddy deve leggere in automatico i dati, quindi poi se li formatterà come vuole.
    Anche questa macro va inserita in un modulo del file di avvio (non quello proveniente dal gestionale) e lanciata da lì.
     
    Option Explicit
    
    Sub import_data()
    Dim f As Variant, wbk_gest As Workbook, wbk As Workbook, j As Integer
    Dim last_row As Long, i As Integer, partial_sum_total_per_style As Single, partial_sum_total_per_style_dispatched As Single
        
        f = Application.GetOpenFilename("Excel files (*.xls),*.xls,Tutti i files (*.*),*.*", , "Scegli il file da gestionale", MultiSelect:=False)
        If f = False Then Exit Sub
    
        Application.ScreenUpdating = False
        
        Range("A12", "S" & Columns(1).Cells.Count).ClearContents
        Set wbk = ThisWorkbook
    
        Set wbk_gest = Workbooks.Open(f)
        wbk_gest.Sheets(1).[a1].CurrentRegion.Offset(1).Copy wbk.Sheets(1).[a12]
        wbk_gest.Close
    
        '1) nella cella C8: devo mettere la data di oggi (ma quando riapro il file deve rimanere la data messa la prima volta)
        [C8] = Format(Now(), "dd/mm/yyyy")
    
        '2) nella cella C9: devo inserire il nome del file
        [C9] = ActiveWorkbook.Name
    
        '3) devo inserire una riga vuota ogni volta che la cella A e la cella B sono diverse dalla cella A o B della riga sopra
        last_row = [a12].CurrentRegion.Rows.Count
        For i = 10 + last_row To 13 Step -1
            If Cells(i, 1) & Cells(i, 2) <> Cells(i - 1, 1) & Cells(i - 1, 2) Then
                Cells(i, 1).EntireRow.Insert
                
                '4) nelle celle di colonna O deve riportare la somma delle celle corrispondenti in colonna N
                j = Cells(i + 1, "O").CurrentRegion.Rows.Count
                Cells(i + 1, "O").Offset(j) = partial_sum_total_per_style + Cells(i + 1, "N")
                '4b) nelle celle di colonna Q deve riportare la somma di tutte le celle soprastanti in colonna P
                Cells(i + 1, "Q").Offset(j) = partial_sum_total_per_style_dispatched + Cells(i + 1, "P")
                
                partial_sum_total_per_style = 0
                partial_sum_total_per_style_dispatched = 0
            Else
                partial_sum_total_per_style = partial_sum_total_per_style + Cells(i, "N")
                partial_sum_total_per_style_dispatched = partial_sum_total_per_style_dispatched + Cells(i, "P")
            End If
        Next
    
        '5) in fondo alle colonne O e Q, saltare una riga e fare la somma totale di tutte somme parziali nelle righe soprastanti.
        Cells(Columns(1).Cells.Count, 1).End(xlUp).Offset(3, 14) = [SUM(O:O)]
        Cells(Columns(1).Cells.Count, 1).End(xlUp).Offset(3, 16) = [SUM(Q:Q)]
        
        Application.ScreenUpdating = True
        
        MsgBox "Ho finito."
    
    End Sub
    






  • di Textomb data: 17/12/2012 22:40:47

    trovo estremamente interessante i diversi modi di approcciare alle problematiche proposte.
    ottima opportunità per imparare.
    Ho testato la tua routine e funziona bene.