Condividi:        

Macro per creare elenco a discesa

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 per creare elenco a discesa

Postdi leo21583 » 02/01/12 18:11

Salve,
ho creato una macro che viene richiamata da una private Sub Worksheet_Change e che ha il compito di creare un elenco a discesa se si verifica una determinata condizione. Il problema è: ogni volta che viene richiamata la macro la pagina excel si sposta portandosi sulla cella in cui si inserisce l'elenco a discesa il che risulta alquanto fastidioso. Qualcuno sa come posso rimediare a questo inconveniente? Vorrei che la pagina restasse nel punto in cui sto cambiando il dato. Diseguito riporto il codice in oggetto.. Spero di ricevere qualche aiuto!

If Cells(244, 1) = "Buon 2012" Then
Range("B244").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="='Shear connectors'!$B$3:$B$29"
End With
End If

Questa è solo una piccola parte di una macro che viene richiamata ogni volta che si cambiano determinati valori nel foglio elettronico in questione.
leo21583
Utente Junior
 
Post: 32
Iscritto il: 10/12/11 08:35

Sponsor
 

Re: Macro per creare elenco a discesa

Postdi Flash30005 » 02/01/12 18:41

Chiaramente la tua macro a me va in errore
ma se vuoi evitare la select puoi modificare la macro eliminando la "With" così
Codice: Seleziona tutto
If Cells(244, 1) = "Buon 2012" Then
Range("B244").Delete
Range("B244").Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="='Shear connectors'!$B$3:$B$29"
End If


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 per creare elenco a discesa

Postdi leo21583 » 02/01/12 21:30

Grazie Mister Flash!
ho provato a modificare la macro come mi hai suggerito ma il programma impazzisce e sono costretto a chiuderlo con Gestione attività.. Non capisco perchè!? Qualche idea??
leo21583
Utente Junior
 
Post: 32
Iscritto il: 10/12/11 08:35

Re: Macro per creare elenco a discesa

Postdi Flash30005 » 02/01/12 22:47

Sto andando per tentativi non avendo alcuni parametri del tuo file

quindi prova così
Codice: Seleziona tutto
If Cells(244, 1) = "Buon 2012" Then
Range("B244").Validation.Delete
Range("B244").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="='Shear connectors'!$B$3:$B$29"
End If


La convalida può essere fatta su altro foglio se il range è stato definito con un nome
esempio: selezioni il range B3:B29 del foglio "Shear connectors"
e sul Menu Inserisci -> Nome -> Definisci
assegni un nome (io ho usato ScDati)

poi userai questa macro
Codice: Seleziona tutto
Sub Convalida()
If Cells(244, 1) = "Buon 2012" Then
Range("B244").Validation.Delete
Range("B244").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=ScDati"
End If
End Sub


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 per creare elenco a discesa

Postdi Anthony47 » 03/01/12 01:53

Pero' la cosa piu' semplice e' modificare la With della macro originale:
NON
Range("B244").Select
With Selection.Validation
.Delete
'etc etc

ma
Codice: Seleziona tutto
'Range("B244").Select    'eliminata
With Range("B244").Validation
.Delete
'etc etc
che poi e' equivalente al codice del messaggio di Flash qua sopra.

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

Re: Macro per creare elenco a discesa

Postdi leo21583 » 03/01/12 15:09

Vi ringrazio,
ho provato a fare le modifiche che mi avete suggerito ma.. Ho provato a commentare la parte di codice con il With ma a quel punto ho il problema che restano selezionate delle celle per via dei comandi Rows.Select. Esiste un comando inverso a Rows.select? Ho provato con Deselect e Unselect ma non vanno! Per farvi capire di cosa parlo vi posto una parte piu ampia del codice su cui sto lavorando.. Quello che vorrei è che quando agisco su una cella qualsiasi il foglio non si sposti altrove e non restino selezionate altre celle! Qualsiasi suggerimento sarà ben gradito..

If Cells(244, 1) = "TRW Nelson KB" Then
Rows("256:256").Select
Selection.EntireRow.Hidden = True
Rows("245:251").Select
Selection.EntireRow.Hidden = False
Rows("254:255").Select
Selection.EntireRow.Hidden = False
Rows("257:257").Select
Selection.EntireRow.Hidden = False
Range("B244").Select
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
With Range("B244").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=SCList"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Rows("1:1").Select
ElseIf Cells(244, 1) = "Others" Then
Rows("256:256").Select
Selection.EntireRow.Hidden = False
Range("B244").Select
Rows("245:251").Select
Selection.EntireRow.Hidden = True
Rows("254:255").Select
Selection.EntireRow.Hidden = True
Rows("257:257").Select
Selection.EntireRow.Hidden = True
With Range("B244").Validation
.Delete
.Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
:=xlBetween
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Range("B244").Select
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
End If
leo21583
Utente Junior
 
