Condividi:        

ESTRARRE NOMI DABASE

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

ESTRARRE NOMI DABASE

Postdi 3olo » 20/06/15 17:18

Salve a tutti,

avrei un problema:ho un database in excel con una decinadi tipologie di nomi (una tipologia per colonna), in cui in ogni colonna ci sono migliaia di nomi (codici).
In un altro foglio ho un form di selezione che mi porta a generare un codice parlante da cui si riesce a estrarre un nome univoco per ogni tipologia del database nell'altro foglio.
Il problema è che ogni tipologia di nome nome contiene solo parte del codice parlante (quello che gli serve per intenderci,magari le prime 4 lettere, poi la sesta, poi la decima e l'undicesima, faccio un esempio così) e si chiama in modo più esteso, perche la tipologia del database si identifica con un nome iniziale, a cui poi viene aggiunto parte del codice parlante, e poi altri valori aggiuntivi.

Io ,in base al codice parlante generato dovrei estrarre dal database un nome per ogni tipologia, ma come posso fare???
Premetto che so che potrei usare il filtro personalizzato, ma vorrei un qualcosa di automatico che mi desse un elenco di codici estratti , mi basterebbe una riga per ogni nome.
E' più difficile a spiegarsi che a vedere l'esempio che ho postato.
Ve lo posto e vi chiedo un consiglio su come fare.
Potrei fare delle colonne di appoggio nel database per ogni tipologia in cui faccio dei stringa.estrai e poi con dei cerca risalire ai codici , ma la strada è molto macchinosa. Volevo sapere se avete qualche dritta un po' più comoda e facile, magari anche con l'ausilio di VBA.

vi posto un filetto esempio ridotto per farvi capire un po'. Vi ringrazio tanto
http://www.filedropper.com/esempiofiltro

Volevo anche chiedere un'altra cosa: è possibile con il convalida evitare ad esempio se ho tra le selezioni un particolare carttere non possa selezionarlo? Ad esempio se mi trovo tra l'elenco "0" non possa selezionarlo?

Vi ringrazio.
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Sponsor
 

Re: ESTRARRE NOMI DABASE

Postdi Flash30005 » 22/06/15 05:20

Certo si potrebbe fare meglio
(intendo come dati di database)

Propongo questa macro un po' spartana ma sembra che coincide con il tuo esempio
sarà solo una coincidenza?

Codice: Seleziona tutto
Sub Testm()
UR = Sheets("codici DB").Range("C" & Rows.Count).End(xlUp).Row
StrRic = Sheets("selezione").Range("A23").Text
LStR = Len(StrRic)
For CC = 1 To 3
Mtr = 0
    For RR = 1 To UR
        Tr = 0
        StCo = Mid(StrRic, 1, 4)
        StCo2 = Right(StrRic, 4)
        STrODB = Sheets("codici DB").Cells(RR, CC)
        StrDb = Replace(Replace(Replace(STrODB, "COVER_", ""), "ASSEMBLY_", ""), "LUCE_", "")
        If Mid(StrDb, 1, 4) <> StCo Then
            GoTo saltaRR
        End If
        If CC = 2 And Len(StrDb) = Len(Replace(StrDb, StCo2, "")) Then GoTo saltaRR
        LStrDB = Len(StrDb)
        For CCR = 1 To LStR
            For CCD = 1 To LStrDB
                If Mid(StrRic, CCR, 1) = Mid(StrDb, CCD, 1) Then
                Tr = Tr + 1
                End If
            Next CCD
        Next CCR
        If Mtr < Tr Then
            Mtr = Tr
            RiDb = RR
        End If
saltaRR:
    Next RR
     If CC = 1 Then Sheets("selezione").Range("B28").Value = Sheets("codici DB").Range("A" & RiDb).Value
     If CC = 2 Then Sheets("selezione").Range("B29").Value = Sheets("codici DB").Range("B" & RiDb).Value
     If CC = 3 Then Sheets("selezione").Range("B30").Value = Sheets("codici DB").Range("C" & RiDb).Value
Next CC
End Sub


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 22/06/15 05:41

ciao! La provo e ti faccio sapere. Oh,ma chissei?????!!!! Come al solito gentilissiimi e velocissimi, grazie di cuore.
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi Flash30005 » 22/06/15 12:09

Piccolo bug ma necessario corregere
La riga UR posta a inizio macro va eliminata e sostituita come da esempio
Codice: Seleziona tutto
Sub Testm()   '<<<< nome macro
UR = Sheets("codici DB").Range("C" & Rows.Count).End(xlUp).Row  '<<<<<<< eliminare
StrRic = Sheets("selezione").Range("A23").Text   '<<<<< esistente e lasciare così


Va spostata e modificata così
Codice: Seleziona tutto
Sub Testm()   '<<<< nome macro
StrRic = Sheets("selezione").Range("A23").Text   '<<<<<<<< esistente
LStR = Len(StrRic)LStR = Len(StrRic)  '<<<<<<<<<< esistente
For CC = 1 To 3    '<<<<<<<<<< esistente
UR = Sheets("codici DB").Cells(Rows.Count, CC).End(xlUp).Row   '<<<<< inserire questo codice in questo punto
Mtr = 0   '<<<<< esistente


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 22/06/15 22:18

flash...non ho parole....ci sono rimasto lì quando l'ho provata...perfetta....che dire....GRAZIEEEEEEE!!!!!
Adesso provo a modificarla per filtrare tutto il database,provo a fare tutto da solo e semmai spero nella tua magnanimità se mi serve qualche dritta.... :-) Ti ringrazio ancora tantissimo, è proprio impostata perfettamente
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi Flash30005 » 22/06/15 23:09

