Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    33

    [VBA] routine x creazione lista

    Ciao a tutti,
    sono in un vicolo cieco e non riesco a uscirne , chiedo se gentilmente qualcuno può aiutarmi ...
    il problema è il seguente:
    in excel ho una serie di fogli, ognuno nominato come MESE_ANNO, sto cercando di programmare una routine che mi permetta di fare un foglio che vada da un mese_ANNO ad un' altro per avere un foglio con un riepilogo di tutti i dati di questi mesi (ad esempio voglio avere i dati contenuti nei fogli da Gennaio_2008 a Marzo_2009).
    L'obiettivo è avere i dati in un foglio unico, in modo tale che poi posso fare dei diagrammi pivot.
    Ho programmato la parte di lettura del foglio di inizio e di fine, ma non riesco a "inventarmi" un ciclo che inizi con il mese_anno posto in "da:" e finisca con il mese_anno poso in "a:".

    Grazie mille a tutti ....

    ciao
    Fabio
    Fabio

  2. #2
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Comincia con il crearti un array con i nomi dei fogli.
    Poi ti costruisci il nome foglio con quello che trovi nell'array.
    Es:
    codice:
    Dim mesi(12) As String
    Dim nomeFoglio As String
    mesi(1) = "GEN"
    mesi(2) = "FEB"
    
    ...... tuo codice per ottenere nI (mese inizio) e nF (mese fine)
    
    For nM =  nI To nF 
         nomeFoglio = mesi(nM) & "_2009" ' <----- o altro sistema per reperire l'anno
         Sheets(nomeFoglio) ........... <----- Hai il nome foglio creato dinamicamente
         ......... tuo codice di calcolo ...........................
    Next
    Ciao, Brainjar

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    33

    [VBA] routine x creazione lista

    Ciao,
    è molto chiara la parte, solo che all'interno dovrei avere anche l'anno che varia (nel senso potrei andare da Dicembre 2009 a Marzo 2010) come posso fare? (ho 12 mesi e l'anno scatta solo se passo da Dicembre a Gennaio ... che casino!)

    Qui sotto ho inserito il codice che ho scritto, completo delle variabili.

    Grazie mille ......
    Fabio

    ----------------CODICE---------------------------------------------
    Private Sub CommandButton3_Click()
    'variabile per il mese da cui iniziare
    Dim meseI As String
    meseI = Sheets("Import").Cells(18, 4)
    'contatore mese iniziale
    Dim mI As Integer
    'variabile per definire l'anno da cui iniziare
    Dim annoI As String
    annoI = Sheets("Import").Cells(19, 4)
    'variabile per definire il mese finale
    Dim meseF As String
    meseF = Sheets("Import").Cells(21, 4)
    'variabile per definire l'anno finale
    Dim annoF As String
    annoF = Sheets("Import").Cells(22, 4)
    'variabile per contare le righe del mese iniziale
    Dim RmeseI As Integer
    'Variabile per la matrice di selezione mese iniziale
    Dim EndSelI As String
    'Variabili per Array mesi
    Dim mesi(12) As String
    Dim nomeFoglio As String
    mesi(1) = "Gennaio"
    mesi(2) = "Febbraio"
    mesi(3) = "Marzo"
    mesi(4) = "Aprile"
    mesi(5) = "Maggio"
    mesi(6) = "Giugno"
    mesi(7) = "Luglio"
    mesi(8) = "Agosto"
    mesi(9) = "Settembre"
    mesi(10) = "Ottobre"
    mesi(11) = "Novemre"
    mesi(12) = "Dicembre"

    'Creo il foglio dove metterò tutti i dati che poi userò per la tabella pivot
    Sheets.Add
    ActiveSheet.Select
    ActiveSheet.Move After:=Sheets("Import")
    ActiveSheet.Select
    ActiveSheet.Name = meseI & annoI & "_" & meseF & annoF
    'Creo le intestazioni delle colonne nel nuovo foglio
    ActiveSheet.Cells(1, 1) = "HL P/N"
    ActiveSheet.Cells(1, 2) = "Cliente"
    ActiveSheet.Cells(1, 3) = "Ore"
    ActiveSheet.Cells(1, 4) = "Tipo Lavoro"
    ActiveSheet.Cells(1, 5) = "Attività"
    ActiveSheet.Cells(1, 6) = "Desctrizione"
    ActiveSheet.Cells(1, 7) = "Data"

    'Seleziono il mese da cui inizio a copiare e copio nel foglio del parziale
    For nM = nI To NF
    nomeFoglio = mesi(nM) & "_2009" ' <----- o altro sistema per reperire l'anno
    Sheets(nomeFoglio).Select '........... <----- Hai il nome foglio creato dinamicamente

    RmeseI = ActiveSheet.Cells(1, 1).End(xlDown).Row
    EndSelI = "A2:G" & RmeseI
    ActiveSheet.Range(EndSelI).Select
    Selection.Copy
    Sheets(meseI & annoI & "_" & meseF & annoF).Select
    ActiveSheet.Paste

    Next

    End Sub
    ------------------------------------------------------------------------------------
    Fabio

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    33

    [VBA] routine x creazione lista

    Ho trovato un errore nel codice che ho scritto sotto e l'ho corretto.

    Rimane il problema di come cambiare l'anno ....

    Inoltro mi da un errore del tipo "Errore di compilazione: Tipo non corrispondente" e mi evidenzia nM.

    Ciao
    Fabio.

    ------CODICE -----------------------
    Private Sub CommandButton3_Click()
    'variabile per il mese da cui iniziare
    Dim meseI As String
    meseI = Sheets("Import").Cells(18, 4)
    'variabile per definire l'anno da cui iniziare
    Dim annoI As String
    annoI = Sheets("Import").Cells(19, 4)
    'variabile per definire il mese finale
    Dim meseF As String
    meseF = Sheets("Import").Cells(21, 4)
    'variabile per definire l'anno finale
    Dim annoF As String
    annoF = Sheets("Import").Cells(22, 4)
    'variabile per contare le righe del mese iniziale
    Dim RmeseI As Integer
    'Variabile per la matrice di selezione mese iniziale
    Dim EndSelI As String
    'Variabili per Array mesi
    Dim mesi(12) As String
    Dim nomeFoglio As String
    mesi(1) = "Gennaio"
    mesi(2) = "Febbraio"
    mesi(3) = "Marzo"
    mesi(4) = "Aprile"
    mesi(5) = "Maggio"
    mesi(6) = "Giugno"
    mesi(7) = "Luglio"
    mesi(8) = "Agosto"
    mesi(9) = "Settembre"
    mesi(10) = "Ottobre"
    mesi(11) = "Novemre"
    mesi(12) = "Dicembre"
    Dim nM As String

    'Creo il foglio dove metterò tutti i dati che poi userò per la tabella pivot
    Sheets.Add
    ActiveSheet.Select
    ActiveSheet.Move After:=Sheets("Import")
    ActiveSheet.Select
    ActiveSheet.Name = meseI & annoI & "_" & meseF & annoF
    'Creo le intestazioni delle colonne nel nuovo foglio
    ActiveSheet.Cells(1, 1) = "HL P/N"
    ActiveSheet.Cells(1, 2) = "Cliente"
    ActiveSheet.Cells(1, 3) = "Ore"
    ActiveSheet.Cells(1, 4) = "Tipo Lavoro"
    ActiveSheet.Cells(1, 5) = "Attività"
    ActiveSheet.Cells(1, 6) = "Desctrizione"
    ActiveSheet.Cells(1, 7) = "Data"

    'Seleziono il mese da cui inizio a copiare e copio nel foglio del parziale
    For nM = meseI To meseF
    nomeFoglio = mesi(nM) & "_2009" ' <----- o altro sistema per reperire l'anno
    Sheets(nomeFoglio).Select '........... <----- Hai il nome foglio creato dinamicamente

    RmeseI = ActiveSheet.Cells(1, 1).End(xlDown).Row
    EndSelI = "A2:G" & RmeseI
    ActiveSheet.Range(EndSelI).Select
    Selection.Copy
    Sheets(meseI & annoI & "_" & meseF & annoF).Select
    ActiveSheet.Paste

    Next

    End Sub
    Fabio

  5. #5
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Il mio è solo un indizio.
    Dovresti specificare come e perchè hai chiamato i fogli così.
    Magari, come sempre, una impostazione migliore toglie a monte una serie
    praticamente infinita di problemi.
    Ciao, Brainjar

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    33
    Ciao,
    i fogli sono chiamati così perchè arrivano da un'altra macro, che genera dei rapporti mensili per le ore che vengono utilizzate all'interno dell'ufficio.
    Quindi io ho dei fogli mensili nominati come Gennaio_2009 Febbraio_2009 ecc ...
    il problema di scalare i mesi si è risolto, ho corretto il codice e lo inserisco qui sotto.
    Se considerassi i mesi all'interno di un unico anno con questo codice sarei già ok, solo che io
    vorrei avere la possibilità di fare dei rapporti ore magari a cavallo di due anni (per esempio il periodo Ottobre_2009 Marzo_2010).
    A questo punto devo fare in modo che cambi l'anno se il mese precedente è dicembre e si fermi se l'anno finale è uguale all'anno iniziale.

    Ciao e grazie mille.
    Fabio

    ------CODICE-------------------------
    Private Sub CommandButton3_Click()
    'variabile per il mese da cui iniziare
    Dim meseI As String
    meseI = Sheets("Import").Cells(18, 4)
    'variabile per definire l'anno da cui iniziare
    Dim annoI As String
    annoI = Sheets("Import").Cells(19, 4)
    'variabile per definire il mese finale
    Dim meseF As String
    meseF = Sheets("Import").Cells(21, 4)
    'variabile per definire l'anno finale
    Dim annoF As String
    annoF = Sheets("Import").Cells(22, 4)
    'variabile per contare le righe del mese iniziale
    Dim RmeseI As Integer
    'Variabile per la matrice di selezione mese iniziale
    Dim EndSelI As String
    'Variabili per Array mesi
    Dim mesi(12) As String
    'Valori dell'array
    mesi(1) = "Gennaio"
    mesi(2) = "Febbraio"
    mesi(3) = "Marzo"
    mesi(4) = "Aprile"
    mesi(5) = "Maggio"
    mesi(6) = "Giugno"
    mesi(7) = "Luglio"
    mesi(8) = "Agosto"
    mesi(9) = "Settembre"
    mesi(10) = "Ottobre"
    mesi(11) = "Novemre"
    mesi(12) = "Dicembre"

    'Foglio che viene selezionato (valore dinamico dell'array)
    Dim nomeFoglio As String

    'Creo il foglio dove metterò tutti i dati che poi userò per la tabella pivot
    Sheets.Add
    ActiveSheet.Select
    ActiveSheet.Move After:=Sheets("Import")
    ActiveSheet.Select
    ActiveSheet.Name = meseI & annoI & "_" & meseF & annoF

    'Creo le intestazioni delle colonne nel nuovo foglio
    ActiveSheet.Cells(1, 1) = "HL P/N"
    ActiveSheet.Cells(1, 2) = "Cliente"
    ActiveSheet.Cells(1, 3) = "Ore"
    ActiveSheet.Cells(1, 4) = "Tipo Lavoro"
    ActiveSheet.Cells(1, 5) = "Attività"
    ActiveSheet.Cells(1, 6) = "Desctrizione"
    ActiveSheet.Cells(1, 7) = "Data"
    ActiveSheet.Cells(2, 1).Select

    'Variabile dell'array mI
    If meseI = "Gennaio" Then
    mI = 1
    ElseIf meseI = "Febbraio" Then
    mI = 2
    ElseIf meseI = "Marzo" Then
    mI = 3
    ElseIf meseI = "Aprile" Then
    mI = 4
    ElseIf meseI = "Maggio" Then
    mI = 5
    ElseIf meseI = "Giugno" Then
    mI = 6
    ElseIf meseI = "Luglio" Then
    mI = 7
    ElseIf meseI = "Agosto" Then
    mI = 8
    ElseIf meseI = "Settembre" Then
    mI = 9
    ElseIf meseI = "Ottobre" Then
    mI = 10
    ElseIf meseI = "Novembre" Then
    mI = 11
    ElseIf meseI = "Dicembre" Then
    mI = 12
    End If

    'Variabile dell'array mF
    If meseF = "Gennaio" Then
    mF = 1
    ElseIf meseF = "Febbraio" Then
    mF = 2
    ElseIf meseF = "Marzo" Then
    mF = 3
    ElseIf meseF = "Aprile" Then
    mF = 4
    ElseIf meseF = "Maggio" Then
    mF = 5
    ElseIf meseF = "Giugno" Then
    mF = 6
    ElseIf meseF = "Luglio" Then
    mF = 7
    ElseIf meseF = "Agosto" Then
    mF = 8
    ElseIf meseF = "Settembre" Then
    mF = 9
    ElseIf meseF = "Ottobre" Then
    mF = 10
    ElseIf meseF = "Novembre" Then
    mF = 11
    ElseIf meseF = "Dicembre" Then
    mF = 12
    End If

    'Seleziono il mese da cui inizio a copiare e copio nel foglio del parziale
    For nM = mI To mF

    If nM = mI Then
    nomeFoglio = mesi(nM) & "_2009" ' <----- o altro sistema per reperire l'anno
    Sheets(nomeFoglio).Select '........... <----- Hai il nome foglio creato dinamicamente

    RmeseI = ActiveSheet.Cells(1, 1).End(xlDown).Row
    EndSelI = "A2:G" & RmeseI
    ActiveSheet.Range(EndSelI).Select
    Selection.Copy
    Sheets(meseI & annoI & "_" & meseF & annoF).Select
    ActiveSheet.Paste
    Else
    Sheets(meseI & annoI & "_" & meseF & annoF).Select
    RmeseParz = ActiveSheet.Cells(1, 1).End(xlDown).Row + 1 'Cella finale del mese +1 per posizionarci correttamente
    ActiveSheet.Cells(RmeseParz, 1).Select

    nomeFoglio = mesi(nM) & "_2009"
    Sheets(nomeFoglio).Select

    RmeseI = ActiveSheet.Cells(1, 1).End(xlDown).Row
    EndSelI = "A2:G" & RmeseI
    ActiveSheet.Range(EndSelI).Select
    Selection.Copy
    Sheets(meseI & annoI & "_" & meseF & annoF).Select

    ActiveSheet.Paste
    End If

    Next

    End Sub
    Fabio

  7. #7
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    Forse con l'array ti complichi la vita, perchè risulta piuttosto articolato gestire il cambio di anno.

    Visto che i nomi dei fogli contengono i mesi, puoi ricavarli facilmente impostando mese e anno di inizio e mese e anno di fine, incrementando la data di partenza di un mese alla volta, fino a giungere alla data di fine.

    Dalla data calcolata ad ogni iterazione puoi estrarre mese e anno componendo il nome del foglio da riepilogare.

    Prova con la routine seguente:

    codice:
    Sub CicloMesi()
    
    Dim MesePart As Integer
    Dim AnnoPart As Integer
    Dim MeseFine As Integer
    Dim AnnoFine As Integer
    
    Dim DataPart As String
    Dim DataFine As String
    
    MesePart = 1: AnnoPart = 2008
    MeseFine = 3: AnnoFine = 2009
    
    DataPart = CDate("01/" & MesePart & "/" & AnnoPart)
    DataFine = DateAdd("m", 1, CDate("01/" & MeseFine & "/" & AnnoFine))
    
    While Not DataPart = DataFine
        NomeFoglio = StrConv(MonthName(Month(DataPart)) & "_" & Year(DataPart), vbProperCase)
        
        'Operazioni di riepilogo
        'da eseguire sul foglio
        
        DataPart = DateAdd("m", 1, DataPart)
    Wend
    
    End Sub
    Ovviamente per semplicità io ho inserito i valori relativi a data iniziale e finale come costanti direttamente nel codice, ma tu puoi tranquillamente prenderli dal foglio di lavoro ove sono specificati.

    Boolean

  8. #8
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Originariamente inviato da Brainjar
    Il mio è solo un indizio.
    Dovresti specificare come e perchè hai chiamato i fogli così.
    Magari, come sempre, una impostazione migliore toglie a monte una serie
    praticamente infinita di problemi.
    Originariamente inviato da Boolean
    Forse con l'array ti complichi la vita, perchè risulta piuttosto articolato gestire il cambio di anno.
    Il concetto è il medesimo.
    Ciao, Brainjar

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.