Post: 32
Iscritto il: 10/12/11 08:35

Re: Macro per creare elenco a discesa

Postdi Flash30005 » 03/01/12 15:23

ti faccio un esempio poi modificherai il resto della tua macro con lo stesso principio
prendiamo queste due righe di codice
Codice: Seleziona tutto
Rows("256:256").Select  '<<<< seleziona la riga
Selection.EntireRow.Hidden = True '<<<< nasconde la riga

ora puoi fare così
Codice: Seleziona tutto
Rows("256:256").EntireRow.Hidden = True

e la riga viene nascosta senza essere selezionata
e così per tutte le altre

per il With
Codice: Seleziona tutto
Range("B244").Select
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With


diventa
Codice: Seleziona tutto
Range("B244").Font.ColorIndex = xlAutomatic
Range("B244").Font.TintAndShade = 0


L'ultima With già trattata precedentemente nel post mio e di Anthony ma ripeto con i dati attuali
Codice: Seleziona tutto
Range("B244").Validation.Delete
Range("B244").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=SCList"


Inoltre elimina
Codice: Seleziona tutto
Rows("1:1").Select


e questa
Codice: Seleziona tutto
Range("B244").Select
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With


diventa
Codice: Seleziona tutto
Range("B244").Font.ThemeColor = xlThemeColorDark1
Range("B244").Font.TintAndShade = 0


Fai sapere
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 per creare elenco a discesa

Postdi Flash30005 » 03/01/12 15:35

In altre parole l'intera macro da te postata e modificata senza avere alcuna select è questa

Codice: Seleziona tutto
If Cells(244, 1) = "TRW Nelson KB" Then
Rows("256:256").EntireRow.Hidden = True
Rows("245:251").EntireRow.Hidden = False
Rows("254:255").EntireRow.Hidden = False
Rows("257:257").EntireRow.Hidden = False
Range("B244").Font.ColorIndex = xlAutomatic
Range("B244").Font.TintAndShade = 0    '<<< excel 2003 dà errore
Range("B244").Validation.Delete
Range("B244").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=SCList"
ElseIf Cells(244, 1) = "Others" Then
Rows("256:256").EntireRow.Hidden = False
Rows("245:251").EntireRow.Hidden = True
Rows("254:255").EntireRow.Hidden = True
Rows("257:257").EntireRow.Hidden = True
Range("B244").Validation.Delete
Range("B244").Validation.Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
:=xlBetween
Range("B244").Font.ThemeColor = xlThemeColorDark1  '<<< excel 2003 dà errore
Range("B244").Font.TintAndShade = 0    '<<< excel 2003 dà errore
End If


Molto probabilmente hai excel 2007 o superiore perché alcune formattazioni (dove indicato) con excel2003 va in errore

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 per creare elenco a discesa

Postdi leo21583 » 03/01/12 16:08

Fantastico! Ho fatto le modifiche che mi hai suggerito in tutto il codice e ho eliminato quei fastidiosi spostamenti e selezioni di celle! Grazie Ancora! A presto!
leo21583
Utente Junior
 
Post: 32
Iscritto il: 10/12/11 08:35

Re: Macro per creare elenco a discesa

Postdi Flash30005 » 03/01/12 16:19

Forse non hai visto il mio ultimo post:
con macro modificata

comunque le modifiche fatte da te sono sicuramente servite a qualcosa ;)

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 per creare elenco a discesa

Postdi leo21583 » 04/01/12 01:15

Si, non avevo visto il tuo ultimo post ma coincide con quello che ho ottenuto seguendo alla lettera le indicazioni del post precedente.. Uso Office 2010 e non ho avuto problemi! A prestoooooo! ;)
leo21583
Utente Junior
 
Post: 32
Iscritto il: 10/12/11 08:35


Torna a Applicazioni Office Windows


Topic correlati a "Macro per creare elenco a discesa":


Chi c’è in linea

Visitano il forum: Nessuno e 79 ospiti