Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    [excel] fare la scansione di un range

    non capisco proprio dove sia il problema.

    In un file excel ho tre fogli, Foglio1, Foglio2 e Foglio3

    In Foglio3 ho valorizzato l'evento Worksheet_Change

    Se scrivo:

    For Each casella In Worksheets(2).Range("H2", "H21")

    funziona perfettamente.

    Se scrivo (copiando da un codice funzionante, in altri contesti)
    For Each casella In Range([Foglio2!H2], [Foglio2!H2].End(xlDown))

    va sempre in errore

    se servisse posso mandare il codice completo


    ps.
    va in errore anche con questo codice
    MsgBox Worksheets(2).Cells(1, 1)).Count

    Pietro

  2. #2
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    non capisco proprio dove sia il problema.

    In un file excel ho tre fogli, Foglio1, Foglio2 e Foglio3

    In Foglio3 ho valorizzato l'evento Worksheet_Change

    Se scrivo:

    For Each casella In Worksheets(2).Range("H2", "H21")

    funziona perfettamente.

    Se scrivo (copiando da un codice funzionante, in altri contesti)
    For Each casella In Range([Foglio2!H2], [Foglio2!H2].End(xlDown))

    va sempre in errore

    se servisse posso mandare il codice completo


    ps.
    va in errore anche con questo codice
    MsgBox Worksheets(2).Cells(1, 1)).Count

    Il punto esclamativo si usa nelle formule, in VBA devi indicare i vari oggetti/proprietà/metodi separati da punti.

    Una soluzione potrebbe essere questa:

    codice:
       Set F2 = Sheets("Foglio2")
       For Each casella In F2.Range(F2.[h2], F2.[h2].End(xlDown))
          MsgBox casella
       Next


    Nella count invece c'è semplicemente una parentesi di troppo.


    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ti ringrazio della risposta.
    ciao
    Pietro

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    certo che la cosa è singolare!
    Se in un foglio valorizzo l'evento change:

    codice:
    Public Sub Worksheet_Change(ByVal target As Range)
        ValorizzoRegione target
    End Sub
    funziona perfettamente mettendo nella procedura ValorizzoRegione in un modulo:
    for Each casella In Worksheets(2).Range("H2", "H21")
    oppure
    For Each casella In Range([Foglio2!H2], [Foglio2!H2].End(xlDown))
    oppure
    For Each casella In F2.Range(F2.[H2], F2.[H2].End(xlDown))
    dove F2 è: Dim F2 As Worksheet: Set F2 = Worksheets(2)


    se questo codice lo metto direttamente nella procedura di evento, funziona solo la prima soluzione, e non le altre due

    ciao ancora
    Pietro

  5. #5
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    certo che la cosa è singolare!
    Se in un foglio valorizzo l'evento change:

    codice:
    Public Sub Worksheet_Change(ByVal target As Range)
        ValorizzoRegione target
    End Sub
    funziona perfettamente mettendo nella procedura ValorizzoRegione in un modulo:
    for Each casella In Worksheets(2).Range("H2", "H21")
    oppure
    For Each casella In Range([Foglio2!H2], [Foglio2!H2].End(xlDown))
    oppure
    For Each casella In F2.Range(F2.[H2], F2.[H2].End(xlDown))
    dove F2 è: Dim F2 As Worksheet: Set F2 = Worksheets(2)


    se questo codice lo metto direttamente nella procedura di evento, funziona solo la prima soluzione, e non le altre due

    ciao ancora
    Ciao.

    Per prima cosa devo rimangiarmi quanto ho detto ieri e cioè che i punti esclamativi non si possono usare perché ho appena provato qui in ufficio e funzionano bene. Stasera riproverò a casa perché voglio capire cosa stavo sbagliando ieri.

    Venendo invece al tuo problema più specifico credo che la sintassi, formalmente, preveda l'indicazione del foglio su cui applicare il range con sheets, worksheets o anche semplicemente così

    codice:
     For Each casella In Foglio2.Range([Foglio2!H2], [Foglio2!H2].End(xlDown))

    ma che se ne possa fare a meno se excel è in grado di risalire da solo al foglio senza ambiguità.

    Le ipotesi che posso fare allora sono due, la prima è che, visto che il codice dei moduli si applica a tutti i fogli, excel sia più elastico e si accontenti dell'indicazione di foglio relativa alle celle risalendo senza errori al foglio a cui applicare il range:

    "Mi trovo in un contesto (il modulo) in cui posso operare su tutti i fogli e allora se mi si chiede di individuare un range fra due celle del Foglio2 è sottinteso che il range stesso si riferisce al Foglio2"

    mentre nel caso di codice contenuto in un foglio specifico posso ipotizzare che excel si irrigidisca nel voler applicare il range proprio a quel foglio:

    "Sto lavorando sul Foglio1 e se non mi si dice il contrario applicherò il range sul Foglio1 ma individuare sul Foglio1 un range fra due celle del Foglio2 non ha senso quindi --> Errore"

    L'unica lacuna in questo ragionamento è che il codice con F2 dovrebbe funzionare in entrambi i contesti, quindi forse non è così.

    L'altra ipotesi che mi viene in mente è che nel tuo codice ci sia da qualche parte una Worksheets(2).Activate che rende superflua l'indicazione del foglio a cui applicare il range.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ti ringrazio.
    Ciao
    Pietro

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 © 2026 vBulletin Solutions, Inc. All rights reserved.