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

Popolamento celle da primo valore menu a tendina

Ultimo Aggiornamento: 12/01/2018 20:09
Post: 1
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
07/01/2018 21:19

Salve a tutti. Mi sono appena iscritto ma ho girato molto questo forum e internet per cercare qualcosa che mi aiutasse con il piccolo progettino in cui mi sono avventurato.
Apparentemente dovrebbe essere una cosa abbastanza semplice ma proprio non ho trovato nulla.
Stò creando un calendario turni che riempisse in automatico l'intera turnazione dell'anno.
Il problema è il seguente:
Vorrei che le celle vuote si popolassero in automatico in base a una mia prima scelta ricavata da un menù a tendina.
Ho pensato ad un array da cui scegliere l'elemento di partenza (non necessariamente il primo) e attraverso una funzione scorrere l'array e popolare così le celle sottostanti fino alla fine dell'anno.
Quindi l'array dovrebbe essere scorso più volte fino al raggiugimento di una cella specifica.
Le celle sono contigue in verticale per il mese e per il successivo cambia il numero della colonna.
(esempio Gennaio da C4 a C34, Febbraio da I4 a I31).
Come posso fare per risolvere?
Ci sono metodi alternativi più rapidi?
Ringrazio anticipatamente.


[Modificato da pippo.2018 07/01/2018 21:32]
excel 2010 - excel 2013-2016
Post: 832
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
07/01/2018 23:16

Ciao.
Penso che, così come hai impostato i turni, sia difficile fare una progressione.
Mi spiego: seleziono come valore di partenza R, ma quale R? il primo o il secondo ecc.
Gli elementi devono essere distinguibili, altrimenti, come fa Excel a sapere quale valore prendere?
Io modificherei i valori, per es. così

3a
3b
3c
3d
R1
R2
2a
2b
2c
2d
R3
1a
1b
1c
1d
R4

Se lo trovi accettabile, si può scrivere una piccola userfunction (macro) adatta allo scopo.
[Modificato da Zer0kelvin 07/01/2018 23:17]
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 1
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
08/01/2018 17:34

Come prima cosa volevo ringraziarti per avermi dedicato del tempo.
Infatti quando provavo a scegliere un turno intermedio sembrava che partisse dal primo della lista uguale a lui.
Pensi che si possa adottare la soluzione da te proposta e magari fare una sorta di troncamento della parola in visualizzazione?
Potrei creare una riga aggiuntiva ad inizio del primo mese in modo da poter usare la denominazione che proponevi te e troncare la parola con la funzione che ho usato per troncare i giorni della settimana.
[Modificato da pippo.2018 08/01/2018 17:40]
excel 2010 - excel 2013-2016
Post: 2
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
09/01/2018 17:30

Re:
Zer0kelvin, 07/01/2018 23.16:

Ciao.
Penso che, così come hai impostato i turni, sia difficile fare una progressione.
Mi spiego: seleziono come valore di partenza R, ma quale R? il primo o il secondo ecc.
Gli elementi devono essere distinguibili, altrimenti, come fa Excel a sapere quale valore prendere?
Io modificherei i valori, per es. così

3a
3b
3c
3d
R1
R2
2a
2b
2c
2d
R3
1a
1b
1c
1d
R4

Se lo trovi accettabile, si può scrivere una piccola userfunction (macro) adatta allo scopo.




Per fare la macro che mi suggerivi bisogna usare il codice oppure registrare delle operazioni in seguenza?
excel 2010 - excel 2013-2016
Post: 834
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
09/01/2018 18:02

Non è una macro che puoi registrare, appena posso butto giù qualcosa.
Per la visualizzazione del primo carattere non sono sicuro che si possa fare.
Un problema alla volta...
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 835
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
09/01/2018 18:51

Ti allego una prima stesura.
Ho usato questa User Function
Public Function Succ(Turno As Variant) As Variant
Dim Sequenza As Variant
Dim C As Long
    Sequenza = Application.Transpose(Range("AL4:AL19"))
    Succ = ""
    If Turno <> "" Then
        For C = LBound(Sequenza) To UBound(Sequenza)
            If Sequenza(C) = Turno Then
                If C = UBound(Sequenza) Then
                    Succ = Sequenza(LBound(Sequenza))
                Else
                    Succ = Sequenza(C + 1)
                End If
                Exit For
            End If
        Next C
        If Succ = "" Then Succ = CVErr(xlErrValue)
    End If
