Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

excel: formula per creare elenco

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

excel: formula per creare elenco

Postdi karug64 » 01/12/17 23:53

Salve a tutti.

Ho sul foglio1 in cui in colonna "B" senza un preciso ordine ho una stringa ripetuta ("Cod"). (Quindi posso avere Cod in B3, B54, B100, B10000, ecc)

In colonna "C" in corrispondenza di "Cod" ho il codice dell'articolo e in colonna "D" il costo.

E' possibile avere sul foglio2 delle formule (sicuramente matriciali) che mi riportino riga per riga solo i cod-codice-costo a partire dalla riga 3 ?

Grazie
Office 2010
karug64
Utente Senior
 
Post: 648
Iscritto il: 20/11/11 21:22

Sponsor
 

Re: excel: formula per creare elenco

Postdi Marius44 » 02/12/17 09:17

Ciao
Senza un tuo file e a tentoni suggerisco: ammesso che i tuoi dati siano in A1:A11 e nella celle D1:D11 metti questa formula MATRICIALE

Codice: Seleziona tutto
=SE.ERRORE(INDICE(A1:A11;PICCOLO(SE(CONFRONTA(A1:A11;A1:A11;0)=RIF.RIGA(INDIRETTO("1:"&RIGHE(A1:A11)));CONFRONTA(A1:A11;A1:A11;0);"");RIF.RIGA(INDIRETTO("1:"&RIGHE(A1:A11)))));"")


ottieni l'elenco UNIVOCO dei dati della colonna A.
Credo, però, che una formula simile per migliaia di righe appesantisca, e non di poco, il file.

Una cosa che avrei dovuto dire prima: non è che io con le formula ci vada a nozze ma questa l'avevo "in cassaforte".
Fai sapere. Ciao,
Mario
Marius44
Utente Senior
 
Post: 339
Iscritto il: 07/09/15 22:00

Re: excel: formula per creare elenco

Postdi karug64 » 02/12/17 10:47

Ciao. Allego il file di esempio

http://www.filedropper.com/cartel1_5

La formula proposta non mi da i risultati sperati ....

Grazie
Office 2010
karug64
Utente Senior
 
Post: 648
Iscritto il: 20/11/11 21:22

Re: excel: formula per creare elenco

Postdi Marius44 » 02/12/17 12:27

Ciao
Non avevo capito la "struttura" del foglio dove stanno i dati.
Con l'esempio che hai allegato io userei questa macro
Codice: Seleziona tutto
Option Explicit

Sub RiportoCodici()
Dim ur As Long, i As Long, a As Long
ur = Cells(Rows.Count, "B").End(xlUp).Row
a = 2
For i = 3 To ur
    If Cells(i, 2) = "Cod" Then
        a = a + 1
        Sheets(2).Cells(a, 2) = Cells(i, 2)
        Sheets(2).Cells(a, 3) = Cells(i, 3)
        Sheets(2).Cells(a, 4) = Cells(i, 4)
    End If
Next i
End Sub


Fai sapere. Ciao,
Mario
Marius44
Utente Senior
 
Post: 339
Iscritto il: 07/09/15 22:00

Re: excel: formula per creare elenco

Postdi Anthony47 » 02/12/17 13:02

In aggiunta all'efficace macro di Marius (vedi messaggio precedeente).

Si puo' fare anche con formule ma, l'ha gia' detto Marius, l'efficienza rischia di andare a pallino se hai centinaia o migliaia di righe da lavorare.
Io farei cosi':
In A2 di Foglio2
Codice: Seleziona tutto
=SE.ERRORE(PICCOLO(SE(Foglio1!$B$1:$B$1000="Cod";RIF.RIGA($B$1:$B$1000);"");RIF.RIGA(A1));"")
Da confermare con Contr-Maiusc-Enter e copiare poi verso il basso per un numero "sufficiente" di righe.
In B2
Codice: Seleziona tutto
=SE(A2<>"";INDICE(Foglio1!B$1:B$1000;$A2);"")

Da copiare poi in C2:D2; da copiare poi verso il basso

Oppure userei il filtro automatico, da associare poi all'evento Sheet_Activate di Foglio2; corrisponde a questa macro:
Codice: Seleziona tutto
Private Sub Worksheet_Activate()
Dim lastB As Long
'
With Sheets("Foglio1")
    lastB = .Cells(Rows.Count, "B").End(xlUp).Row
    .Range("$B$2").Resize(lastB, 1).AutoFilter Field:=1, Criteria1:="Cod"
    .Range("B2").Resize(lastB, 3).Copy Range("A2")
    .Range("$B$2").Resize(lastB, 1).AutoFilter Field:=1
