Selezione Multipla di celle

Anonimo
2011-03-24T12:22:22+00:00

Salve, sto cercando di creare una macro che, dato un certo intervallo, selezioni e copi tutte le celle che soddisfano una certa condizione. Tento di spegarmi meglio. Sul foglio1 ho un intervallo di celle A1:Z20 , vorrei copiare tutte le celle che hanno valore p.e. 100 e fare la copia sul Foglio2. Ovviamente le celle che contengono 100 possono essere sparse, non adiacenti e variare di volta in volta. La macro dovrebbe fare una selezione delle celle una ad una tipo, per intenderci, quella che farei manualmente tenendo premuto il CTRL ed effettuare la copia rispettando le "posizioni" delle singole celle. Ho fatto qualche tentativo, ma penso che questa cosa sia al di là delle mia capacità. Grazie per l'aiuto. Ciao

Fabrizio

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2011-03-24T14:10:16+00:00

Ciao Fabrizio,

prova a vedere se questa ti è utile


Sub CopiaSparsa()

    Dim sh1, sh2 As Worksheet

    Dim rng1, c As Range

   

    Set sh1 = ThisWorkbook.Worksheets("Foglio1")

    Set sh2 = ThisWorkbook.Worksheets("Foglio2")

    Set rng1 = sh1.Range("A1:Z20")

   

    For Each c In rng1

        If c.Value = 100 Then

            c.Copy Destination:=sh2.Cells(c.Row, c.Column)

        End If

    Next c

   

    Set sh1 = Nothing

    Set sh2 = Nothing

    Set rng1 = Nothing

           

End Sub


David

Ciao David. Medita per favore su questa cosa:

Public Sub m()

    Dim sh1, sh2 As Worksheet

    sh1 = 5  '<<===VALIDO

    MsgBox TypeName(sh1)

End Sub

Meglio, sempre:

Public Sub m()

    Dim sh1 As Worksheet

    Dim sh2 As Worksheet

    sh1 = 5  '<<===ERRORE

    MsgBox TypeName(sh1)

End Sub

E, visto che fai il set a nothing delle variabili oggetto(1), di c(che è Range), perchè no?

Quindi, solo più *robusta* della tua ottima routine:

Public Sub CopiaSparsa()

    Dim sh1 As Worksheet

    Dim sh2 As Worksheet

    Dim rng As Range

    Dim c As Range

    With ThisWorkbook

        Set sh1 = .Worksheets("Foglio1")

        Set sh2 = .Worksheets("Foglio2")

    End With

    With sh1

        Set rng = .Range("A1:Z20")

        For Each c In rng

             If c.Value = 10 Then

                 c.Copy Destination:=sh2.Range(c.Address)

             End If

         Next

    End With

    Set sh1 = Nothing

    Set sh2 = Nothing

    Set rng = Nothing

    Set c = Nothing

End Sub

Grazie per l'eventuale attenzione.

(1) Ricordo per chi legge(David immagino lo saprà sicuramente) che il Set a Nothing delle variabili oggetto *non è obbligatorio* in quanto all'uscita della routine Excel azzera i riferimenti agli oggetti. Io, però, lo faccio sempre(ma io, eh).

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2011-03-24T12:57:28+00:00

Ciao Fabrizio,

prova a vedere se questa ti è utile


Sub CopiaSparsa()

    Dim sh1, sh2 As Worksheet

    Dim rng1, c As Range

    Set sh1 = ThisWorkbook.Worksheets("Foglio1")

    Set sh2 = ThisWorkbook.Worksheets("Foglio2")

    Set rng1 = sh1.Range("A1:Z20")

    For Each c In rng1

        If c.Value = 100 Then

            c.Copy Destination:=sh2.Cells(c.Row, c.Column)

        End If

    Next c

    Set sh1 = Nothing

    Set sh2 = Nothing

    Set rng1 = Nothing

End Sub


David

La risposta è stata utile?

0 commenti Nessun commento