End Function

da usare come una normale funzione di Excel, es.
=Succ(C4)
dove C4 è la cella che contiene il turno precedente.
La sequenza viene letta direttamente dal foglio (celle evidenziate in verde) e si può modificare.
I valori iniziali si inseriscono a mano nelle celle arancioni.
Ogni formula delle celle gialle punta all'ultimo turno del mese precedente e così via.
Ti riallego il file col turno parzialmente compilato.
Modificando le celle arancioni, la sequenza si aggiorna di conseguenza.
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 3
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
09/01/2018 22:40

Fantastico!!! Non so come ringraziarti.
Praticamente hai fatto una macro in vba?
Per quanto riguarda il troncamento stavo pensando se si poteva usare una matrice, dove nella prima colonna viene scritto l'indice univoco per ogni turno e nella seconda il relativo turno.
Secondo te è possibile far scorrere la macro sull'indice e far scrivere nelle celle il relativo turno?
Purtroppo non conosco una h di vba altrimenti proverei io a fare delle prove.

Volevo comunque ringraziarti per il prezioso aiuto che mi hai dato fin qui. [SM=x423047]
[Modificato da pippo.2018 09/01/2018 22:58]
excel 2010 - excel 2013-2016
Post: 836
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
09/01/2018 22:59

Ripensandoci, potrebbe essere più pratico fare tutto tramite una macro; selezionando il valore iniziale da una combobox. Si potrebbe risolvere, così, anche il problema del simbolo.
Si eviterebbe anche l'inserimento delle formule, che è un pò macchinoso.
Appena ho tempo provo qualcosa.
[Modificato da Zer0kelvin 09/01/2018 23:03]
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 4
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
09/01/2018 23:10

Ho provato a fare una piccola modifica con la funzione Stringa.Estrai e funziona solo per il primo valore, poi probabilmente la macro che hai scritto te non riconosce l'input e per i valori successivi non va.
Ti allego il file con la piccola modifica (in giallo) se può essere d'aiuto.
excel 2010 - excel 2013-2016
Post: 837
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
10/01/2018 10:44

Re:
pippo.2018, 09/01/2018 23.10:

probabilmente la macro che hai scritto te non riconosce l'input e per i valori successivi non va.


Sì, è così.
Penso che impostando così il lavoro non se ne venga a capo.
Dammi tempo e cercherò di risolvere in maniera differente:
-Il valore iniziale verrà selezionato dal una ListBox.
-La selezione attiva una macro che provvede a riempire tutta la serie fino al 31/12.
Non ci sarà bisogno di usare i simboli modificati perchè la macro può determinare, in base all'indice della ListBox, quale turno è stato selezionato.
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 5
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
10/01/2018 12:42

Si hai tutto il tempo che vuoi :)
Cercavo di essere partecipe e dare una mano.
La seconda soluzione sembra essere perfetta, era proprio quello che avevo in mente.
Una domanda cosidetta offtopic, si potrebbe integrare codice scritto in altro linguaggio tipo C o excel accetta solo vba? [SM=x423059]
excel 2010 - excel 2013-2016
Post: 839
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
10/01/2018 20:54

No, non si può.
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 840
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
11/01/2018 14:10

Ti allego il file funzionante.
Ho optato per una soluzione con userform.
Facendo doppio click su una delle celle evidenziate si apre una piccola userform che permette di selezionare il turno di partenza.
Se la cella contiene gia un valore viene mostrato un avviso.
Il codice contenuto nel foglio è questo
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim OK As Boolean
    If Not Intersect(Target, Range("C4:F4")) Is Nothing Then
        Cancel = True
        If Target <> "" Then
            OK = MsgBox("La cella  selezionara contiene gia un valore." & vbCrLf & _
                "Continuare?", vbYesNo + vbInformation, "[SVILUPPO TURNO]") = vbYes
        Else
            OK = True
        End If
        If OK Then fSviluppo.Show
    End If
End Sub


La userform contiene una Combobox ed un tasto per annullare.
Selezionando un valore si scatena la compilazione della sequenza.
Per la compilazione corretta per gli anni bisestili, la userform determina l'anno in base alla data contenuta nella cella A4; se non trova una data valida usa l'anno corrente.
La combobox prende i valori dal range AL4:AL19.
Questo è il codice nella userform
Dim Target As Range
Dim AnnoCorrente As Long

