Stampa riepilogo vba



  • Stampa riepilogo vba
    di Anna (utente non iscritto) data: 31/07/2012

    Sono più imbranata di una foca:
    ho un file di nome pippo composto da 210 fogli.
    avrei bisogno di una macro che mi crei un foglio riepilogativo. ho provato e nelle mie intenzioni questa macro 51 dovrebbe prendere il contenuto di c1 del foglio
    0027 e scriverlo in posiz. a5 del foglio riepilogo; dovrebbe poi
    prendere il contenuto di d1 del foglio 0027 e scriverlo in posiz.b5 del foglio riepilogo.
    quindi dovrebbe passare al foglio 0063 e fare le stesse cose.
    ( l’esempio si ferma qui, ma in realtà i fogli su cui deve fare questo lavoro sono 210 ).

    sub macro51()

    sheets("0027").select
    range("c1").select
    selection.copy
    sheets("riepilogo").select
    range("a5").select
    activesheet.paste
    sheets("0027").select
    range("d1").select
    selection.copy
    sheets("riepilogo").select
    range("b5").select
    activesheet.paste

    sheets("0063").select ***
    range("c1").select
    selection.copy
    sheets("riepilogo").select
    range("a7").select
    activesheet.paste
    sheets("0063").select
    range("d1").select
    selection.copy
    sheets("riepilogo").select
    range("b7").select
    activesheet.paste
    end sub

    quando la lancio mi dà errore fermandosi sulla riga ***
    ( errore di runtime 9: indice non incluso nell’intervallo )

    dov’è l’errore ?

    p.s se poi esistesse un sistema migliore per ottenere queste stampe sarei ben lieto di
    utilizzarlo.
    grazie per chi ha la pazienza di rispondermi.



  • di Vecchio frac data: 31/07/2012

    Come, dov'è l'errore? :)
    tu stesso dici: "...quando la lancio mi dà errore fermandosi sulla riga *** ( errore di runtime 9: indice non incluso nell’intervallo )"

    più chiaro di così... in pratica non esiste un foglio con quel nome.
    comunque, che sistema operativo hai e che versione di excel utilizzi?
    ti servono davvero 210 fogli?
    la copia deve avvenire sempre e solo dai fogli citati? nell'ordine che hai segnalato o in un ordine diverso (dal primo all'ultimo in sequenza per esempio?)
    la copia deve avere come destinazione sempre le celle che hai indicato?






  • di Anna (utente non iscritto) data: 31/07/2012

    Ma è proprio questo che mi fa impazzire: il foglio 0063 esiste !
    in pratica questo è il mio problema: ho questo file di nome pippo che contiene 210 fogli, tanti quanti sono gli utenti iscritti alla nostra associazione di volontariato, fogli che si chiamano con il codice dell’utente di quel foglio. quindi 0027,0063 e così via.
    mi serve che da tutti questi fogli mi venga creato un foglio riepilogativo che ha come intestazione
    codice utente nome ( da ripetere su tutti i fogli ),
    tralasciando quei fogli che nella cella m1 hanno la lettera d.
    ( in realtà il foglio riepilogativo deve contenere anche altri dati e calcoli , per semplificare ho messo solo codice e nome che si trovano su tutti i fogli nelle celle c1 e d1 ).
    ti ringrazio molto dell’interessamento e dell’aiuto che, se puoi, mi saprai dare.
    anna




  • di Anna (utente non iscritto) data: 31/07/2012

    Mi sono dimenticata, ho windows xp e office 2007.



  • di Vecchio frac data: 31/07/2012

    Interessante comportamento, anche se snervante, è da capire perchè.
    appena i bimbi mi daranno tregua (leggi: appena li metto a nanna, stasera ^_^) approfondiamo.
    magari intanto anche altri (toc toc vanni... ci sei? ^_^) possono pensarci su.

    ...hai considerato l'ipotesi di utilizzare access per questo tipo di gestione dei dati? penso che sarebbe meglio di excel.





  • di Harrybosch data: 31/07/2012

    Permesso... certo che ci sono!
    ciao anna e ciao francesco
    beh veramente strano questo fatto del foglio 0063. non è che ci sia uno spazio prima o dopo il numero?
    concordo anche pienamente con francesco che access sarebbe decisamente la migliore soluzione per gestire un database di questo tipo, con la creazione delle maschere per ciascun volontario e la visualizzazione dei dati, riepilogati tramite i comodi report.

    in ogni caso anche excel può fare la sua bella figura: il codice che hai postato funziona (almeno nel mio pc lo 0063 sembra essere un numero qualsiasi :) ) ma si dovrebbe copiare 210 volte per ottenere tutte le copie! (senza considerare il fatto che i riferimenti non si aggiornano certo da soli...)
    però il senso era giusto: basta aggiungere un ciclo che passi tutti i fogli presenti, magari escludendo il foglio "riepilogo" visto che su quello dobbiamo riportare i dati cercati.
    dai una occhiata al codice che posto, dove ti metto anche i commenti... e se ti serve qualche chiarimento non esitare a chiedere.
    i dati vengono copiati a partire dalla seconda riga, a seguire. non c'è un ordine preciso per la copiatura: parte dal primo foglio e va in ordine in base a come sono inseriti nella cartella (se serve un ordine, per esempio in base al numero o in base a una data interna al foglio, allora bisogna aggiungere qualche riga di codice ovviamente).
    in attesa di sentire cosa dice francesco...

    ciao, vanni

     
    Sub copia_da_ogni_foglio()
    Dim y As Integer
    Dim foglio
    
    'con questa istruzione evito di passare i fogli uno a uno
        Application.ScreenUpdating = False
        'imposto una variabile per indicare da quale riga partire con la successiva copiatura
        'per esempio dalla seconda riga se nella prima ci sono le intestazioni
        y = 2
        'passo in rassegna ogni foglio della cartella
        For Each foglio In Worksheets
            'se il nome del foglio è diverso da riepilogo...
            If foglio.Name <> "riepilogo" Then
                'allora lo attivo
                foglio.Activate
                'se nel foglio la cella m1 non contiene la d proseguo
                If Range("m1") <> "d" Then
                    'copio le due celle che mi interessano
                    Range("c1", "d1").Copy
                    'mi porto sul foglio riepilogo
                    With Sheets("riepilogo").Activate
                        'seleziono la cella dove voglio copire i dati
                        Range("a" & y).Select
                        'incollo i dati
                        ActiveSheet.Paste
                        'aumento di una riga la variabile (per copiare su quella successiva)
                        y = y + 1
                    End With
                End If
            End If
            'passo al successivo foglio della cartella
        Next foglio
    'apro il foglio riepilogo (se già non ci fossi)
    Sheets("riepilogo").Select
    End Sub
    



  • di Vecchio frac data: 31/07/2012

    Qualcosa del genere?
    o mi sfugge qualcosa?
     
    Sub macro51()
    Dim sh As Worksheet, i As Integer
        
        For Each sh In Worksheets
            If sh.Name = "riepilogo" Then
                MsgBox "Tutti i dati sono stati copiati."
                Exit For
            End If
            
            i = i + 1
            sh.[c1].Copy Destination:=Sheets("riepilogo").[a5].Offset(i, 0)
            sh.[d1].Copy Destination:=Sheets("riepilogo").[b5].Offset(i, 0)
            
        Next
    End Sub






  • di Vecchio frac data: 31/07/2012

    Comunque non c'è motivo per cui il foglio "0063" non possa essere selezionato, se c'è.
    l'unica soluzione ragionevole è che il foglio "0063" contenga uno spazio prima o uno spazio dopo, insomma che sembri "0063" ma non lo sia.
    rinominalo correttamente e fai sapere.






  • di Vecchio frac data: 31/07/2012

    Vanni mi ha battuto sul tempo e ha dato anche un'ottima spiegazione ^_^
    non ho messo tutte le condizioni, per esempio il controllo sul contenuto della cella in m, che è facile fare, ve lo lascio come esercizio :)





  • di Anna (utente non iscritto) data: 01/08/2012

    Un grande grazie ad entrambi. avete risolto in modo brillante il mio problema.
    un'ultimissima cosa: se, oltre al foglio "riepilogo", volessi escludere anche il foglio "storico" come faccio ? ho provato a mettere una cosa del genere (con varie varianti),
    if foglio.name<>"riepilogo" or "storico" then,
    ma mi dà sempre errore.
    un saluto e ancora grazie
    anna



  • di Vecchio frac data: 01/08/2012

    "if foglio.name<>"riepilogo" or "storico" then "

    purtroppo le macchine non ragionano come noi e quindi l'or non fa quel che vorresti tu, scritto così :)
    excel tenta di interpretare l'istruzione come se fosse (occhio alle parentesi):
    "if (foglio.name<>"riepilogo") or "storico" then ..." diventa ad ogni passaggio "if (true) or "storico" then ..." (oppure "if (false) or "storico" then ...)
    non si può confrontare un valore logico con una stringa.
    l'operatore "or" effettua un confronto solo tra valori logici "vero" o "falso"; e restituisce "vero" se almeno uno dei due valori è vero, restituisce "falso" se entrambi i valori sono falsi; quindi devi ripetere il test su ogni condizione, per esteso, che restituisca un valore booleano, vero o falso (true e false).

    e attenzione alla logica... "se il nome del foglio è "riepilogo" oppure il nome del foglio è "storico" allora...": questo è ok quando il nome non è nè riepilogo nè storico, ma se lo è? l'istruzione then viene eseguita, quindi pensa a quello che gli fai fare, visto che magari le cose da fare sono diverse separatamente per i due casi ^_^

    in sintesi, comunque, cambia la riga come riporto sotto nella sezione del codice :)

     
    if foglio.name <> "riepilogo" or foglio.name <> "storico" then ...
    






  • di Anna (utente non iscritto) data: 03/08/2012

    Vecchio frac, mi dai un'ultima mano ?
    avrei bisogno di avere la possibilità di far apparire il foglio che desidero,inserendo il suo nome nella cella a1 del foglio principale.
    mi sarebbe comodo, perchè avendo un file con un mucchio di fogli, farli scorrere tutti per cercare quello che voglio aggiornare mi farebbe perdere troppo tempo.
    grazie e ciao
    anna



  • di Vecchio frac data: 03/08/2012

    Sei in un foglio di riepilogo, digiti un nome utente in a1 e vuoi attivare il foglio corrispondente.
    devi intercettare l'evento worksheet_change, per controllare cosa viene digitato in una qualunque cella del foglio.
    devi ignorare le celle diverse da a1.
    anche se sei in a1, devi ignorare la pressione di canc o di spazio (che restituiscono una cella vuota), e devi considerare come validi solo gli inserimenti che possono essere un codice utente valido (quattro cifre numeriche).

    copia quanto segue nell'editor di codice del foglio in cui vorrai scrivere, in a1, il nome del foglio-utente da visualzzare.

    e fai sapere ;)
     
    Option Explicit
    
    'copia e incolla nel foglio in cui vorrai inserire, in A1, il nome del foglio da raggiungere
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim foglio_da_raggiungere As String
    
    ' Questa routine intercetta il cambiamento di una cella qualunque del presente foglio.
    ' Lo scopo è attivare il foglio come scritto nella cella A1.
    ' Se il foglio non esiste la routine non genera errori e si ferma.
    ' Potrebbe rallentare le operazioni in caso di cartelle con moltissimi fogli!
    
        'se cancello una cella oppure se digito qualcosa in una cella diversa da [A1] (o la cancello),
        'me lo lascia fare senza problemi
        If Target = "" Or Target.Address <> [a1].Address Then Exit Sub
        
        'poichè i nomi dei fogli sono tutti codici di quattro cifre numeriche, formatto l'inserimento
        'in modo adeguato e lo conservo in foglio_da_raggiungere; a video il numero perde gli zeri iniziali
        'ma non mi importa :)
        foglio_da_raggiungere = Format(Target, "0000")
        
        'se digito qualcosa che non sia composto da quattro numeri, lascio eprdere tutto: esco e ignoro
        'nota l'uso di Like :)
        If Not (foglio_da_raggiungere Like "[0-9][0-9][0-9][0-9]") Then Exit Sub
        
        'in caso abbia digitato il nome di un foglio esistente, lo seleziono e lo attivo
        'altrimenti ignoro l'errore e mi fermo (per comodità intercetto l'errore 9, foglio non trovato)
        On Error Resume Next
            Worksheets(foglio_da_raggiungere).Activate
        On Error GoTo 0
    
    End Sub
    






  • di Anna (utente non iscritto) data: 03/08/2012

    Dirti che sei un mago è troppo poco.
    grazie, funziona benissimo.