Ciclo con array



  • Ciclo con array
    di Mangusta (utente non iscritto) data: 21/02/2013 22:03:45

    Cioa ragazzi alto giro altro quesito.......

    Ho fatto un normalissimo ciclo che fa bene il suo lavoro : copia nel secondo foglio intera riga se trova nel range un determinato valore (appartamento)

    adesso volevo migliorare il codice senza usare nel ciclo OR ma usando un array ma non funziona!! (dove sbaglio?)

    si può usare il famoso e apprezzato select case?
     
    Sub provincie()
        Dim ur As Long, cella As Range, rng As Range, y As Long, v As Variant
    
        With Sheets("Foglio1")
            ur = .Cells(Rows.Count, 11).End(xlUp).Row
            Set rng = Range(.Cells(4, 11), .Cells(ur, 11))
        End With
    
        y = 1
        For Each cella In rng
            For Each v In Array("appartamento", "villa")
               cella.EntireRow.Copy Destination:=Sheets("Foglio2").Cells(y, 1)
               y = y + 1
          
            Next
        Next
        MsgBox "Fatto!"
    End Sub
    



  • di Mangusta (utente non iscritto) data: 21/02/2013 22:16:42

    Fatto con select case!!
     
    For Each cella In rng
            Select Case cella
            Case "MI"
                cella.EntireRow.Copy Destination:=Sheets("Foglio2").Cells(y, 1)
                y = y + 1
                       
                Case "SO"
                cella.EntireRow.Copy Destination:=Sheets("Foglio2").Cells(y, 1)
                y = y + 1
            End Select
        Next



  • di HarryBosch data: 22/02/2013 08:49:16

    Ma in entrambi i "case" le istruzioni sono uguali?!
    Allora puoi utilizzare un'unica voce del Case...
     
    For Each cella In rng
            Select Case cella
            Case "MI", "SO"
                cella.EntireRow.Copy Sheets("Foglio2").Cells(y, 1)
                y = y + 1
            End Select
        Next



  • di Mangusta (utente non iscritto) data: 22/02/2013 17:54:11

    Ciao Harryyyyyyyyy!!!!! Wow non lo sapevo!! bella dritta!! ma con gli array si puo fare?



  • di Vecchio Frac data: 22/02/2013 18:17:53

    Con Array? cioè? :)
    Posta l'esempio che hai realizzato tu (non funzionante) così vediamo cosa cerchi di fare.





  • di HarryBosch data: 22/02/2013 19:25:31

    già, questa degli
    "con gli array si può fare?"
    sfugge decisamente anche al sottoscritto ^_^



  • di Mangusta (utente non iscritto) data: 22/02/2013 19:26:55

    semplicemente cosi ! è campato in aria?
     
    For Each cella In rng
            for each v in array ("MI","SO")
                cella.EntireRow.Copy Sheets("Foglio2").Cells(y, 1)
                y = y + 1
            next
        Next



  • di Vecchio Frac data: 22/02/2013 20:59:22

    Ok, sei stipendiato dall'UCAS, Ufficio Complicazioni Affari Semplici ^_^
    Non funzionerà perchè y non è valorizzato al primo passaggio: se è dichiarato As Integer, varrà zero la prima volta che Excel dovrà interpretarne il valore; metti:
    y=1
    prima di For Each cella in rng.
    Tuttavia è eccessivo perchè rendi lento e farraginoso un codice tutto sommato semplice, con due For annidati.
     
    y = 1
    For Each cella In rng
            for each v in array ("MI","SO")
                  cella.EntireRow.Copy Sheets("Foglio2").Cells(y, 1)
                  y = y + 1
            next
    Next






  • di Mangusta (utente non iscritto) data: 22/02/2013 22:50:14

    Y=1 Lo avevo dimanticato ma era previsto! uhm devo riprovare perchè con me non funzia o ferse si impianta! ti faccio sapere! sta discussione comunque mi è servita intanto ho fatto il mio primo select case e ho scoperto che con la stessa condizione si possono mettere i casi separati dalla virgola ^_^

    (case "mi","so")



  • di Mangusta (utente non iscritto) data: 22/02/2013 23:49:00

    Ok rendiamo un pochino più complicato il post!!
    voglio crare (se non c'è) un foglio di lavoro dove destinare le righe copiate.
    creare il fogli di lavoro non è facile
    Dim wrkPagina As Worksheet
    Set wrkPagina = ActiveWorkbook.Worksheets.Add()
    wrkPagina.Name = "MISO" (nome del foglio ^_^)

    ma verificare se esiste o meno?
    non voglio creare a priori i fogli che mi servono ma solo i foglio che rispettino il Select Case




     
    For Each cella In rng
            Select Case cella
            Case "MI", "SO"
                cella.EntireRow.Copy Sheets("Foglio2").Cells(y, 1)
                y = y + 1
            End Select
        Next



  • di HarryBosch data: 23/02/2013 02:48:26

    "creare il foglio di lavoro non è facile"
    LOL, ma se hai già scritto come fare? ^_^

    ok, ti è scappato quel "non"; per verificare che il foglio esista, basta ciclare i fogli della cartella: se trovi un foglio con il nome cercato allora esiste e puoi uscire dal ciclo
     
         Dim wrkPagina As Worksheet
        Dim esiste As Boolean
    
        For Each wrkPagina In Worksheets
            If wrkPagina.Name = "MISO" Then
                esiste = True
                Exit For
            End If
        Next
    
        If esiste = False Then
            Set wrkPagina = ActiveWorkbook.Worksheets.Add()
            wrkPagina.Name = "MISO"
        End If
    
        'istruzioni...
    
        '    For Each cella In Rng
        '        Select Case cella
        '        Case "MI", "SO"
        '            cella.EntireRow.Copy wrkPagina.Cells(y, 1)
        '            y = y + 1
        '        End Select
        '    Next
    



  • di Mangusta (utente non iscritto) data: 23/02/2013 10:43:28

    Se ho una decina di fogli da verificare se esistono o meno un ciclo per ognuno? è pesantino!




  • di HarryBosch data: 23/02/2013 11:02:45

    Assolutamente no! :)
    Allora, l'oggetto da ciclare è sempre lo stesso, giusto? parliamo della cartella di lavoro.
    Quello che cambia è il nome da cercare, che potrebbero essere 10 o più.

    Il ciclo rimane sempre 1, dal primo all'ultimo foglio, solo che per ogni passaggio verifichi tutti i nomi.
    E come fai a verificare tutti i nomi? Qua ti invito a provare, e poi analizziamo: per esempio, se i nomi sono in un array, si potrebbe controllare tale array...



  • di Mangusta (utente non iscritto) data: 23/02/2013 16:38:45

    Ho buttato giù qualcosa sulle tue indicazioni; funziano tutto se i fogli non ci sono! altrimenti basta che uno dei fogli ci sia che da errore e crea un foglio non richiesto.
    errore 1004
     
    Sub fogli()
        Dim wrkPagina As Worksheet
        Dim esiste As Boolean
    
        For Each wrkPagina In Worksheets
            For Each v In Array("MISO", "TISO", "CISO")
    
                If wrkPagina.Name = v Then
                    esiste = True
                    Exit For
                ElseIf esiste = False Then
                    Set wrkPagina = ActiveWorkbook.Worksheets.Add()
                    wrkPagina.Name = v
                End If
            Next
        Next



  • di Vecchio Frac data: 23/02/2013 20:13:45

    Eh già, perchè dal codice i tre fogli dell'Array vengono creati se inesistenti, ma siccome nel file possono esistere altri fogli, e poichè il For cicla su tutti i fogli esistenti, quando è il loro turno ad essere esaminati, se nel frattempo i fogli relativi all'array sono stati già creati, va in errore.
    E' la logica che va rivista :)
    Parti a esaminare l'array. Confronta ogni foglio. Se lo trovi, non fare altro: prosegui coi nomi dell'array. Se non lo trovi, aggiungilo, e fermati qui: non controllare i fogli successivi. Prosegui col resto dei nomi dell'Array.
     
    Option Explicit
    
    Sub fogli()
        Dim wrkPagina As Worksheet
        Dim esiste As Boolean, v As Variant
    
        For Each v In Array("MISO", "TISO", "CISO")
            For Each wrkPagina In Worksheets
    
                If wrkPagina.Name = v Then
                    esiste = True
                    Exit For
                ElseIf esiste = False Then
                    Set wrkPagina = ActiveWorkbook.Worksheets.Add()
                    wrkPagina.Name = v
                    Exit For   ' <--- qui è il punto
                End If
            Next
        Next
    End Sub
    






  • di Mangusta (utente non iscritto) data: 23/02/2013 20:33:02

    Ho provato il tuo codice ma stesso errore! lancia 2 volte la macro e vedi!



  • di HarryBosch data: 25/02/2013 01:18:27

    Mea culpa ^_^
    probabilmente ti ho buttato fuori strada io...
    E' vero che la cartella da ciclare è sempre quella ma il primo ciclo in effetti è quello dell'array, perlomeno se vuoi inerire tutti i fogli che mancano (avevo inteso un'altra cosa).

    La logica è questa:
    - Per ogni foglio inizio un ciclo successivo, che passa tutta la cartella
    - se trovo il foglio, assegno True alla variabile booleana ed esco dal ciclo, per passare al prossimo foglio.
    - se non trovo il foglio alloro lo creo (la variabile sarà False)

    Quando passo ad un nuovo foglio, reimposto in partenza la variabile esiste a False perché il giro precedente potrebbe essere stata True.
    Prova ora
     
    Sub fogli()
        Dim wrkPagina As Worksheet
        Dim esiste As Boolean, v As Variant
    
        For Each v In Array("MISO", "TISO", "CISO")
            esiste = False
    
            For Each wrkPagina In Worksheets
                If wrkPagina.Name = v Then
                    esiste = True
                    Exit For
                End If
            Next
    
            If esiste = False Then
                Set wrkPagina = ActiveWorkbook.Worksheets.Add()
                wrkPagina.Name = v
            End If
    
        Next
    End Sub
    



  • di Mangusta (utente non iscritto) data: 25/02/2013 22:01:01

    è perfetto!!!! ho capito grazie mille!!!



  • di Mangusta (utente non iscritto) data: 25/02/2013 22:13:47

    scusa ma il codice seguente che segue il concetto precedente non da i risultati sperati:

    sommare una colonna per ogni foglio e riportare i valori in cella(1;1)
     
    Sub fogli()
        Dim wrkPagina As Worksheet
        Dim esiste As Boolean, v As Variant
    
        For Each v In Array("MISO", "TISO", "CISO")
    
        
    
            For Each wrkPagina In Worksheets
               Sheets(v).Cells(1, 1) = Application.Sum(Range("M:M"))
                
            Next
            Next
    
      
    End Sub



  • di HarryBosch data: 26/02/2013 19:31:19

    Non ha molto senso il codice che hai riportato:
    - parti dal primo foglio "MISO": ora compi un nuovo ciclo per tutta la cartella "For Each wrkPagina In Worksheets".
    - se hai 10 fogli, nel foglio "MISO" copierai 10 volte nella cella(1,1) (sempre in quella) la somma della colonna M (non essendo specificato di quale foglio si tratti, la somma sarà quella del foglio attivo al momento); pertanto resterà soltanto l'ultima somma calcolata.

    Cosa vuoi fare esattamente?



  • di Mangusta (utente non iscritto) data: 26/02/2013 20:25:12

    Fare la somma per ogni foglio nel stesso range!!!



  • di Vecchio Frac data: 26/02/2013 22:26:39

    Devi qualificare il Range("M:M") perchè si riferisca ad ogni singolo foglio, altrimenti SUM non ha i riferimenti corretti.
     
    Sheets(v).Cells(1, 1) = Application.Sum(Sheets(v).Range("M:M"))






  • di Mangusta (utente non iscritto) data: 28/02/2013 20:36:48

    ok esattamente ciò che volevo!!!!



  • di Mangusta (utente non iscritto) data: 29/03/2013 12:03:45

    Ragazzi sto usando il codice e non capisco perchè mi moltiplichi i risultati per 2!

    ricordo che vorrei che in automatico per ogni foglio facesse la somma dei valori di un range in questo caso della colonna j
    in feb la somma di colonna j
    in gen la somma di colonna j

     
    Sub sommafogli()
        Dim wrkPagina As Worksheet
        Dim v As Variant
        For Each v In Array("FEB", "GEN")
               For Each wrkPagina In Worksheets
                   Sheets(v).Cells(1, 10) = Application.Sum(Sheets(v).Range("J:J"))                           
            Next
       Next 
    End Sub



  • di Mangusta (utente non iscritto) data: 29/03/2013 12:05:09

    allego file di esempio ^_^



  • di Mangusta (utente non iscritto) data: 29/03/2013 12:25:23

    Capito da solo faccio fare 2 cicli ^_^
    basta fare cosi:

    For Each v In Array("FEB", "GEN")
    Sheets(v).Cells(1, 10) = Application.Sum(Sheets(v).Range("J:J"))
    Next



  • di Vecchio Frac data: 29/03/2013 13:46:53