Sono contento che abbia funzionato
ma fai la correzione riportata altrimenti non vengono processate tutte le righe delle colonne
con la modifica invece il conteggio righe "piene" viene effettuato su ogni colonna.

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 24/06/15 16:19

Ciao flash,me la sto un po' guardando e non capisco bene questa riga
UR = Sheets("codici DB").Range("C" & Rows.Count).End(xlUp).Row
Potresti spiegarmela per favore?
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi ricky53 » 24/06/15 16:25

Ciao,
l'istruzione calcola l'ultima riga contenente dati nella colonna "C"

ATTENZIONE: Flash ti aveva detto di eliminare l'istruzione e di sostituirla, in un'altra posizione, con la seguente
Codice: Seleziona tutto
UR = Sheets("codici DB").Cells(Rows.Count, CC).End(xlUp).Row


La differenza delle due istruzioni sta nel fatto che l'altra istruzione calcolava solo sulla colonna "C" questa calcola la riga basandosi sulla colonna dinamica contenuta nella variabile "CC" che varia nel ciclo For/Next
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 25/06/15 07:41

Grazie della spiegazione. Da quel che capisco calcola il numero di righe contenute nella colonna che sta esaminando il ciclo For ? Ho capito bene? Non riesco a verificarlo perché se la assegno a una cella per fare una prova mi da errore
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi ricky53 » 25/06/15 11:34

Ciao,
No, trova l'ultima riga, della colonna in analisi, che NON è VUOTA!
Il valore ottenuto, che è nella variabile "UR", viene utilizzato nel ciclo For/Next della variabile "RR"


Che errore ottieni?
Dovresti dire il numero e la descrizione dell'errore ottenuto.

Riporta l'istruzione hai utilizzato e ... risolveremo
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 25/06/15 11:52

Guardate,troppo gentili,mi dispiace tanto rompervi con ste cavolate.
Io per verifica volevo provare tanto per ad assegnare in un altro foglio
Sheets("Foglio2").range("A20").value = Sheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Row

Per vedere cosa sparava,tale foglio1 ha una colonna A1 con una serie di righe compilate,pensavo che in foglio 2 A20 mi mettesse il valore dell'ultima riga,ma non lo fa,mi va in debug e mi dice errore di runtime 9, indice non incluso nell'intervallo...bo!?
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 25/06/15 11:54

Tanto per finire di rompervi le scatole,non é che potreste commentarmi la macro passo passo per favore con spiegato cosa fa,così riesco ad arrangiarla per tutti i miei codici da filtrare magari,e in più non vi rompo più le scatole? Mi dispiace tanto che continuo ad approfittarmene della vostra gentilezza
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi ricky53 » 25/06/15 12:05

Ciao,
nel tuo file c'è un foglio che ha il nome "Foglio2" ?
Attenzione se hai degli spazi nel nome: prima, dopo, in mezzo.
Es.
" Foglio2"
"Foglio2 "
"Foglio 2"

Proprio commentare tutto il codice ... scegli alcune istruzioni e le commentiamo.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 25/06/15 12:36

Ho creato un nuovo file,copiato e incollato il nome della linguetta del foglio ma bo,mi da errore che non c'è l'indice,o anche l'errore 1009 errore definito dall'applicazione o dall'oggetto.
É scritta giusta la macro?
Sub prova()
Sheets("Foglio2").range("A20").value = Sheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Row
End sub()

Nient'altro...
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi ricky53 » 25/06/15 14:42

Ciao,
si l'istruzione è giusta (a parte le doppie parentesi alla fine dopo "End Sub").

Invia un tuo file nel quale hai inserito l'istruzione e che ti fornisce l'errore e risolveremo.

Per inviare il file utilizza QUESTO LINK
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 25/06/15 22:26

ciao,grazie mille delle dritte, adesso va!Non chiedermi perchè,non ho cambiato niente. Prima non andava,adesso va...boh!Ti ringrazio tanto.

intanto non capisco bene questo controllo che fa

If CC = 2 And Len(StrDb) = Len(Replace(StrDb, StCo2, "")) Then GoTo saltaRR

e anche il doppio ciclo next for verso la fine me lo sono perso purtroppo....
Se qualcuno mi fa un po' di carità e me la spiega...
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 26/06/15 00:26

