Condividi:        

Macro attivabile da SelectionChange

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 30/11/15 22:14

PREMESSO CHE E' LA PRIMA VOLTA CHE USO UN FORUM PERCUI MI PERDONERETE DEGLI ERRORI CHE FARO'!
IL MIO PROBLEMA E' QUESTO:
PREMESSO CHE HO UNA MACRO DI QUESTO GENERE:
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Range("D11:N200")   'Area che comprende tutti i dati
.Sort Key1:=Range("D6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With
'la spiegazione di questa parte di codice la dò sotto
[code]Dim CL As Object
For Each CL In Range("D11:D200")
If CL.Value <> "" And CL.Offset(0, 1).Value = "" Then
CL.Offset(0, 1).Select
End If
Next
End Sub

QUESTA IN EFFETTI MI METTE IN ORDINE CRESCENTE LA COLONNA D11:D200
IO AVREI BISOGNO DI METTERE IN ORDINE ANCHE LA COLONNA AB11: AB200 QUANDO INSERISCO I DATI
COME MODIFICARLA???
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Sponsor
 

Re: Macro attivabile da SelectionChange

Postdi Marius44 » 30/11/15 22:41

Ciao
Visto che sei nuovo, qualche consiglio
1) non scrivere in stampatello, sembra che tu STIA URLANDO;
2) allega sempre un file (senza dati sensibili) per dar modo a chi volesse aiutarti di lavorarci sopra e non costruirselo da solo col rischio di sbagliare struttura.
E adesso il tuo quesito.
La macro che hai postata viene eseguita ogni volta che sul Foglio cambi selezione; se vai dalla cella A1 alla cella A2 la macro viene lanciata (non so se ti serve così ma mi sembra un errore). La macro mette in ordine i dati dell'intervallo D11:N200 secondo il criterio posto nella cella D6, quindi continua ed effettua un controllo sulle celle della colonna D (dalla D11 alla D200) ed ogni volta che trova una cella vuota e la adiacente (colonna E) anch'essa vuota, seleziona quest'ultima. Ma questa selezione (anche se non lo vedi) scatena nuovamente la macro che viene eseguita ogni volta che trova una cella vuota per due volte almeno. Sarebbe da sistemare.
Cosa c'entra l'intervallo AB11:AB200? e che dati ci sono in questo intervallo? sono collegati alla colonna D oppure ai dati dell'intervallo D11:N200?
Prova a chiarire cosa vuoi e, ripeto, sarebbe meglio vedere il tuo file.

Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 30/11/15 23:37

Scusami per il maiuscolo ma avevo premesso che non ho mai usato un forum
Detto quanto cerco di spiegarmi meglio.
La macro che ho scritto funziona bene con la colonna D infatti inserisco una data e lei me la ordina in modo crescente rispetto alle altre inserite portandosi con sé tutte le colonne che contengono altri dati e funziona perfettamente, ma siccome nello stesso foglio ad una colonna diversa (ab) ho necessità di inserire sempre la data che sarà diversa da quella della colonna d mi serve ordinare anche questa spero di essere stato leggermente più chiaro
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 30/11/15 23:54

Cerco di spiegarti la struttura del foglio:
Colonna d data
Colonna e cliente
Colonna f pagamenti
E così via fino alla colonna n
Quindi inserendo la data nella colonna d mi sale in ordine crescente la data e tutte le colonne legate a questa data.
La stessa cosa vorrei fare con la colonna ab che devo inserire sempre una data per gestire altre colonne.
In pratica ho 2 schemi sullo stesso foglio uno per gli incassi e l'altro per i pagamenti. Intanto ti ringrazio per l'aiuto se poi mi puoi dare una macro diversa da quella che ho ma che soddisfa le mie esigenze che ben venga.
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi Flash30005 » 01/12/15 02:45

Ciao Gefi e benvenuto nel Forum
Con questo codice nel foglio attiverai uno o l'altro codice
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
URD = Range("D" & Rows.Count).End(xlUp).Row
URAb = Range("D" & Rows.Count).End(xlUp).Row
CheckAreaD = ("D11" & ":D" & URD)
CheckAreaAb = ("AB11" & ":AB" & URAb)
If Not Application.Intersect(Target, Range(CheckAreaD)) Is Nothing Then
'macro per tabella1
End If
If Not Application.Intersect(Target, Range(CheckAreaAb)) Is Nothing Then
'macro per tabella2
End If
End Sub


Se le due tabelle non hanno un legame di dati in riga ti consiglio di inserire la seconda tabella in un altro foglio
ed eventualmente, dovesse occorrere un riepilogo, un terzo foglio.

Ciao

P.s. Modificato titolo Topic (un titolo "AIUTO!" non aiuta nessuno)
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 01/12/15 08:55

