Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Impostare validazione dei valori di una cella tramite range variabile da altro foglio

Ultimo Aggiornamento: 26/07/2018 14:41
Post: 1
Registrato il: 22/08/2005
Città: ACCIANO
Età: 19
Utente Junior
excel 2003
OFFLINE
24/07/2018 22:19

Sono un ignorante becero alle primissime armi.
Ho due fogli, nel primo un elenco di prodotti, dove nella prima colonna ho il nome del prodotto e nel secondo il nome del fornitore. Più altre che per ora non interessano.
Nel secondo vorrei inserire le fatture.
Vorrei che, in questo secondo foglio ("fatture"), a seconda del fornitore che scelgo nella prima colonna, nella seconda ci sia il controllo di validazione che mi permetta di inserire i soli prodotti di quello specifico venditore.
Premetto che nel primo foglio le righe sono ordinate per venditore.
Ecco cosa ho beceramente partorito:

------ inizio codice ------

Private Sub Worksheet_Change(ByVal Target As Range)


'SE CAMBIO LA COLONNA "FORNITORE" DEVO CAMBIARE NELLA CELLA A FIANCO I PRODOTTI DISPONIBILI
If Target.Column() = 1 Then

'CERCA IL PRIMO PRODOTTO PER QUEL FORNITORE
Set trovaPrimo = Worksheets("listinototalone").Range("B:B").Find(Target)
primoprod = trovaPrimo.Row()

'CONTA I PRODOTTI PER QUEL FORNITORE

' prima è la cella dove è la prima occorrenza di quel fornitore
' quanti è il numero di occorrenza nella colonna B per quel fornitore


quantiProd = Application.WorksheetFunction.CountIf(Workbooks(1).Sheets(1).Range("B:B"), Target)

ultimoprod = primoprod + quantiProd


Worksheets("listinototalone").Activate
ActiveWorkbook.Names.Add Name:="listdata", RefersTo:=Range(Cells(primoprod, 1), Cells(ultimoprod, 1))
Worksheets("fatture").Activate



With Range("B" & Target.Row()).Validation 'definizione delle celle per la convalida
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="=listdata"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = True
End With

End If


End Sub

------ fine codice ------

Purtroppo vedo che la "listdata" punta sempre alle celle del secondo foglio ("fatture") e non al primo ("listinototalone").
Grazie a chi mi saprà aiutare e ne avrà la pazienza.

:help:
Post: 1.895
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
25/07/2018 10:46

Ciao
FORSE nel refetrsTo dovresti aggiungere il nome del foglio interessato

saluti



Domenico
Win 10 - Excel 2016
Post: 1
Registrato il: 22/08/2005
Città: ACCIANO
Età: 19
Utente Junior
excel 2003
OFFLINE
25/07/2018 11:25

Grazie Domenico, ci avevo provato ma senza riuscirci. Per questo pensavo di aggirare il problema "attivando" il foglio che mi serviva prima di definire il range pensando che in questo modo puntasse al foglio "attivo".

Avevo provato con:

---------------
ActiveWorkbook.Names.Add Name:="listdata", RefersTo:=Sheets("listinototalone").Range(Cells(primoprod, 1), Cells(ultimoprod, 1))
---------------

ma ricevo errore di run-time 1004.

Avevo provato con:

---------------
ActiveWorkbook.Names.Add Name:="listdata", RefersTo:="WorkSheets("listinototalone").Range(Cells(primoprod, 1), Cells(ultimoprod, 1))"
---------------

ma mi dà errore di compilazione.

[Modificato da IlBuonZephMSS 25/07/2018 20:54]
Post: 1.896
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
26/07/2018 07:44

Ciao
prova in questo modo:
Private Sub Worksheet_Change(ByVal Target As Range)
'SE CAMBIO LA COLONNA "FORNITORE" DEVO CAMBIARE NELLA CELLA A FIANCO I PRODOTTI DISPONIBILI
If Target.Column() = 1 Then

    'CERCA IL PRIMO PRODOTTO PER QUEL FORNITORE
    Set trovaPrimo = Worksheets("listinototalone").Range("B:B").Find(Target)
    primoprod = trovaPrimo.Row()
    
    'CONTA I PRODOTTI PER QUEL FORNITORE
    
    ' prima è la cella dove è la prima occorrenza di quel fornitore
    ' quanti è il numero di occorrenza nella colonna B per quel fornitore
    ur = Worksheets("listinototalone").Range("B" & Rows.Count).End(xlUp).Row
    Set mRng = Worksheets("listinototalone").Range("B2:B" & ur)
    
    quantiProd = Application.WorksheetFunction.CountIf(mRng, Target)
    
    ultimoprod = primoprod + quantiProd
    
    Set Convalida = Worksheets("listinototalone").Range("B" & primoprod & ":B" & ultimoprod)
    ActiveWorkbook.Names.Add Name:="listdata", RefersTo:=Convalida
    With Range("B" & Target.Row()).Validation 'definizione delle celle per la convalida
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
    Operator:=xlBetween, Formula1:="=listdata"
    .IgnoreBlank = True
    .InCellDropdown = True
    .ShowInput = True
    .ShowError = True
    End With
End If
End Sub


Mi lascia perplesso:
ultimoprod = primoprod + quantiProd

metteri (salvo controlli):
ultimoprod = primoprod + quantiProd-1

saluti



Domenico
Win 10 - Excel 2016
Post: 2
Registrato il: 22/08/2005
Città: ACCIANO
Età: 19
Utente Junior
excel 2003
OFFLINE
26/07/2018 14:41

Grazie molte
Ti ringrazio, gentilissimo, funziona.
Solo ho dovuto cambiare la

Set Convalida = Worksheets("listinototalone").Range("B" & primoprod & ":B" & ultimoprod)


con

Set Convalida = Worksheets("listinototalone").Range("A" & primoprod & ":A" & ultimoprod)


Perchè evidentemente non ero stato chiaro io ma la sintassi ovviamente era giusta (così come la correzione sul calcolo di "ultimoprod").

[SM=g27811] [SM=g27811] [SM=g27811] [SM=g27811]
[Modificato da IlBuonZephMSS 26/07/2018 14:42]
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 02:42. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com