End With
End Sub

Va messa nel modulo vba di Foglio2.
In questo modo tutte le volte che Foglio2 viene attivato l'elenco viene ricreato usando il filtro automatico su colonna B di Foglio1
NB: questo pero' significa che non si e' certi che il contenuto di Foglio2 sia corretto finche' non si apre Foglio2.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 15644
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: excel: formula per creare elenco

Postdi karug64 » 02/12/17 22:26

Grazie ad entrambi per entrambi i suggerimenti proposti.

Le soluzioni proposte da entrambi di Marius sono interessanti, ma, prevedendo del codice dietro al foglio, in questo frangente le ho escluse.
Pertanto, in questo caso, utilizzerò la soluzione a formule matriciali di Anthony.

Grazie !!
Office 2010
karug64
Utente Senior
 
Post: 648
Iscritto il: 20/11/11 21:22

Re: excel: formula per creare elenco

Postdi claudio_chirio » 04/02/18 00:16

Ciao a tutti, confidando nella vostra bravura (e consapevole del mio essere principiante), vi sottopongo il mio problema. Foglio excel con elenco di nomi (B54-B89), ognuno ha nelle celle a destra una sequenza di 30 lettere (M oppure P oppure N) che rappresentano i turni svolti nel mese. Dovrei creare un elenco (diciamo nello stesso foglio per semplicità) che, analizzando le 30 colonne, individui quelle con la "M", ne estragga i corrispondenti nomi, ne faccia un elenco e da questo estragga un nome random, scrivendolo in una cella. A questo punto cancelli l'elenco (non il nome estratto) e prosegua con la colonna successiva, fino ad avere i 30 nomi scritti in sequenza.
Il codice che allego fa già abbastanza tutto questo, però: 1) se lascio il comando per cancellare i nomi a fine ciclo, non ottengo 30 nomi in sequenza ma solo alcuni, altri li salta; 2) se invece elimino il comando di cancellazione mi scrive 30 nomi ma questi sono estratti da un elenco molto lungo (tutti quelli con la "M" di tutti i 30 giorni) e quindi non è più corretto.
Suggerimenti? Spero di essere riuscito a spiegarmi...
Grazie in anticipo!
Claudio

Codice: Seleziona tutto
Sub random()
Dim rig, rig1, rig2, rig3, rig4, col1, i, ii As Integer
Dim x As Long, y As Long
Dim rNomi As Range
rig1 = 46       'tenere questo mi serve per un altro passaggio
rig2 = rig1 + 8
rig3 = rig2 + 35
col1 = 3
i = 1
ii = 54        'colonna in cui iniziare a scrivere i nomi estratti
For col1 = 3 To 33
    For rig = rig2 To rig3
    If Cells(rig, col1) = "M" Then
        Cells(i, 52) = Cells(rig, 2)
        i = i + 1
    End If
    Next
        rig4 = Cells(Rows.Count, 52).End(xlUp).Row
        Set rNomi = Range(Cells(1, 52), Cells(rig4, 52))
        On Error Resume Next
        y = Application.WorksheetFunction.RandBetween(rNomi.Rows(1).Row, rNomi.Rows.Count)
        Cells(2, ii) = Cells(y, 52).Value
    ii = ii + 1
    Set rNomi = Nothing
    Range(Cells(1, 52), Cells(rig4, 52)).ClearContents
    Next
End Sub
claudio_chirio
Newbie
 
Post: 5
Iscritto il: 03/02/18 23:56
Località: Torino

Re: excel: formula per creare elenco

Postdi Anthony47 » 04/02/18 23:33

Ciao claudio, benvenuto nel forum.
Per interpretare correttamente la tua richiesta e' utile che pubblichi un file esemplificativo.
Per le istruzioni su come fare:
viewtopic.php?f=26&t=103893&p=605487#p605487

Ti aspettiamo...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 15644
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: excel: formula per creare elenco

Postdi claudio_chirio » 05/02/18 15:47

Ciao, ti scrivo un esempio:

A B C D E F G .... AF (I 31 GIORNI DEL MESE)
1 PIPPO M M P N R M
2 PLUTO P N N R R N
3 MINNIE N R M M P M
...
33 QUI M M M P P R