guardate,siccome ahimè sono proprio arrugginito vi chiedo una cortesia: la macro precedente va che è una favola con quell'esempio.
Vi posso disturbare un ultima volta con un filetto simile? Che se non è troppo disturbo mi arrangiate un po' l macro e poi non vi rompo più le scatole.
E' più o meno la stessa cosa,ma c'è qualche condizione in più,nel primo foglio ho spiegato un po' in colonna "D" le varie cose.
Mi fareste un gran piacere perchè sono proprio piantato
http://www.filedropper.com/esempiofiltrodatabasenew
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi Flash30005 » 29/06/15 02:33

Ti invio la macro da testare per riconoscimento codici che hai richiesto
Codice: Seleziona tutto
Sub TRCodici()

Dim FS As Worksheet
Set FS = Sheets("selezione")
FS.Range("B39:B44").ClearContents
For CC = 1 To 6
    If CC = 5 And UCase(Right(FS.Range("D27"), 3)) = "000" Then GoTo SaltaCC
    If CC = 6 Then
        If UCase(Right(FS.Range("D29"), 2)) = "WA" Then
            CC = CC + 1
        Else
            If UCase(Right(FS.Range("D29"), 2)) = "00" Then GoTo SaltaCC
        End If
    End If
    If CC = 3 Then
        If UCase(Right(FS.Range("D3"), 2)) = "XL" Then GoTo SaltaCC
        If UCase(Right(FS.Range("D13"), 1)) = "0" Then GoTo SaltaCC
    End If
    UR = Sheets("codici DB").Cells(Rows.Count, CC).End(xlUp).Row
 
Select Case CC
Case 1
    StCo = FS.Range("D5").Text & FS.Range("D7").Text & FS.Range("D9").Text & FS.Range("D11").Text
Case 2
    StCo = FS.Range("D5").Text & "_" & FS.Range("D17").Text & FS.Range("D19").Text & FS.Range("D21").Text & FS.Range("D23").Text
Case 3
    StCo = Left(FS.Range("D5").Text, 6) & "--" & Right(FS.Range("D5").Text, 2) & "_" & FS.Range("D11").Text
Case 4
    StCo = Left(FS.Range("D5").Text, 6) & "--" & Right(FS.Range("D5").Text, 2) & "----" & FS.Range("D13").Text & FS.Range("D15").Text
Case 5
    StCo = FS.Range("D5").Text
Case Else
    StCo = Left(FS.Range("D5").Text, 3) & "-----" & FS.Range("D3").Text
End Select

    For RR = 1 To UR
        Tr = 0
        StCo1 = Left(StrRic, 13)
        StCo2 = FS.Range("D17").Text & FS.Range("D19").Text & FS.Range("D21").Text & FS.Range("D23").Text
        StCo3 = Left(FS.Range("D5").Text, 6) & "--" & Right(FS.Range("D5").Text, 2) & "----" & FS.Range("D13").Text & FS.Range("D15").Text
        StCo4 = FS.Range("D5").Text
        StCo5 = Left(FS.Range("D5").Text, 6) & "--" & Right(FS.Range("D5").Text, 2) & "_" & FS.Range("D11").Text
        StCo6 = Left(FS.Range("D5").Text, 3) & "-----" & FS.Range("D3").Text
        STrODB = Sheets("codici DB").Cells(RR, CC)
        StrDb = Replace(Replace(Replace(Replace(Replace(Replace(STrODB, "COVER_", ""), "ASSEMBLY_", ""), "LUCE_", ""), "EXPL_", ""), "BOX_", ""), "TIPO WA_", "")
        If StrDb Like "*" & StCo & "*" Then
        If CC = 1 Then FS.Range("B39").Value = Sheets("codici DB").Range("A" & RR).Value
        If CC = 2 Then FS.Range("B40").Value = Sheets("codici DB").Range("B" & RR).Value
        If CC = 3 Then FS.Range("B43").Value = Sheets("codici DB").Range("C" & RR).Value
        If CC = 4 Then FS.Range("B41").Value = Sheets("codici DB").Range("D" & RR).Value
        If CC = 5 Then FS.Range("B42").Value = Sheets("codici DB").Range("E" & RR).Value
        If CC > 5 Then FS.Range("B44").Value = Sheets("codici DB").Cells(RR, CC).Value
        Else
        GoTo saltaRR
        End If
saltaRR:
    Next RR
SaltaCC:
Next CC

End Sub


Ti renderai conto da solo che non è "più o meno" la stessa cosa

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: ESTRARRE NOMI DABASE

Postdi 3olo » 29/06/15 05:55

Ciao flash, infatti ho provato un po' a venircene fuori ma poi buio! Ti ringrazio infinitamente, la provo e poi ti so dire! Grazie mille ancora
win 7, office 2007
3olo
Utente Junior
 
Post: 55
Iscritto il: 25/02/15 10:39

Re: ESTRARRE NOMI DABASE

Postdi Flash30005 » 29/06/15 09:21

L'ho riprogettata tutta perché, come dicevo, la prima era troppo spartana
e questa può essere utilizzata, dopo previe modifiche, anche per il primo quesito postato
perché molto più affidabile.

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "ESTRARRE NOMI DABASE":


Chi c’è in linea

Visitano il forum: Nessuno e 37 ospiti