Ciao, ma è da aggiungere alla macro che ho già o sostituirla?
Purtroppo ho esigenza di aver tutto sullo stesso foglio.
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi Flash30005 » 01/12/15 12:14

Devi sostituire la macro in selectionChange aggiungendo la macro per ordinare sia la tabella 1 sia la tabella 2
più o meno così
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
URD = Range("D" & Rows.Count).End(xlUp).Row
URAb = Range("D" & Rows.Count).End(xlUp).Row
CheckAreaD = ("D11" & ":D" & URD)
CheckAreaAb = ("AB11" & ":AB" & URAb)
If Not Application.Intersect(Target, Range(CheckAreaD)) Is Nothing Then
With Range("D11:N" & URD)   'Area che comprende tutti i dati
.Sort Key1:=Range("D6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With
'la spiegazione di questa parte di codice la dò sotto
[code]Dim CL As Object
For Each CL In Range("D11:D" & URD)
If CL.Value <> "" And CL.Offset(0, 1).Value = "" Then
CL.Offset(0, 1).Select
End If
End If
If Not Application.Intersect(Target, Range(CheckAreaAb)) Is Nothing Then
With Range("AB11:AZ" & URAb)   'Area che comprende tutti i dati
.Sort Key1:=Range("AB6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With
Dim CL As Object
For Each CL In Range("AB11:AZ" & URAb)
If CL.Value <> "" And CL.Offset(0, 1).Value = "" Then
CL.Offset(0, 1).Select
End If

End If
End Sub
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 01/12/15 18:45

ho provato ma non funziona mi da degli errori
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 01/12/15 18:58

la prima macro che ho postato funziona benissimo con la colonna d basterebbe estenderla alla colonna ab, ma non so come!!
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi Anthony47 » 01/12/15 22:58

Perdona, ma la macro che hai postato non "funziona benissimo", anche se alla fine (come dici) produce il risultato che ti aspetti. Al momento e' un bruco affamato di cpu, visto che si ripete numerose volte ad ogni variazione della cella selezionata (credo che si ripeta 200 volte, per impostazione standard di excel; e rischia anche di mandare in crash il programma).

Inoltre "ho provato ma non funziona mi da degli errori" non dice niente: che errore? Quando?

Comunque, ri-perdona: prima di suggerire qualcosa vorrei sapere che cosa vuoi fare esattamente, partendo da zero e non dalla macro che hai pubblicato; perche' ti assicuro che l'obiettivo completo non si puo' dedurre da quel codice.
Prova quindi a descrivere che cosa fa l'utente del foglio e cosa vorresti che venisse fatto dalla macro; in aggiunta alla descrizione dei dati che hai gia' pubblicato sarebbe utile in ogni caso un file esemplificativo, o (almeno) uno screenshot; per come pubblicare un file o uno screenshot guarda qui: viewtopic.php?f=26&t=103893

Ciao, ti aspettiamo....
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 02/12/15 02:03

Ciao ,forse mi son spiegato male ,ci riprovo: col.A ! col. B ! col. C ! col. D ! ! col. AB !
ho un foglio nel quale ci sono dei dati nelle colonne,tipo: DATA ! CLIENTE ! PAGAMENTO! FORMA DI AGAMENTO!..............data !FOR
ora il problema da risolvere e' che quando inserisco le date nella prima colonna (DATA) col.A me le deve ordinare in modo crescente e portare con se tutta la riga fino alla colonna prima della (data) col. AB , fin qui penso di essere stato chiaro.
poi vorrei che la stessa cosa mi farebbe quando inserisco le date nella col. AB cioe' ordinare in ordine crescente e portarsi dietro le col. AC,AD,AE,AF,ECT.
Spero di essere stato un po piu' chiaro.
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi Flash30005 » 02/12/15 02:24

Come dice Anthony dovresti fornire il tipo di errore e la riga evidenziata in debug (dove avviene l'errore)
comunque, il codice per attivare la tabella1 o la tabella 2 è questo:
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
URD = Range("D" & Rows.Count).End(xlUp).Row
URAb = Range("AB" & Rows.Count).End(xlUp).Row
CheckAreaD = ("D11" & ":D" & URD)
CheckAreaAb = ("AB11" & ":AB" & URAb)
If Not Application.Intersect(Target, Range(CheckAreaD)) Is Nothing Then
Msgbox "Ok tabella 1"
End If
If Not Application.Intersect(Target, Range(CheckAreaAb)) Is Nothing Then
Msgbox "Ok tabella 2"
End If
End Sub

Codice che inserirai nel foglio e non nel modulo
penso che tu già abbia il codice nel foglio perché quello postato qui all'inizio parla di SelectionChange che non può stare da altra parte.
Sostituisci il tuo codice con questo che farà da test
ovvero quando cliccherai nella colonna D apparirà il messaggio "Ok Tabella 1"
se cliccherai nella colonna AB (entro il range) avrai il messaggio "Ok Tabella 2"
Se funziona questo devi sostituire i messaggi con la macro che avevi per la tabella 1
e modificata come penso di aver fatto io per la tabella 2

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Macro attivabile da SelectionChange

Postdi Anthony47 » 02/12/15 10:13

Anthony ha scritto:Perdona, ma la macro che hai postato non "funziona benissimo"

GEFI ha scritto:Ciao ,forse mi son spiegato male ,ci riprovo:

Credi a me, il codice che hai pubblicato nel primo messaggio e' un obrobrio: perche' e' di tipo riattivante (va in loop da solo) e perche' fa delle cose la cui utilita' [mi] e' incomprensibile.

L'ultimo tuo messaggio aggiunge un dubbio al tuo scenario: la data la inserisci in colonna A (messaggio del 02/12/15 02:03) o colonna D (messaggio del 30/11/15 23:54)?
Vedi perche' inserire un file o (almeno) uno screenshot vale piu' di 1000 parole?

Poi non dici nulla di come operi: dove inserisci le date? In coda all'elenco? In altro posto?

Operativamente, sei sicuro che ordinare le date mentre vengono inserite sia meglio che aspettare il completamento degli inserimenti e poi fare un unico ordinamento?

Infine dovresti indicare con quale versione di Excel lavori, perche' quelle meno vecchie certe cose le fanno da sole senza doversi appoggiare a una macro.

Vedo che Flash ti ha proposto una soluzione, vedi tu come procedere.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 02/12/15 21:12

finalmente posso postare il link per vedere il mio progetto e quello che vorrei facesse la macro.
http://we.tl/yzfMcnDAlb
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 02/12/15 21:22

ora inserendo lecdatecin D me le deve mettere in ordine crescente e con se deve allineare le celle bianche corrispondenti (che sono modificabili), la stessa cosa deve fare con la colonna ab (adesso mancano le celle corrispondenti bianche perche' non ho terminato il progetto).
spero possiate aiutarmi perche' non ne mastico molto di macro.
Quella che ho postato all'inizio l'ho trovata spulciando su internet l'ho solo copiata e incollata modificando i range che mi servivano.
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi Anthony47 » 02/12/15 23:59

Ho guardato il tuo file, e immagino che l'utente scriva la data di una nuova operazione in colonna D in coda all'elenco preesistente.
A questo punto la macro corrente riordina le date e poi attiva la cella "vuota" accanto alla data appena inserita.

Qualche osservazione:
-Se la cella di colonna E fosse stata popolata prima di colonna D l'utente dovrebbe cercarsi a occhio la riga che stava popolando.
-Sarebbe molto peggio se in colonna E ci fossero due celle vuote (accanto a una data) perche' in questo caso la macro andrebbe in loop (su XL2010 Excel si arresterebbe per le sue impostazioni di sicurezza; su XL2003 credo che il loop si interrompa dopo 200 cicli). Due celle vuote si possono produrre perche' l'utente, dopo la compilazione, si accorge che il nome Cliente e' errato e cancella due o piu' celle adiacenti che lo contengono pensando di poterlo correggere.
-Analogamente e' problematico correggere una data, se l'utente si accorge di averla digitata male.

Tutto questo per dirti che voler mettere subito in ordine potrebbe non essere il modo migliore di operare, soprattutto se chi opera sul foglio non e' chi l'ha progettato.
Quindi il mio suggerimento e' di lasciare l'utente inserire i dati nell'ordine in cui li ha e procedere con un ordinamento solamente su richiesta; ad esempio potresti usare il "doppioclick" sull'intestazione di colonna per fare l'ordinamento secondo i dati di quella colonna, usando questa macro:
Codice: Seleziona tutto
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim Accett As String, CCol As Long, LastD As Long
'
Accett = "D8:E8"                '<<< Le colonne in cui e' accettato il DoubleClick
'
If Application.Intersect(Range(Accett), Target.Cells(1, 1)) Is Nothing Then Exit Sub
CCol = Target.Column
LastD = Cells(Rows.Count, "D").End(xlUp).Row
With Range("D11:N" & LastD)
    .Sort Key1:=Cells(6, CCol), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End With
Cancel = True
Target.Offset(2, 0).Cells(1, 1).Select
End Sub
La macro va inserita nello stesso modulo in cui hai inserito l'attuale Sub Worksheet_SelectionChange, che invece va cancellata. La linea marcata <<< va adattata per inserire le colonne su cui il doppioclick e' abilitato, cioe' le colonne su cui vorresti poter fare l'ordinamento; in caso di colonne non adiacenti userai questa notazione:
Codice: Seleziona tutto
Accett = "D8:E8, L8"     'Colonne D, E ed L

Un prerequisito per il corretto funzionamento del doppioclick e' la rimozione delle forme posizionate nelle intestazioni, la cui utilita' non ho capito.
Fin qui abbiamo fatto in modo diverso (e mi permetto di dire anche "piu' sicuro") le cose che facevi gia'.

Rimane il discorso della tabella che comincia da AB; immagino che lì c'e' un'altra tabella relativa alle Uscite, la cui struttura e' simile alla precedente.
Se vuoi fare anche per questa tabella lo stesso discorso allora la mia proposta e' di modificare macro di "beforedoubleclick" per inserirci un secondo blocco per l'ordinamento sulla seconda tabella; ad esempio:
Codice: Seleziona tutto
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim Accett As String, CCol As Long, LastD As Long, Accett2 As String
'
Accett = "D8:E8, L8"                '<<< Le colonne in cui e' accettato il DoubleClick
Accett2 = "AB8:AC8"                 '<<< Idem
'
If Not Application.Intersect(Range(Accett), Target.Cells(1, 1)) Is Nothing Then
    CCol = Target.Column
    LastD = Cells(Rows.Count, "D").End(xlUp).Row
    With Range("D11:N" & LastD)
        .Sort Key1:=Cells(6, CCol), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End With
    Cancel = True
    Target.Offset(2, 0).Cells(1, 1).Select
ElseIf Not Application.Intersect(Range(Accett2), Target.Cells(1, 1)) Is Nothing Then
    CCol = Target.Column
    LastD = Cells(Rows.Count, "AB").End(xlUp).Row
    With Range("AB11:AN" & LastD)       '<<< Le vere colonne da ordinare
        .Sort Key1:=Cells(6, CCol), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End With
    Cancel = True
    Target.Offset(2, 0).Cells(1, 1).Select
End If
End Sub
Ovviamente in sostituzione del codice precedente.
Noterai una doppia dedinizione in testa e il secondo blocco che replica le istruzioni del primo; le righe marcate <<< vanno sempre adattate al tuo caso.

Se invece vuoi rimanere con l'ordinamento "al volo" allora suggerisco di lavorare sull'evento WorksheetChange (e non SelectionChange), utilizzando questo codice:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Accett = "D11:D200"             '<<< L'intervallo la cui modifica fa scattare l'ordinamento
Accett2 = "AB11:AB200"          '<<< Idem secondo intervallo
If Target.Count > 1 Then Exit Sub
tval = Target.Value: tval1 = Target.Offset(0, 1).Value
If Not Application.Intersect(Range(Accett), Target.Cells(1, 1)) Is Nothing Then
    LastD = Cells(Rows.Count, "D").End(xlUp).Row
    With Range("D11:N" & LastD)
        .Sort Key1:=Cells(6, "D"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End With
    For Each cell In Range(Accett)
        If cell.Value = tval And cell.Offset(0, 1) = tval1 Then
            cell.Offset(0, 1).Select
            Exit For
        End If
    Next cell
ElseIf Not Application.Intersect(Range(Accett2), Target.Cells(1, 1)) Is Nothing Then
    LastD = Cells(Rows.Count, "AB").End(xlUp).Row
    With Range("AB11:AN" & LastD)       '<<< Le vere colonne
        .Sort Key1:=Cells(6, "AB"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End With
    For Each cell In Range(Accett)
        If cell.Value = tval And cell.Offset(0, 1) = tval1 Then
            cell.Offset(0, 1).Select
            Exit For
        End If
    Next cell
End If
End Sub

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 03/12/15 19:14

ANTHONY SEI GRANDE!!!l ultima che hai scritto funziona alla grande come io volevo
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 03/12/15 19:38

solo che se la provo in un foglio nuovo va bene ma se la applico al mio progetto non funziona!
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Re: Macro attivabile da SelectionChange

Postdi Anthony47 » 03/12/15 21:50

l ultima che hai scritto funziona alla grande come io volevo
L'ultima che ho scritto e' quella che meno mi piace :D :D

Poi, all' undicesimo messaggio (tra poco diventi Utente senior!) dovresti sapere che dire "non funziona" non serve a niente: come hai predisposto il foglio? Come hai predisposto il codice? Cosa hai scritto nel foglio? Che cosa succede quando scrivi una data? Che cosa invece ti saresti aspettato?

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro attivabile da SelectionChange

Postdi GEFI@EMAIL.IT » 04/12/15 08:39

L ho copiata e incollata nel foglio (che ho gia) nel vba ma cambiando le date non li mette in ordine .mentre se la inserisco in un nuovo foglio me li ordina.
GEFI@EMAIL.IT
Utente Junior
 
Post: 12
Iscritto il: 30/11/15 21:38

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Macro attivabile da SelectionChange":


Chi c’è in linea

Visitano il forum: Nessuno e 39 ospiti