Private Function Giorni_Mese(M As Byte) As Byte
    Giorni_Mese = Day(DateSerial(AnnoCorrente, M + 1, 0))
End Function

Private Sub Compila(Target As Range, Index As Long)
Dim Sequenza As Variant
Dim Valore As String
Dim CurCell As Range
Dim C As Long, Puntatore As Byte, Max As Byte, Mese As Byte, Giorno As Byte
    Me.Hide
    Sequenza = Me.ComboBox1.List
    Set CurCell = Target
    Puntatore = Me.ComboBox1.ListIndex
    Max = UBound(Sequenza)
    For Mese = 1 To 12
        For Giorno = 0 To Giorni_Mese(Mese) - 1
            CurCell.Offset(Giorno, 0) = Sequenza(Puntatore, 0)
            Puntatore = Puntatore + 1
            If Puntatore > Max Then Puntatore = LBound(Sequenza)
        Next Giorno
        If Mese <> 6 Then
            Set CurCell = CurCell.Offset(0, 6)
        Else
            Set CurCell = Target.Offset(35, 0)
        End If
    Next Mese
End Sub

Private Sub ComboBox1_Change()
With Me.ComboBox1
    If .ListIndex > -1 And .Text <> "" Then Compila Target, .ListIndex
End With
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 27 Then
        CommandButton1_Click
    End If
End Sub

Private Sub CommandButton1_Click()
Me.ComboBox1 = ""
    Me.Hide
End Sub

Private Sub UserForm_Activate()
    Set Target = ActiveCell
    If IsDate(ActiveSheet.Range("A4")) Then
        AnnoCorrente = Year(ActiveSheet.Range("A4"))
    Else
        AnnoCorrente = Year(Date)
    End If
    With Me.ComboBox1
        .List = Application.Transpose(Range("AL4:AL" & Range("AL4:AL19").End(xlDown).Row))
        .ListRows = .ListCount
        .Visible = True
        .DropDown
    End With
End Sub


[Modificato da Zer0kelvin 11/01/2018 20:23]
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 6
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
11/01/2018 20:31

Provato e davvero non so come ringraziarti è veramente un ottimo lavoro.
Esattamente come l' avevo pensato all'inizio ma non mi aspettavo che venisse cosi bene.   

Ho fatto una marea di prove con le funzioni standard e cercato a lungo in internet ma penso che senza vba non avrei fatto nulla.
Grazie ancora Zer0kelvin per la pazienza e per avermi dedicato del tuo tempo.

Nel caso volessi applicare le tue macro ad un'altro foglio di lavoro simile ma con altra impaginazione, devo modificare molte variabili?
Come faccio per visualizzare le macro del foglio?

Per l'anno bisestile devo lavorarci, attualmente non va perché scrive il 29 sul primo giorno di marzo scombinando tutto.
[Modificato da pippo.2018 11/01/2018 20:33]
excel 2010 - excel 2013-2016
Post: 842
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
11/01/2018 22:55

Per l'anno bisestile, devi aggiornare l'anno nella data presente in A4 (1° gennaio).
Io ho provato e funziona regolarmente.

Per visualizzare il codice VBA (le Macro per intenderci) devi premere ALT-F11

Per visualizzare il codice nel foglio, nella parte sinistra dello schermo devi fare doppio click su Foglio1(2018)

Per visualizzare il codice nella Userform, nella parte sinistra dello schermo devi fare click destro su fSviluppo e scegli "visualizza codice"
Se non vedi fSviluppo devi prima fare doppio click su "Form"

Per una diversa impaginazione, bisogna modificare la parte evidenziata nella subroutine Compila che si trova nella userform.
Private Sub Compila(Target As Range)
Dim Sequenza As Variant
Dim Valore As String
Dim CurCell As Range
Dim C As Long, Puntatore As Byte, Max As Byte, Mese As Byte, Giorno As Byte
    Me.Hide
    Sequenza = Me.ComboBox1.List
    Set CurCell = Target
    Puntatore = Me.ComboBox1.ListIndex
    Max = UBound(Sequenza)
    For Mese = 1 To 12
        For Giorno = 0 To Giorni_Mese(Mese) - 1
            CurCell.Offset(Giorno, 0) = Sequenza(Puntatore, 0)
            Puntatore = Puntatore + 1
            If Puntatore > Max Then Puntatore = LBound(Sequenza)
        Next Giorno
        If Mese <> 6 Then
            Set CurCell = CurCell.Offset(0, 6)
        Else
            Set CurCell = Target.Offset(35, 0)
        End If
    Next Mese
