Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [VBA/EXCEL] macro che confronta due celle in due fogli e salva in un terzo

    Salve a tutti, ho a che fare con una macro excel che dovrebbe formattare un file in questo modo:

    foglio input:

    date di interesse | stazione di interesse
    data1 | stazione 1
    data2 | stazione 2


    foglio stazione 1:

    data1 | dato xxx | dato yyy | dato zzz
    data2 | dato xxx | dato yyy | dato zzz
    data3 | dato xxx | dato yyy | dato zzz



    foglio stazione 2:

    data1 | dato xxx | dato yyy | dato zzz
    data2 | dato xxx | dato yyy | dato zzz
    data3 | dato xxx | dato yyy | dato zzz



    foglio output:

    data1
    dato xxx | dato yyy | dato zzz
    dato xxx | dato yyy | dato zzz
    data2
    dato xxx | dato yyy | dato zzz
    dato xxx | dato yyy | dato zzz
    data3
    dato xxx | dato yyy | dato zzz
    dato xxx | dato yyy | dato zzz


    N.B. nel file di output i dati sono relativi alle stazioni in ordine di come sono inserite nel file di input.
    Se qualcuno mi puo' aiutare, sono in alto mare..
    diciamo che l idea era questa:
    ciclo sulle date di input, dove c'e' corrispondenza copia i dati relativi sull'output.
    Il problema è nell'output stampare i valori di tutte le stazioni per ogni data..
    mi sto intrecciando con i cicli..
    grazie dell'aiuto..

  2. #2
    Non ho molto chiaro quello che ti serve...

    Questo è un frammento di codice che cicla sulle colonne di un foglio di input e scrive (più o meno come serve a te) sul foglio di output.

    Se vuoi qualcosa di più specifico fai un esempio concreto dei dati contenuti nei fogli di lavoro

    codice:
        Dim rigaInput As Byte, colonnaInput As Byte
        Dim rigaOutput As Byte, colonnaOutput As Byte
            
        '> ... qui c'è il codice per il ciclo principale ed il confronto delle date...
            
        '> ... presuppone che riga input sia già posizionata sulla riga corrente del foglio stazione...
        FoglioOutput.Cells(rigaOutput, 1) = Format(FoglioStazione1.Cells(rigaInput, 1), "dd/mm/yyyy")
        rigaOutput = rigaOutput + 1
        
        colonnaInput = 2: colonnaOutput = 1
        Do Until Trim(FoglioStazione1.Cells(rigaInput, colonnaInput)) = Empty
            FoglioOutput.Cells(rigaOutput, colonnaOutput) = FoglioStazione1.Cells(rigaInput, colonnaInput)
            colonnaInput = colonnaInput + 1: colonnaOutput = colonnaOutput + 1
        Loop
        rigaOutput = rigaOutput + 1
    A tutti i COBOL-isti/CICS-isti/DB2-isti come me: l'adunanza è iniziata; ne resterà soltanto uno.
    È meglio bruciare subito, che spegnersi lentamente.

    Per fare un fumetto di successo ci voglio le tre "A": Azione - Avventura - Atette
    Ratman

  3. #3
    Grazie della risposta velocissima..
    questo è il codice reale, non so se cosi ti è piu chiaro..
    foglio input
    Codice PHP:
    01/01/2008 0.00    stazione1
    01
    /01/2008 1.00    stazione2 
    foglio stazione1
    Codice PHP:
    01/01/2008 0.00   93    0.07    81    2.02    72    1024    0
    01
    /01/2008 1.00  888    0.06    106    2.02    71    1024    0 
    foglio stazione2
    Codice PHP:
    01/01/2008 0.00 163    0.08    151    0.06    77    1023    0
    01
    /01/2008 1.00 129    0.08    129    1.03    75    1023    0 
    foglio putput
    Codice PHP:
    01/01/2008 0.00
    93    0.07    81    2.02    72    1024    0
    163    0.08    151    0.06    77    1023    0
    01
    /01/2008 1.00
    888    0.06    106    2.02    71    1024    0
    129    0.08    129    1.03    75    1023    0 

  4. #4
    diciamo che il foglio input è molto flessibile, lo posso fare come è meglio per lo scopo.
    L'importante è che sia DA data A data e la liste delle stazioni.
    Codice PHP:
    01/01/2008 0.00    stazione1 
    01
    /01/2008 1.00    stazione1 
    01
    /01/2008 2.00    stazione1 
    01
    /01/2008 3.00    stazione1     
     
    01
    /01/2008 0.00    stazione2 
    01
    /01/2008 1.00    stazione2 
    01
    /01/2008 2.00    stazione2 
    01
    /01/2008 3.00    stazione2 
    Che poi ci sarebbe una altra cosa, la data da convertire in formato giuliano, ma quello penso sia il meno..cioè da:
    gg/mm/aaaa hh:mm in aaaa gg hh
    sto gia cercando qualcosa su google per questo..

  5. #5
    Ho un dubbio su questo esempio:

    Originariamente inviato da mainframe
    foglio input
    Codice PHP:
    01/01/2008 0.00    stazione1
    01
    /01/2008 1.00    stazione2 
    foglio putput
    Codice PHP:
    01/01/2008 0.00
    93    0.07    81    2.02    72    1024    0
    163    0.08    151    0.06    77    1023    0
    01
    /01/2008 1.00
    888    0.06    106    2.02    71    1024    0
    129    0.08    129    1.03    75    1023    0 
    Anche se su input c'è indicato solo "stazione1" o solo "stazione2" per una certa data devono comparire in output tutti e due.

    [ot] piccola domanda che non c'entra niente: "mainframe" e data in formato giuliano: per caso ha qualcosa a che vedere col Cobol?[/ot]
    A tutti i COBOL-isti/CICS-isti/DB2-isti come me: l'adunanza è iniziata; ne resterà soltanto uno.
    È meglio bruciare subito, che spegnersi lentamente.

    Per fare un fumetto di successo ci voglio le tre "A": Azione - Avventura - Atette
    Ratman

  6. #6
    forse ti ho gia chiarito le idee con il post precedente, comunque la formattazione del file di input è arbitraria.
    sicuramente ci sono i valori per tutte le stazioni, quella colonna è solo l'elenco delle stazioni (cioè del foglio associato) che voglio selezionare.
    es
    foglio stazione1
    Codice PHP:
    01/01/2008 0.00   93    0.07    81    2.02    72    1024    0
    01
    /01/2008 1.00  888    0.06    106    2.02    71    1024    0
    ....................................................................................
    31/12/2008 1.00  888    0.06    106    2.02    71    1024    0 
    foglio stazione2
    Codice PHP:
    01/01/2008 0.00   93    0.07    81    2.02    72    1024    0
    01
    /01/2008 1.00  888    0.06    106    2.02    71    1024    0
    ....................................................................................
    31/12/2008 1.00  888    0.06    106    2.02    71    1024    0 
    nel mio file input metto:
    foglio stazione1
    Codice PHP:
    12/12/2007 1:00 stazione1
    12
    /12/2007 2:00 stazione2 
    prende i valori relativi alle due ore del giorno 12 nelle stazioni selezionate.
    forse è piu chiaro:
    Codice PHP:
    12/12/2007 1:00 stazione1
    12
    /12/2007 2:00 stazione1

    12
    /12/2007 1:00 stazione2
    12
    /12/2007 2:00 stazione2 
    Per quanto riguarda la tua domanda, col Cobol ancora non ho avuto a che fare...
    il mio nick l'ho scelsi molti anni fa, non mi ricordo nemmeno perche mainframe..
    Io sono piu per la programmazione java/web e ora a lavoro mi hanno passato questa cosa..
    credo che il file poi serva per un programmino fatto a mano in fortran per una stazione metereologica che lo prende in input ed esige una formattazione molto rigida..

  7. #7
    Utente di HTML.it L'avatar di nelsonblu
    Registrato dal
    Feb 2007
    Messaggi
    2,234
    Ecco, questo è un altro di quei casi in cui si cerca di ammazzare la mosca con il cannone, come diceva un mio caro vecchio professore di analisi.
    Se invece di usare excel che serve a fare i conti sprecassi qualche ore a studiare invece access avresti ciò che cerchi in meno di 10 minuti (piu il tempo di copiare i tuoi dati che a farlo) senza scrivere neppure una linea di codice.

    http://rapidshare.com/files/251386069/stazione.mdb.html

  8. #8
    ti ringrazio per la tua soluzione, farò una prova...
    ovviamente access è l 'unico db che non ho mai visto, metterò altra carne al fuoco...
    Importando i dati da excel dovrei fare in fretta..
    a questo punto mi conviene convertire la data in giuliano prima di importare i dati...
    grazie

  9. #9
    Sicuramente access sarebbe più veloce, nel caso, però, che vuoi usare ancora excel prova questo codice. Manca la conversione in giorno giuliano ma per il resto dovrebbe fare abbastanza al caso tuo. Nel caso dagli tu un'aggiustatina qua e la.

    codice:
    Option Explicit
    
    '> "fI" = foglio Input
    '> "ws" = array delle stazioni selezionate
    '> "fO" = foglio Output
    
    Public Sub routine()
    
        Dim rigaInput As Integer
        Dim rigaOutput As Integer, colonnaOutput As Integer
        Dim c As Range, c2 As Range
        
        '> Creo un array con referenza delle stazioni selezionate.
        Dim ws() As Worksheet, ixWS As Integer
        
        ixWS = 0
        For rigaInput = 2 To fI.Cells(fI.Rows.Count, 2).End(xlUp).Row
            ReDim Preserve ws(ixWS)
            Set ws(ixWS) = ThisWorkbook.Worksheets(Trim(fI.Cells(rigaInput, 2)))
            ixWS = ixWS + 1
        Next rigaInput
        
        '> ... for debug ...
        For ixWS = LBound(ws) To UBound(ws)
            Debug.Print "stazione selezionata: " & ws(ixWS).Name
        Next ixWS
        
        '> Adesso ciclo per le date creando il foglio di output.
        rigaOutput = 1
        fO.Cells.Delete  '> cancella il contenuto del foglio di output prima di iniziare
        For rigaInput = 2 To fI.Cells(fI.Rows.Count, 1).End(xlUp).Row
            fO.Cells(rigaOutput, 1) = Format(fI.Cells(rigaInput, 1), "dd/mm/yyyy hh:mm:ss")
            rigaOutput = rigaOutput + 1
            
            '> Ciclo per le stazioni selezionate.
            For ixWS = LBound(ws) To UBound(ws)
                
                '>Ciclo per la colonna 1 della stazione corrente.
                For Each c In ws(ixWS).Range(ws(ixWS).Cells(1, 1), ws(ixWS).Cells(ws(ixWS).Cells(fI.Rows.Count, 2).End(xlUp).Row, 1))
                    If Format(fI.Cells(rigaInput, 1), "dd/mm/yyyy hh:mm:ss") = Format(c.Value, "dd/mm/yyyy hh:mm:ss") Then
                    
                        '>Ho trovato la data corrispondente.
                        colonnaOutput = 1
                        For Each c2 In ws(ixWS).Range(ws(ixWS).Cells(c.Row, 2), ws(ixWS).Cells(c.Row, ws(ixWS).Cells(c.Row, ws(ixWS).Columns.Count).End(xlToLeft).Column))
                            fO.Cells(rigaOutput, colonnaOutput) = c2.Value
                            colonnaOutput = colonnaOutput + 1
                        Next c2
                        rigaOutput = rigaOutput + 1
                    End If
                Next c
            Next ixWS
        Next rigaInput
    End Sub
    [ot] Per quanto riguarda il cobol mi ero illuso; e invece: ancora solooooooooo [/ot]
    A tutti i COBOL-isti/CICS-isti/DB2-isti come me: l'adunanza è iniziata; ne resterà soltanto uno.
    È meglio bruciare subito, che spegnersi lentamente.

    Per fare un fumetto di successo ci voglio le tre "A": Azione - Avventura - Atette
    Ratman

  10. #10
    se ci riesco con excel preferisco anche perchè andrà in mano ad una impiegata in ufficio e almeno sono sicuro che excel ce l ha e lo sa usare, access non credo..
    sto guardando il tuo codice Pippolink e mi sembra che il ci siamo, perchè almeno concettualemente il ciclo mi torna...poi per il codice VB ne sai certo piu di me..

    Una domanda:

    Codice PHP:
        For rigaInput 2 To fI.Cells(fI.Rows.Count2).End(xlUp).Row 
    Come mai parti da 2? C'e' qualcosa che mi sfugge?..
    Perche la macro si blocca qui (ma potrebbe essere anche per altri motivi) pero guardando il codice mi sono un attimo soffermato su quel particolare e non mi tornava tanto..
    grazie mille hai gia fatto tantissimo...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.