Ricerca e "copia" da una tabella

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
Celluman
00giovedì 27 aprile 2017 19:06

La domanda è semplice,
ho una tabella in cui nella prima colonna ci sono nomi di alcuni prodotti e per ogni riga, accanto ci sono dei punti vendita che ne dispongono.

Vorrei semplicemente ottenere il contrario, ovvero un listato in cui si mostri per ogni punto vendita che prodotti ha.

Mi trovo costretto a scartare le ricerche (verticali e non)perché si lavora su una riga colonna sola, mentre un singolo prodotto deve essere ricercato in più punti, pensavo quindi a codici vba.
Vi ringrazio per i consigli
dodo47
00giovedì 27 aprile 2017 19:29
Ciao
i numeri da B2 a O15 sono i codici dei negozi quindi ?

e ovviamente non si ripetono in riga....

saluti
Celluman
00giovedì 27 aprile 2017 20:47
Si! sono i numeri dei negozi e non si ripetono in riga, perché quando ho stilato su carta il modulo cercavo quali negozi avevano un determinato prodotto.
Adesso cerco di riprodurre un archivio simile con excel
dodo47
00venerdì 28 aprile 2017 01:15
Che conoscenza hai di programmazione?
Intendo se ti bastano dei suggerimenti oppure...

Personalmente potrò risponderti domani nel pomeriggio se nessun altro interviene.

Comunque allega un esempio per evitare di dover ricostruire la tabella

Saluti
dodo47
10venerdì 28 aprile 2017 10:45
Ciao
comunque, sulla base di quanto visto, allego una possibile soluzione.

Usala così com'è e, se va bene, adattala al tuo lavoro.

E' indifferente eseguire la macro da uno dei due fogli.

saluti

Option Explicit

Sub Prodotti()

Dim mCol As New Collection, cel As Range, ur As Long, WkFr As Worksheet, WkTo As Worksheet
Dim mCod As Variant, i As Long, j As Long, vTemp As Variant, riga As Long, col As Long
Dim c As Object, firstaddress As String
Set WkFr = Sheets("Prod-Negozio")
Set WkTo = Sheets("Negozio-Prod")
WkTo.Cells.ClearContents
WkTo.Range("A1") = "cod.negozi"
WkTo.Range("B1") = "prodotti"
ur = WkFr.Range("A" & Rows.Count).End(xlUp).Row

'carica collection con codici univoci dei negozi
With WkFr
    For Each cel In .Range("B2:K" & ur)
        If cel <> "" Then
            On Error Resume Next
            mCol.Add cel.Value, CStr(cel)
            On Error GoTo 0
        End If
    Next
End With
'sort collection
For i = 1 To mCol.Count - 1
    For j = i + 1 To mCol.Count
        If mCol(i) > mCol(j) Then
            vTemp = mCol(j)
            mCol.Remove j
            mCol.Add vTemp, CStr(vTemp), i
        End If
    Next j