End Sub

*EDIT*
la parte di codice da modificare è questa
        If Mese <> 6 Then
            Set CurCell = CurCell.Offset(0, 6)
        Else
            Set CurCell = Target.Offset(35, 0)
        End If

Curcell rappresenta la prima cella della sequenza per quel mese e cambia ad ogni mese.
Target, invece è la cella che corrisponde all'inizio della sequenza, quella su cui si fa doppio click all'inizio.
Per passare al mese successivo Curcel viene spostata di 6 celle a destra, tranne che per Giugno.
Per passare al turno di luglio, Curcel viene impostata 35 celle sotto Target e continua come prima per i mesi rimanenti.
[Modificato da Zer0kelvin 11/01/2018 23:08]
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
Post: 7
Registrato il: 07/01/2018
Città: MILANO
Età: 20
Utente Junior
excel 2010 - excel 2013-2016
OFFLINE
12/01/2018 17:58

Re:
Zer0kelvin, 11/01/2018 22.55:

Per l'anno bisestile, devi aggiornare l'anno nella data presente in A4 (1° gennaio).
Io ho provato e funziona regolarmente.



Si si, quello è l'unica cosa che sono riuscito a fare eheh
Mi ero fermato li con il progetto (l'autocomposizione del calendario).
L'unica cosa è che il giorno bisestile viene scritto nell'area del mese di Marzo, scombinado l'impaginazione e facendo sparire il 31 Dicembre.
Dovrei (ancora non so bene come) creare una sorta di if(SE in excel, giusto?!) sulla cella del 1 Marzo e valutare se è presente un valore in G32 (29 febbraio), e procedere di conseguenza per la cella M4 (primo giorno di Marzo).

A questo punto però andrebbe anche modificata la macro?

Zer0kelvin, 11/01/2018 22.55:


Per visualizzare il codice nel foglio, nella parte sinistra dello schermo devi fare doppio click su Foglio1(2018)



Non va, mi fa solo rinominare la scritta del foglio (2018).
Aspetta... sono un pò noob... fatto.

Zer0kelvin, 11/01/2018 22.55:


Curcell rappresenta la prima cella della sequenza per quel mese e cambia ad ogni mese.
Target, invece è la cella che corrisponde all'inizio della sequenza, quella su cui si fa doppio click all'inizio.
Per passare al mese successivo Curcel viene spostata di 6 celle a destra, tranne che per Giugno.
Per passare al turno di luglio, Curcel viene impostata 35 celle sotto Target e continua come prima per i mesi rimanenti.



Ok. Grazie mille. Farò delle prove.
Dovrebbe essere più semplice perché l'altro foglio si sviluppa in orizzontale e sono tutte celle adiacenti.
Invece di visualizzare l'intero anno, lavora solo su 8 settimane.
[Modificato da pippo.2018 12/01/2018 18:20]
excel 2010 - excel 2013-2016
Post: 846
Registrato il: 24/04/2004
Città: TERAMO
Età: 63
Utente Senior
2010
OFFLINE
12/01/2018 20:09


L'unica cosa è che il giorno bisestile viene scritto nell'area del mese di Marzo, scombinado l'impaginazione e facendo sparire il 31 Dicembre.

Non avevo capito, pensavo ti riferissi alla successione creata daalla macro.
in G32 inserisci

=SE(RESTO(ANNO(A4);4)=0;G31+1;"")

in M4 invece

=SE(RESTO(ANNO(A4);4)=0;G32+1;G31+1)

Il 2100 verrà considerato erroneamente un anno bisestile, ma non credo che ce ne importi più di tanto (anche se non si sà mai!) [SM=x423018]


Per visualizzare il codice nel foglio, nella parte sinistra dello schermo devi fare doppio click su Foglio1(2018)

Errore mio, scusami, era click destro, non doppio click.
__________________________
[Excel 2010]
-Condividere la conoscenza aumenta la ricchezza di tutti.
-Dai ad un uomo un pesce e lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
-Il sonno della ragione genera mostri. (Francisco Goya)
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 16:36. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com