Sostituzione stringhe sulla base di una tabella di conversione

Anonimo
2009-07-16T16:34:01+00:00

Ciao a tutti, ho bisogno del vostro aiuto!

Ho un elenco di 5mila voci che vorrei sostituire con 5mila codici di 4 cifre. Esempio:

Colonna A    |    Colonna B


Elisabetta     |   0001

Martina         |   0002

Alessandro   |   0003

....

Gianni          |   5000

L'ordinamento non è importante, ciò che importa è che ad ogni codice sia abbinata univocamente una voce del mio elenco.

Si tratta quindi di realizzare una tabella di conversione, e questo credo di poterlo fare, affiancando alla colonna A, una colonna B con degli interi incrementali.

La mia esigenza è di usare poi questa tabella di conversione (o altri formati, magari da voi suggeriti...) per effettuare la sostituzione di queste 5mila voci che si ripetono, in un foglio con 200mila righe e 2 colonne. Esempio:

Colonna C    |    Colonna D


Elisabetta     |   Alessandro

Martina         |   Gianni

Alessandro   |   Eisabetta

Martina         |   Alessandro

Elisabetta     |   Gianni

trasformarla così:

Colonna E    |    Colonna F


0001    |   0003

0002    |   5000

0003    |   0001

0002    |   0003

0001    |   5000

Come posso fare? HELP!!!!

Sono aperta a soluzioni sia Excel che Mysql!

Grazie mille a chi potrà aiutarmi!!!

Microsoft 365 e Office | Installare, riscattare, attivare | Per la casa | Altro

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2009-07-26T23:21:27+00:00

Ciao Puffetta, con un cordiale saluto a tutto il forum.

Hai ricevuto diverse risposte valide alle quali non hai dato riscontro; ci aggiungo la mia, sempre basata sul CERCA.VERT

mimando le operazioni manuali che avresti dovuto compiere per raggiungere il risultato desiderato.

Apri un nuovo file XLS e copia in un modulo standard queste routines:

Option Explicit

Public Sub testprova()

createst

assegnacodici

End Sub

Public Sub createst()

Dim R As Long, X As Long

For X = 1 To 5000

Cells(X, 1).Value = "Nodo" & X

Cells(X, 2).Value = X

Next

Randomize

For X = 1 To 50000      '<------variare in 200000

R = Int((5000 - 1 + 1) * Rnd + 1)

Cells(X, 3).Value = Cells(R, 1)

R = Int((5000 - 1 + 1) * Rnd + 1)

Cells(X, 4).Value = Cells(R, 1)

Next

    Columns("C:D").Select

    Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Key2:=Range("D1") _

        , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _

        False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _

        :=xlSortNormal

End Sub

Public Sub assegnacodici()

Dim R As Long, X As Long, rng As Range

Range("H1").Value = Time

Set rng = Range("A1:B5000")

For X = 1 To 50000         '<--- variare in 200000

Cells(X, 5).Value = WorksheetFunction.VLookup(Cells(X, 3), rng, 2, False)

Cells(X, 6).Value = WorksheetFunction.VLookup(Cells(X, 4), rng, 2, False)

Next

Range("I1").Value = Time

Range("J1").Value = Range("I1").Value - Range("h1").Value

Range("J1").Select

End Sub

Torna ad Excel e lancia la macro: testprova che eseguirà:

1°) La macro Createst da me utilizzata per creare il file di prova

2°) La macro Assegnacodici che assegna i codici di competenza ai "nodi".

Se tutto funziona, la routine da utilizzare nel tuo progetto è: Assegnacodici,

dopo aver variato i riferimenti del tuo range in 200.000 (ho usato il test

per 50.000 dal momento che uso XL2003)

Un riscontro anche generico a coloro che ti hanno risposto penso che sarebbe 

gradito anche in caso di risultato negativo.

Eliano

La risposta è stata utile?

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2009-07-16T19:50:45+00:00

Ciao Puffetta,

la funzione che fa al caso tuo in EXCEL è CERCA.VERT.

Poniamo di avere in A1:A5000 i nostri nomi univoci, e in B1:B5000 il corrispondente valore numerico.

Poniamo invece di avere in (C1:D200000) le nostre coppie di nominativi ripetuti che vogliamo convertire nel corrispondente numero.

In D1 sciriviamo:

=CERCA.VERT(C1;$A$1:$B$5000;2;FALSO)

ora trasciniamo la formula a destra e in basso e voilà il gioco è fatto!

Per avere maggiori informazioni su Cerca.VERT comincia da F1

Ciao

La risposta è stata utile?

0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2009-07-22T21:42:43+00:00

    Come ha scritto Fernando, in vb si può fare.

    Certo non sarà una cosa velocissima.

    Ciclare 400.000 celle per 5.000 volte....

    Comunque, i tuoi dati in A1:B5000,

    C1:D200000 del foglio1, questa la routine:

    Public Sub m()

    On Error GoTo RigaErrore

        Dim sh As Worksheet

        Dim rng1 As Range

        Dim rng2 As Range

        Dim c1 As Range

        Dim c2 As Range

        Set sh = Worksheets("Foglio1")

        With sh

            Set rng1 = .Range("A1:A5000")

            Set rng2 = .Range("C1:D200000")

            For Each c1 In rng1

                For Each c2 In rng2

                    If c1.Value = c2.Value Then

                        c2.Value = c1.Offset(0, 1).Value

                    End If

                Next

            Next

        End With

    RigaChiusura:

        Set c2 = Nothing

        Set c1 = Nothing

        Set rng2 = Nothing

        Set rng1 = Nothing

        Set sh = Nothing

        Exit Sub

    RigaErrore:

        MsgBox Err.Number & vbNewLine & Err.Description

        Resume RigaChiusura

    End Sub

    Potresti fare notte... anzi, mattina

    se la lanci adesso(23.42)... ;-)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2009-07-17T00:37:36+00:00

    forse la sostituzione di 200.000x2 voci sarebbe più opportuno farla in vba

    (prova a generare il codice [vedi: generatore macro] operando una sostituzione generale di una voce nel foglio con 200.000 righe.

    sarà facile poi adattarlo per la sostituzione delle 5.000 voci, comunque...siamo qui)

    non dici cosa rappresentino i tuoi dati, ma la tabella di 200.000 righe ha l'aspetto di una lista di adiacenze di un network.

    capire un network con stringhe o con numeri è molto complicato...ci vorrebbe un grafico.

    questo è un progetto di microsoft research per il disegno di network in excel:

    http://www.codeplex.com/NodeXL

    potresti provare a compilare il foglio 'edges' del modello (liberamente scaricabile) con la tua lista di adiacenze.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2009-07-16T19:52:54+00:00

    Ciao Puffetta,

    per fare quello che hai richiesto dovresti utilizzare il CERCA.VERT con la seguente sintassi (eventualmente da adattare al tuo caso):

    CERCA.VERT(C1;A:B;2;FALSO) per la colonna E e CERCA.VERT(D1;A:B;2;FALSO) per la colonna F.

    HTH


    Leonardo Bai - Microsoft MVP Windows Live Messenger - Since 2007. My MVP Profile: https://mvp.support.microsoft.com/profile/Bai

    La risposta è stata utile?

    0 commenti Nessun commento