Ottieni il valore tra le parentesi, più corrispondenze in una string

Il mio foglio di calcolo ha una colonna con valore come questa string:

some text (text1) some test (text2) (text1) 

Come posso get tutti i valori tra le parentesi? Il risultato che cerco è:

 text1, text2 

Anche se text1, text2... testn è presente nella cella più volte, ho bisogno del risultato solo una volta.

Ho trovato una function GetParen qui: Ottieni il valore tra le parentesi

È utile, ma dà il pugno al valore disponibile nelle parentesi e ignora il resto.

Sembra ingrato di avere una function definita dall'utente per le singole voci e un altro per un risultato collettivo di tutte le voci.

Incollare quanto segue in un foglio di codice standard del module.

 Function getBracketedText(str As String, _ Optional pos As Integer = 0, _ Optional delim As String = ", ", _ Optional dupes As Boolean = False) Dim tmp As String, txt As String, a As Long, b As Long, p As Long, arr() As Variant tmp = str ReDim arr(1 To 1) For b = 1 To (Len(tmp) - Len(Replace(tmp, Chr(40), vbNullString))) p = InStr(p + 1, tmp, Chr(40)) txt = Trim(Mid(tmp, p + 1, InStr(p + 1, tmp, Chr(41)) - (p + 1))) If UBound(Filter(arr, txt, True)) < 0 Or dupes Then '<~~ check for duplicates within the arrays a = a + 1 ReDim Preserve arr(1 To a) arr(UBound(arr)) = txt End If Next b If CBool(pos) Then getBracketedText = arr(pos) Else getBracketedText = Join(arr, delim) End If End Function 

Utilizza come qualsiasi altra function di foglio di lavoro nativo. Esistono parametri facoltativi per recuperare un elemento individuale o una raccolta, nonché modificare il delimitatore di default <comma> <spazio> .

bracket_text_no_duplicates

Questo codice funziona per me:

 Sub takingTheText() Dim iniP 'first parenthesis Dim endP 'last parentehis Dim myText 'the text Dim txtLen Dim i Dim tmp Dim j myText = Range("A1").Value txtLen = Len(myText) j = 0 Do 'Loop in the text i = i + 1 'a counter iniP = InStr(1, myText, "(", 1) 'found the first occurence of the ( endP = InStr(1, myText, ")", 1) 'same as above tmp = tmp & Right(Left(myText, i), 1) 'take the text garbage text If i = iniP Then 'here comes the work j = j + 1 'here take the cell index myText = Replace(myText, tmp, "") 'remove the garbage text in front the first ( tmp = Left(myText, endP - iniP - 1) 'reuse the var to store the usefull text Cells(1, 2).Value = Cells(1, 2).Value & Chr(10) & tmp 'store in the cell B1 'If you want to stored in separated cells use the below code 'Cells(j, 2).Value = tmp myText = Replace(myText, tmp & ")", "", 1, 1) ' remove the garbage text from the main text tmp = Empty 'empty the var i = 0 'reset the main counter End If Loop While endP <> 0 

End Sub

Risultato:

immettere qui la descrizione dell'immagine

Si prega di controllare e dire se è ok.

Modifica # 1

Cells(1, 2).Value = Cells(1, 2).Value & Chr(10) & tmp questo codice memorizza il text in linee separate all'interno della stessa cella, potrebbe essere che si desidera utilizzare spazi tra il text risultante a causa chr(10) (potete anche utilizzare chr(13) ), allora puoi utilizzare Cells(1, 2).Value = Cells(1, 2).Value & " " & tmp , oppure usare qualsiasi altro carattere invece della string all'interno dei & simboli