Aggiungere intervalli macro
Hai un problema con Excel? 
Aggiungere intervalli macro
di Valerio (utente non iscritto) data: 27/09/2013 07:24:34
Buondì. Ho questo codice che funziona bene però oltre all'intervalle P5:S8 devo aggiungere altri 2 e cioè C30:G31 e H20:L21, come lo devo modicare? Praticamente questa macro mi trova i numeri uguali che ci sono nell'intervallo P5:S8 e C5:L13 e in quest'ultimo gli elimina. Grazie
Sub Elimina()
Dim sh As Worksheet, col As Integer, riga As Long, col1 As Integer, riga1 As Long
Set sh = Sheets("Foglio1")
For col = 16 To 19
For riga = 5 To 8
For col1 = 3 To 12
For riga1 = 5 To 13
If Cells(riga, col) = Cells(riga1, col1) Then Cells(riga1, col1) = ""
Next riga1
Next col1
Next riga
Next col
Set sh = Nothing
End Sub |
di totygno71 (utente non iscritto) data: 27/09/2013 08:34:08
ciao
se P5:s8 = riga 5 to 8 -- col 16 to 19...
C30:G31 equivale a...
stessa cosa per h20:h21
provaci ciao
di Valerio (utente non iscritto) data: 27/09/2013 09:26:11
Grazie di avermi risposto? Ma dove lo devo scrivere quel codice, prima di End sub? Com'è precisamente siccome non è che abbia capito bene.
di totygno71 (utente non iscritto) data: 27/09/2013 09:38:14
Una soluzione indolore potrebbe essere duplicare lo stesso ciclo per i nuovi range, sostituendo al p5:s8 prima C30:G31 e poi H20:L21
di totygno71 (utente non iscritto) data: 27/09/2013 09:41:59
Questo per il range C30:G31...
poi fai la stessa cosa per H20:L21
Sub Elimina()
Dim sh As Worksheet, col As Integer, riga As Long, col1 As Integer, riga1 As Long
Set sh = Sheets("Foglio1")
For col = 16 To 19
For riga = 5 To 8
For col1 = 3 To 12
For riga1 = 5 To 13
If Cells(riga, col) = Cells(riga1, col1) Then Cells(riga1, col1) = ""
Next riga1
Next col1
Next riga
Next col
'secondo range
For col = 3 To 7
For riga = 30 To 31
For col1 = 3 To 12
For riga1 = 5 To 13
If Cells(riga, col) = Cells(riga1, col1) Then Cells(riga1, col1) = ""
Next riga1
Next col1
Next riga
Next col
'qui metti il terzo ^_^
Set sh = Nothing
End Sub |
di Valerio (utente non iscritto) data: 27/09/2013 11:18:49
Così l'avevo pensata pure io però la macro va lenta, se ci sono soluzioni migliori è bene altrimenti mi tocca usarla.
di totygno71 (utente non iscritto) data: 27/09/2013 18:21:33
La tua richiesta era come modificare quella che già avevi e non pensare una nuova modalità---
Poi che sia lenta mi sembra proprio strano...
di totygno71 (utente non iscritto) data: 27/09/2013 18:29:12
cit:Grazie di avermi risposto? Ma dove lo devo scrivere quel codice, prima di End sub? Com'è precisamente siccome non è che abbia capito bene.
cit2"Così l'avevo pensata pure io però
risp" permettimi ma dubito della cit2 ^_^
di Valerio (utente non iscritto) data: 27/09/2013 19:11:33
Io già avevo provato in questo modo ma mi sembrava una soluzione "fatta a casa", è funzionante però mi andava lenta; praticamente sullo stesso foglio ho la macro per un solo intervallo cioè P5:S8 e poi l'altra per tutti e 3 gli intervalli che però mi va un pò lenta. Perciò ho pensato che fare 3 volte la stessa operazione era una cosa sbagliata ed ho chiesto a voi esperti. Tutto qua.
cit: se P5:s8 = riga 5 to 8 -- col 16 to 19...
C30:G31 equivale a...
stessa cosa per h20:h21
Vedendo questo codice avevo pensato che tu volessi modificare la macro inserendo tre If.
di totygno71 (utente non iscritto) data: 27/09/2013 19:59:57
Quella di fare 3 cicli è una mia ipostesi perche tu volevi implementare quella che già avevi... magari qualcuno conoscendo piu a fondo la tua questione ti può trovare una soluzione alternativa...
PS per curiosità quanto ci impiega a fare i tre cicli?
di gaetanopr data: 28/09/2013 00:22:24
Ciao prova questa macro
Sub Elimina2()
Set sh = Sheets("Foglio1")
Set r1 = Range("P5:S8")
Set r2 = Range("C30:G31")
Set r3 = Range("H20:L21")
Set myMultiAreaRange = Union(r1, r2, r3)
For col1 = 3 To 12
For riga1 = 5 To 13
For Each CL In myMultiAreaRange
If CL = Cells(riga1, col1).Value Then Cells(riga1, col1).Value = ""
Next CL
Next riga1
Next col1
Set sh = Nothing
Set r1 = Nothing
Set r2 = Nothing
Set r3 = Nothing
Set myMultiAreaRange = Nothing
End Sub |
di gaetanopr (utente non iscritto) data: 28/09/2013 08:00:17
Ciao mi sono accorto di aver creato il foglio (sh) ma di non averlo utilizzato, quindi se va bene puoi sistemare tu la macro.
sh.Range ect ect
Stesso discorso nella macro che hai postato all'inizio
di Valerio (utente non iscritto) data: 28/09/2013 09:35:35
@totygno71
Con i tre intervalli mi è successo più di una volta che sembrava come se andasse in conflitto e dopo circa 15 secondi terminava i 3 cicli, una cosa brutta da vedere!
@gaetanopr
grazie per il codice ma io non so proprio come sistemarlo! Il vba e io siamo come il Sole e la Terra: distiamo anni luce uno dall'altro!
di gaetanopr data: 28/09/2013 09:39:45
il codice già funziona, se lavori sul foglio attivo non avresti nemmeno bisogno di indicarlo
Sub Elimina2()
Set sh = Sheets("Foglio1")
Set r1 = sh.Range("P5:S8")
Set r2 = sh.Range("C30:G31")
Set r3 = sh.Range("H20:L21")
Set myMultiAreaRange = Union(r1, r2, r3)
For col1 = 3 To 12
For riga1 = 5 To 13
For Each CL In myMultiAreaRange
If CL = sh.Cells(riga1, col1).Value Then sh.Cells(riga1, col1).Value = ""
Next CL
Next riga1
Next col1
Set sh = Nothing
Set r1 = Nothing
Set r2 = Nothing
Set r3 = Nothing
Set myMultiAreaRange = Nothing
End Sub |
di isy data: 28/09/2013 13:11:03
Ciao
Cit: Con i tre intervalli mi è successo più di una volta che sembrava come se andasse in conflitto e dopo circa 15 secondi terminava i 3 cicli, una cosa brutta da vedere!
gaetanopr Mi sono permesso di modificarlo, per utilizzare al meglio il metodo Union
Sub Ciclo_Union()
Dim rd As Range
Dim r1 As Range
Dim r2 As Range
Dim r3 As Range
Dim myMultiAreaRange As Range
Dim cl As Variant
Dim clx As Variant
Dim r As Range
Set rd = Range("C5:L13")
Set r1 = Range("P5:S8")
Set r2 = Range("C30:G31")
Set r3 = Range("H20:L21")
Set myMultiAreaRange = Union(r1, r2, r3)
For Each cl In rd
For Each clx In myMultiAreaRange
If cl.Value = clx.Value Then
If r Is Nothing Then
Set r = Range(cl.Address)
Else
Set r = Union(r, Range(cl.Address))
End If
End If
Next
Next
If Not r Is Nothing Then
r = ""
'r.ClearContents 'Comando opzione
Set r = Nothing
End If
Set rd = Nothing
Set r1 = Nothing
Set r2 = Nothing
Set r3 = Nothing
Set myMultiAreaRange = Nothing
End Sub |
di Valerio (utente non iscritto) data: 28/09/2013 18:18:32
Ok, grazie. La macro di isy è perfetta.
Vuoi Approfondire?