7 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2011-03-24T15:47:41+00:00

    Interessante. Sarei contenta di avere qualche informazione in più sulla dichiarazione delle variabili. è poosibile?

    Ci provo.

    Questa routine utilizza la finestra immediata per verificare le variabili:

    Public Sub m()

    Dim sh1, sh2 As Worksheet

    Dim lng1, lng2 As Long

    Dim v As Variant

    Debug.Print "sh1: " & TypeName(sh1)

    Debug.Print "sh2: " & TypeName(sh2)

    Set sh2 = Worksheets("Foglio2")

    Debug.Print "sh2: " & TypeName(sh2)

    Debug.Print "lng1: " & TypeName(lng1)

    Debug.Print "lng2: " & TypeName(lng2)

    Debug.Print "v: " & TypeName(v)

    Set lng1 = Worksheets("Foglio1")

    Debug.Print "lng1: " & TypeName(lng1)

    Set v = Worksheets("Foglio3")

    Debug.Print "v: " & TypeName(v)

    lng1 = 3

    Debug.Print lng1

    End Sub

    sh1 e sh2 dichiarate in questo modo sono rispettivamente una variabile di tipo Variant e una variabile di tipo Object. sh2 in particolare è un Object(oggetto) Worksheet. Come dimostrato in precedenza, sh1 accetta qualsiasi valore, quindi sto scrivendo codice non sicuro(poco robusto). sh2 accetta *solo* Object di tipo Worksheet.

    Se guardi nella finestra immediata, vedi che, riga per riga:

    1. TypeName restituisce Empty(vuota) per sh1. Empty è tipico delle variabili Variant a cui non è stato assegnato nessun valore. Quindi, dichiarare in quel modo sh1 equivale a dichiararla come Variant e *non* come Object/Worksheet. Quindi potrei assegnare a sh1 qualsiasi valore: sh1=5
    2. TypeName restituisce Nothing per sh2. Nothing è tipico delle variabili Object dichiarate ma delle quali non è stato fatto il Set, quindi non puntano a nessun oggetto.
    3. Avendo fatto il Set di sh2, il TypeName restituito è Worksheet. Se avessi cercato di scrivere sh2=5 avrei ottenuto una eccezione(errore).
    4. lng1 dichiarata in questo modo è una variabile di tipo Variant, in tutto e per tutto uguale a sh1 equindi, mi restituisce Empty(vuota).
    5. lng2 è stata dichiarata Long e Long mi restituisce TypeName. Accetterà quindi valori di tipo Long.
    6. v è stata dichiarata Variant e quindi TypeName mi restitusce Empty, come per sh1 e lng1.
    7. Faccio il Set di lng1(ricordo che è implicitamente Variant). Una variabile Variant può contenere di tutto, Object compresi e quindi mi viene restituito il tipo di oggetto contenuto(Worksheet in questo caso)
    8. Anche per v(Variant esplicitata) faccio il Set ad un Object/Worksheet e quindi il TypeName mi rstituisce Worksheet.
    9. Ed ecco il vero problema delle variabili Variant, implicite ed esplicite!!! lng1=5 è accettato!!! Ma come, puntava al Foglio1 e adesso mi restituisce 5!!! Certo, se è Variant può contenere di tutto.

    Quanto esposto per la variabile lng1 al punto 9, vale anche per sh1 e v. Quindi ecco dimostrato che dichiarare le variabili senza specificarne in modo esplicito il tipo, può essere molto pericoloso, non avendo nessun controllo sul tipo di dato contenuto(o a cui punta) la variabile.

    Spero di essere stato abbastanza chiaro. Sempre(quasi) qui per ulteriori spiegazioni(nei miei limiti).

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2011-03-24T14:51:23+00:00

    Ciao Mauro,

    per me sei e rimani sempre il "maestro" :-)

    dal tuo codice si può solo che imparare, sempre.

    Ti ringrazio quindi delle gradite correzioni.

    Per quanto riguarda "c" ... ho dimenticato di aggiungerla alle variabili che azzeravo.

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2011-03-24T14:46:09+00:00

    Interessante. Sarei contenta di avere qualche informazione in più sulla dichiarazione delle variabili. è poosibile?

    La risposta è stata utile?

    0 commenti Nessun commento