Quindi, giorno per giorno la macro dovrebbe, tra tutti quelli che quel giorno faranno il turno M (cioè mattino), selezionarne casualmente 1 e scriverne il nome in una cella (diciamo per comodità BA1, quindi scendere per tutti i 31 giorni fino a BA31). Poi ripetere il tutto anche per i turni "P" e "N", ma una volta fatto uno...
Grazie!
Claudio
claudio_chirio
Newbie
 
Post: 5
Iscritto il: 03/02/18 23:56
Località: Torino

Re: excel: formula per creare elenco

Postdi claudio_chirio » 05/02/18 15:49

Vedo che si capisce poco, scritto così, non è come lo vedevo io prima di publicarlo...
Se non chiaro allego un file di esempio...
claudio_chirio
Newbie
 
Post: 5
Iscritto il: 03/02/18 23:56
Località: Torino

Re: excel: formula per creare elenco

Postdi Anthony47 » 05/02/18 22:27

Meglio il file, cosi' invece di perdere il tempo a creare una cosa che hai gia' lo usiamo per vedere come aiutarti...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 15644
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: excel: formula per creare elenco

Postdi claudio_chirio » 06/02/18 22:27

Ecco il file di esempio, grazie!

http://www.filedropper.com/cartel1_9
claudio_chirio
Newbie
 
Post: 5
Iscritto il: 03/02/18 23:56
Località: Torino

Re: excel: formula per creare elenco

Postdi Anthony47 » 06/02/18 23:52

Certamente tu hai in mente un algoritmo a me sconosciuto, cerchero' quindi di interpretare alla lettera quello che ho capito e poi si vedra'.
Bisogna esaminare la colonna del gg 1, cercare gli M e di questi scegliere un nominativo a caso e riportarlo in BA1
Si ripete con la colonna del gg 2, e si riporta il nominativo sorteggiato in BB1
E cosi' per gli altri giorni presenti in tabella
Si ripete cercando P; poi si ripete cercando N
Quanto detto si puo' ottenere con una macro come questa:
Codice: Seleziona tutto
Sub eStraz()
Dim wArr(1 To 50), I As Long, J As Long, K As Long, lFor As String
Dim myRa As Long, dRange As String, eStraz, L As Long
'
dRange = "BA1"                  '<<< L'area dove si scrivono le estrazioni
eStraz = Array("M", "P", "N")   '<<< I turni che si devono cercare, in questa sintassi
Randomize
Range(dRange).CurrentRegion.ClearContents
For L = 0 To UBound(eStraz)
    lFor = eStraz(L)
    Range(dRange).Offset(L, 0) = lFor
    For I = 3 To Cells(3, Columns.Count).End(xlToLeft).Column
        K = 0
        For J = 4 To Cells(Rows.Count, "B").End(xlUp).Row
            If Cells(J, I) = lFor Then
                K = K + 1
                wArr(K) = Cells(J, "B")
            End If
        Next J
        If K > 0 Then
            myRa = Int(Rnd() * K) + 1
            Range(dRange).Offset(L, I - 2) = wArr(myRa)
        End If
    Next I
Next L
MsgBox ("Completato...")
End Sub

Il codice va inserito in un Modulo standard del vba (es Modulo1).
Le righe marcate <<< consentono di indicare l'area di creazione della tabella riepilogo e i Turni da cercare.

E' necessario che l'area indicata come dRange sia "isolata" dal resto del foglio almeno da una colonna vuota; analogamente sopra (se si indica un'area che parte dopo Riga1) e sotto la tabella di 3 righe che si andra' a creare (tante righe quante sono le voci presenti in eStraz) e' necessario che ci sia una riga vuota.

Prova e fai sapere...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 15644
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: excel: formula per creare elenco

Postdi claudio_chirio » 07/02/18 22:19

Pazzesco!! E' incredibile come chi conosce il linguaggio VB (tu) riesca in poco tempo ed in poche righe di codice a fare cose che un autodidatta (io) non riesce a portare a termine dopo mille tentativi! Complimenti, è perfetto!!
Grazie ancora!!
claudio_chirio
Newbie
 
Post: 5
Iscritto il: 03/02/18 23:56
Località: Torino


Torna a Applicazioni Office Windows


Topic correlati a "excel: formula per creare elenco":


Chi c’è in linea

Visitano il forum: Nessuno e 19 ospiti