Risolto Estrarre diversi numeri da una stringa

Luisa_95

Nuovo utente
12 Agosto 2019
3
1
Excel 2016
0
Ciao a tutti, dopo ore di ricerche non ho ancora trovato una vera soluzione al mio problema. Spero che qualcuno possa aiutarmi.

In Excel ho la colonna A piena di codici SQL, i cui numeri all interno devono essere comparati con la colonna D, dove sono dati determinati valori numerici.
Siccome nei rispettivi codici ho diversi numeri, la mia intenzione era di estrapolarli riga per riga e inserirli in una nuova colonna. Ho trovato diverse soluzioni su Internet, ma mi estrapolano i numeri e li mettono tutti vicini, invece per me e´importante che ogni numero della colonna A sia "riconoscibile".
Nell esempio sottostante vorrei estrarre dalla prima riga della prima colonna i valori 230 e 410 e inserirli possibilmente in una stessa riga e separati da una virgola.
Se qualcuno invece ha soluzioni migliori, fatevi avanti! Sono aperta a tutto SmileFace
 

Allegati

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
18.842
113
Como
2011MAC 2016WIN
353
Non ho ben capito cosa devi fare nel confrontare i numeri, però per la tua richiesta prova questo codice
Visual Basic:
Sub estraiNumeri()
    Dim uR&, j&, x%, num$
    uR = Cells(Rows.Count, 1).End(xlUp).Row
    For j = 2 To uR
        For x = 1 To Len(Cells(j, 1))
            If IsNumeric(Mid(Cells(j, 1), x, 1)) Then
                num = num & Mid(Cells(j, 1), x, 1)
            End If
            If IsNumeric(Mid(Cells(j, 1), x, 1)) = False And _
                IsNumeric(Mid(Cells(j, 1), x + 1, 1)) Then
                num = num & ","
            End If
        Next x
        Cells(j, 2).NumberFormat = "@"
        Cells(j, 2) = Mid(num, 2, Len(num) - 1)
        If Cells(j, 2) Like "*" & Cells(j, 4) & "*" Then
            Cells(j, 3) = "Trovato " & Cells(j, 4)
        End If
        num = ""
    Next j
End Sub
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.157
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
284
Sono aperta a tutto
Visto che dici così... proviamo a scrivere un po' di codice M SorrisoEOcchiali
M (Power Query):
let
    Origine = Excel.CurrentWorkbook(){[Name="SQL"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"RULE", type text}}),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Modificato tipo", "Numeri", each
    Text.Replace(
       Text.Combine(
          List.Select(
             Text.Split(
                Text.Remove(
                    [RULE],
                    List.Transform(
                       {33..47,58..126}, each Character.FromNumber(_)
                    )
                ),
             " "),
          each _ <> ""),
       " "),
    " ",",")
    ),
    #"Rimosse colonne" = Table.RemoveColumns(#"Aggiunta colonna personalizzata",{"RULE"})
in
    #"Rimosse colonne"
 

Allegati

Ultima modifica:

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
3.731
63
office pro 2010
43
questo è un lavoro da espressioni regolari


Modulo Standard:
Option Explicit

Function EstraiNumeri(Frase) As String
    Dim M As Object
    
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = """(\d+)"""
        If .Test(Frase) Then
            For Each M In .Execute(Frase)
                EstraiNumeri = EstraiNumeri & "," & M.submatches(0)
            Next
        End If
    End With
    EstraiNumeri = Right(EstraiNumeri, Len(EstraiNumeri) - 1)
End Function

Function CeIlNumero(Frase, Numero) As Boolean
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = CStr(Numero)
        If .Test(Frase) Then
            CeIlNumero = .Execute(Frase)(0)
            CeIlNumero = True
        End If
    End With
End Function
 

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
3.731
63
office pro 2010
43
M (Power Query):
let
    Origine = Excel.CurrentWorkbook(){[Name="SQL"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"RULE", type text}}),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Modificato tipo", "Numeri", each
    Text.Replace(
       Text.Combine(
          List.Select(
             Text.Split(
                Text.Remove(
                    [RULE],
                    List.Transform(
                       {33..47,58..126}, each Character.FromNumber(_)
                    )
                ),
             " "),
          each _ <> ""),
       " "),
    " ",",")
    ),
    #"Rimosse colonne" = Table.RemoveColumns(#"Aggiunta colonna personalizzata",{"RULE"})
in
    #"Rimosse colonne"

Ciao klingklang @klingklang , da come hai scritto il listato, l indentazione per facilitare la lettura degli annidamenti suppongo, questo codice, non tiene conto degli "a capo"?
Forse con l hash indichi la partenza di istruzione?
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.157
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
284
Ciao dracoscrigno @dracoscrigno , il codice non tiene conto degli a capo e purtroppo l'IDE non supporta il TAB, quindi tocca indentarselo a occhio con gli spazi 🙄 va be', piano piano lo miglioreranno, hanno appena aggiunto l'Intellisense...
L'hash è una notazione che serve a identificare il nome del passaggio (ogni step della query ha un suo identificativo), qualora esso contenga degli spazi: hash-virgolette-nome-virgolette. Se non contiene spazi, puoi anche solo scrivere il nome.

EDIT: per spiegare un attimo, ho racchiuso dentro l'unico step "Aggiungi colonna personalizzata" una serie di passaggi che potevano anche essere eseguiti separatamente:
1) rimuovere dalla colonna iniziale tutti i caratteri compresi tra i codici ascii 33-47 e 58-126 (Text.Remove)
2) Splittare il testo risultante (solo numeri e spazi) per il carattere spazio, trasformandolo in una List (Text.Split)
3) Da questa List, prendere solo gli elementi non vuoti (quelli vuoti si creano in presenza di doppi, tripli spazi) (List.Select)
4) Combinare gli elementi della lista in un testo separato da spazi (Text.Combine)
5) Sostituire gli spazi con le virgole (Text.Replace)

P.S. 4 e 5 si possono fondere in un unico passaggio, ma ormai ho corretto troppe volte, va bene così almeno si vede un comando in più Caffe_rido
 
Ultima modifica:

Luisa_95

Nuovo utente
12 Agosto 2019
3
1
Excel 2016
0
Grazie mille a tutti! Apportando una modifica al codice di ges @ges sono riuscita nel mio intento. Spero fra qualche annetto di diventare cosi esperta pure io MiInchino buona serata!
 

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
18.842
113
Como
2011MAC 2016WIN
353
Grazie del riscontro Luisa, se frequenti il forum certamente diventerai brava. SmileFace
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!