Next i
' per ogni negozio cerca i relativi prodotti.
riga = 2
col = 1
For i = 1 To mCol.Count
    mCod = mCol(i)
    WkTo.Cells(riga, col) = mCod
    With WkFr.Range("B2:K" & ur)
    Set c = .Find(mCod, LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        firstaddress = c.Address
        Do
            col = col + 1
            WkTo.Cells(riga, col) = WkFr.Cells(c.Row, 1)
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstaddress
    End If
    End With
    col = 1
    riga = riga + 1
Next
MsgBox "fine elaborazione"
WkTo.Select
Set WkFr = Nothing
Set WkTo = Nothing
End Sub

Celluman
00venerdì 28 aprile 2017 10:58
Grazie di cuore Dodo47, cerco di applicarla stamane.
Comunque diciamo che non sono più molto pratico di vb, anni fa lo facevo scolastico, quindi molte formule sono avanzate nel listato che hai messo.

Ti posso fare una domanda ancora?
se puoi, posso chiederti la spiegazione logica? semplicemente sarebbe bello capire bene ciò che hai fatto e potrebbe tornarmi utile per un futuro

se puoi sempre!
... e per ultimo (giuro!)posso chiederti un'ultima cortesia?
anziché ordinarle per numero negozio, come è possibile ordinarle mettendo prima i negozi con più prodotti?

Grazie ancora!!!!!

-------
Sto cercando intanto di applicarla nel mio foglio questa funzione, ma proprio non va, se applico tutto al TUO foglio va perfetto, sto cercando di capire ma è troppo avanti!

wkfr credo sia il foglio d'appartenenza base, wkto quello di destinazione, ur credo sia la dimensione completa della tabella.
mcol ed mcod sono delle variabili temporanee che utilizzi per portare i valori di negozi e prodotti;

With WkFr
    For Each cel In .Range("B2:U" & ur)
If cel <> "" Then
On Error Resume Next
            mCol.Add cel.Value, CStr(cel)
            On Error GoTo 0
End If
    Next"

[per ogni cella da b2...se diversa da nulla vai avanti,altrimenti in mcol carica il valore e avanti, ma non ho capito come rende univoci i risultati]


------------------------------------------------------------------
' per ogni negozio cerca i relativi prodotti
riga = 2
col = 1
For i = 1 To mCol.Count
    mCod = mCol(i)
    WkTo.Cells(riga, col) = mCod
    With WkFr.Range("B2:K" & ur)
---[definisci da dove partire, per i=1 sino alla fine dei negozi caricati in mcol, poi mcod carica nella cella del nuovo foglio il negozio in mcol...]

    Set c = .Find(mCod, LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        firstaddress = c.Address
--[qua proprio non lo so]
   

     Do
        col = col + 1
        WkTo.Cells(riga, col) = WkFr.Cells(c.Row, 1)
        Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstaddress
    End If
    End With
    col = 1
    riga = riga + 1
---[qui completi la trascrizione]

Next
MsgBox "fine elaborazione"
WkTo.Select
Set WkFr = Nothing
Set WkTo = Nothing
End Sub

----------------------------------------------------------------------



GRAZIE DAVVERO PER TUTTA LA PAZIENZA

dodo47
00venerdì 28 aprile 2017 16:50
Re:
Ciao
fa sempre piacere incontrare chi ci vuol capire qualcosa, cosa non molto frequente...

Celluman, 28/04/2017 10.58:

se puoi, posso chiederti la spiegazione logica? semplicemente sarebbe bello capire bene ciò che hai fatto e potrebbe tornarmi utile per un futuro
In sintesi: alimento una Collection mCol (diciamo un array con alcune caratteristiche particolari) con i codici Negozi (l'univocità la vediamo dopo); per ogni codice negozio, cerco i relativi articoli.

Sto cercando intanto di applicarla nel mio foglio questa funzione, ma proprio non va, se applico tutto al TUO foglio va perfetto, sto cercando di capire ma è troppo avanti!

wkfr credo sia il foglio d'appartenenza base, wkto quello di destinazione, ur credo sia la dimensione completa della tabella.
mcol ed mcod sono delle variabili temporanee che utilizzi per portare i valori di negozi e prodotti;
è corretto

With WkFr
    For Each cel In .Range("B2:U" & ur)
If cel <> "" Then
On Error Resume Next
            mCol.Add cel.Value, CStr(cel)
            On Error GoTo 0
End If
    Next"

[per ogni cella da b2...se diversa da nulla vai avanti,altrimenti in mcol carica il valore e avanti, ma non ho capito come rende univoci i risultati]
Univocità: mCol, dichiarata come New Collection, ha come membro (parametro): Add Item che permette l'assegnazione di una chiave al valore immesso (Es: mColl.Add (Item, Key,...). Ora come saprai sicuramente, una Key può essere solo univoca, quindi assegnando come chiave lo stesso valore dell'item (mCol.Add cel.Value, CStr(cel), inseriamo, per esempio in mCol: 560,560 cioè Negozio 560 chiave 560. Poiché come sopra detto la chiave non può avere duplicati, nel momento in cui si prova ad effettuare lo stesso inserimento perché trovato in una successiva riga, il codice segnalerebbe errore: non puoi inserire 2 chiavi uguali; qui entra in gioco: On Error Resume next, pertanto:
1) inserisco 560,560
2) provo a inserire di nuovo: 560,560
3) il codice rileva l'errore, non inserisce il 2° e passa al successivo Negozio. Spero sia chiaro.


------------------------------------------------------------------
' per ogni negozio cerca i relativi prodotti
riga = 2
col = 1
For i = 1 To mCol.Count
    mCod = mCol(i)
    WkTo.Cells(riga, col) = mCod
    With WkFr.Range("B2:K" & ur)
---[definisci da dove partire, per i=1 sino alla fine dei negozi caricati in mcol, poi mcod carica nella cella del nuovo foglio il negozio in mcol...]

è corretto

    Set c = .Find(mCod, LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        firstaddress = c.Address

     Do
        col = col + 1
        WkTo.Cells(riga, col) = WkFr.Cells(c.Row, 1)
        Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstaddress
    End If
    End With
    col = 1
    riga = riga + 1
Cerca nella tabella il Codice Negozio di mCol; una volta trovato (If Not c Is Nothing Then) memorizza l'indirizzo di dove sta (c.address), e riporta nel foglio destinazione la prima colonna (Articolo) della riga in cui ha trovato il Negozio (WkTo.Cells(riga, col) = WkFr.Cells(c.Row, 1)).
Poi cerca la successiva corrispondenza dello stesso negozio (Set c = .FindNext(c) ) che non sia quella precedente e ricomincia (Loop While...) scrivendo il nuovo articolo trovato per lo stesso negozio.



Spero di non esser stato prolisso e poco chiaro.

Per quanto attiene il diverso ordinamento ti aggiorno.

Saluti
dodo47
00venerdì 28 aprile 2017 19:05
Ciao
per ordinare la stampa per negozi con maggior numero di prodotti, ho fatto nel seguente modo:
in mCol, come item (codice negozio) ho inserito, separandoli con un "-", il numero dei prodotti ed il codice negozio:

mCol.Add Format(Worksheets.Application.CountIf(WkFr.Range("B2:K" & ur), cel.Value), "0000") & _
"-" & cel.Value, CStr(cel.Value)

pertanto mCol(1) per esempio, conterrà: 6-560, dove 6 è il numero dei prodotti e 560 il codice del negozio.
Fatto questo, porto la collection su un array bidimensionale la cui "colonna" 0(zero) contiene il numero-prodotti e la "colonna "1" il cod-negozio.
Passo tale array ad una sub per l'ordinamento "decrescente" per colonna 0 e colonna 1, in modo da avere l'array ordinato come a te serve.
Prosegue la stampa come prima.

Se hai difficoltà ad applicarlo al tuo lavoro...sono qui.

NOTA: non ci devono essere codici duplicati in riga; i codici Negozi devono essere numerici.
Tali dati non sono controllati dalla macro.

Dimenticavo: se i prodotti sono più di 9.999, aggiungi uno 0 (zero) all'istruzione riportata ad inizio post: "00000" (in tal modo arrivi a 99.999)

Saluti
Celluman
00sabato 29 aprile 2017 09:26
Ancora ti ringrazio per la disponibilità ,dodo47,appena torno stasera cerco di implementarlo e ti faccio sapere, ho apprezzato invece moltissimo le spiegazioni che mi hanno insegnato un po' di più; se conosci siti o altro che possano essere delle guide complete sarei contento di mettermi a studiare!
Comunque producendo un listato in cui hai a sinistra la colonna negozi già univoca dalla funzione spiegata in precedenza e accanto i prodotti per negozi che non possono essere duplicati non dovremmo incorrere in problematiche specificate.
dodo47
00sabato 29 aprile 2017 09:31
Ciao
non ho capito la seconda parte del tuo post; comunque se dici così avrai le tue buone ragioni.

Ci sono libri di vario interesse, ma non trascurare l'help della Microsoft, ti assicuro che c'è di tutto....basta cercare

saluti

(Rileggi la fine del mio post precedente per il numero dei prodotti e quanto scritto nella mia firma: inserisci una gestione errori!!)


saluti

Celluman
00giovedì 4 maggio 2017 19:24
Dodo47, ancora una volta ti ringrazio.
Sto cercando di studiarmi il tuo listato, è diverso dal primo che hai mandato, mi era sembrato che bastasse non ordinare per numero negozio crescente ma conteggiare e credevo fosse un passaggio di qualche riga e invece molte cose sono diverse! Funziona ovviamente ma vorrei mettermici a comprenderlo; in quanto l'help di Microsoft intendi quello online o quello integrato in VB?
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 12:39.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com