2011-09-03 25 views
5

Se avessi questa colonna:eccellere testo estratto vba- tra 2 caratteri

ColA 
----- 
NUMBER(8,3) 
NUMBER(20) 

ho bisogno di una funzione VBA che sarebbe andato (notare questi cominciano e la stringa finale sarebbe sempre e solo una volta appare in una cella):

extract_val (cella, start_str, end_str)

ie. extract_val (A1, "(", ")") e dà i risultati:

8,3 
20 

Ho solo bisogno di utilizzare questa funzione all'interno altro codice vba non mettendolo come formula sul foglio.

UPDATE (grazie alla risposta, ho optato per :)

--------------------------- 
Public Function extract_value(str As String) As String 
Dim openPos As Integer 
Dim closePos As Integer 
Dim midBit As String 
On Error Resume Next 
openPos = InStr(str, "(") 
On Error Resume Next 
closePos = InStr(str, ")") 
On Error Resume Next 
midBit = mid(str, openPos + 1, closePos - openPos - 1) 
If openPos <> 0 And Len(midBit) > 0 Then 
extract_value = midBit 
Else 
extract_value = "F" 
End If 
End Function 

Public Sub test_value() 
MsgBox extract_value("NUMBER(9)") 
End Sub 
+1

Si potrebbe voler fare in modo che la linea closePos inizi nella posizione in cui ha trovato l'openPos, altrimenti si potrebbe trovare una parentesi di chiusura PRIMA della parentesi aperta, ma dato i propri esempi questo è improbabile. – harag

+0

suggerimento leggermente off-scope: http://stackoverflow.com/questions/2757477/trap-error-or-resources-next –

risposta

15

È possibile utilizzare instr per individuare un carattere all'interno della stringa (il ritorno alla posizione di '(' per esempio). È quindi possibile utilizzare mid per estrarre una sottostazione, utilizzando le posizioni di '(' e ')'.

Qualcosa di simile (a memoria):

dim str as string 
dim openPos as integer 
dim closePos as integer 
dim midBit as string 

str = "NUMBER(8,3)" 
openPos = instr (str, "(") 
closePos = instr (str, ")") 
midBit = mid (str, openPos+1, closePos - openPos - 1) 

Si consiglia di aggiungere il controllo degli errori nel caso in cui questi personaggi non si verificano nella stringa.

1

Se la stringa è “Valore di A è [1,0234] e il valore di B è [3,2345]”

Se si vuole estrarre il valore di B cioè 3,2345, poi

firstDelPos = InStrRev(textline, “[“) ‘ position of start delimiter 
secondDelPos = InStrRev(textline, “]”) ‘ position of end delimiter 

stringBwDels = Mid(textline, firstDelPos + 1, secondDelPos – firstDelPos – 1) ‘ extract the string between two delimiters 

MsgBox (stringBwDels) ‘ message shows string between two delimiters