2013-06-18 15 views
0

我正在尋找處理此字符串的最佳方法:我們需要從Excel的發票行描述字段中提取狀態。這裏是我需要從提取國家線的類型的例子:VBA:如何從地址拉中間字符串2字符狀態?

Managment Blvd.Philadelphia.PA.19103 
Management EXECUTIVE CTJACKSONVILLE.FL.32216-4041 

因此,大家可以看到,國家代碼,則立即從右側的郵政編碼後。這是我在想什麼:

IF(isnumeric(Right(mystring,5)) 

Then 
MyString = Right(mystring,8) 
MyString =Left(mystring,2) 

End If 

會給我2個國家的字符?還是有更好的方法來做到這一點?也許甚至可以通過添加一個狀態縮寫表來添加一些檢查來比較字符以確保它們與狀態匹配。

但是,目前我不知道該如何處理第二個例子中包含+4的郵政編碼。任何幫助表示讚賞!

+0

除了郵政編碼以外,還有其他任何字符串嗎? – user2140261

+0

是的,這是可能的。由於這是一個廣泛的地址數據庫編程' - 很多會有其他號碼的房子#,套房#等... – user2296381

回答

1

假設狀態總是倒數第二

Function getState(description As String) As String 
    Dim s() As String 
    s = Split(description, ".") 
    getState = s(UBound(s) - 1) 
End Function 

如果國家可以在字符串中的任何地方,但始終是2個字母和接近字符串末尾

Function getState(description As String) As String 
    Dim i As Long 
    Dim s() As String 
    s = Split(description, ".") 
    For i = UBound(s) To LBound(s) Step -1 
     If Len(s(i)) = 2 Then 
      getState = s(i) 
      Exit For 
     End If 
    Next 
End Function 
+0

我喜歡你的第一個建議,如果這是有效的 - 這段時間是一個很好的地方,因爲無論它是一個5位數字或9位數的郵政編碼,它總是在這段時間後。我現在唯一關心的是那些實際上並沒有狀態的字符串。之後的最佳選擇是簡單地將2位狀態字符串與實際的狀態列表進行比較,以確保這兩個字符匹配一個狀態? – user2296381

+0

檢查的數量的確可以歸結爲您需要的狀態的多少以及字符串中可能存在多少差異,例如如果某人輸入佛羅里達而不是FL,那麼該怎麼辦?但是,如果它總是一個2個字母的代碼,那麼檢查列表是可靠的。 – ashareef

+0

好的 - 所以我試圖將這個實現到我的數據庫,只要導入到我的訪問表。我怎樣才能把它放到我的表中,以便它在我的select語句中爲每個描述計算這個值? – user2296381

0

您需要反轉字符串併爲狀態和zip之間的時間段執行InStr。

這裏是一個函數的例子反轉的字符串:

Option Explicit 

Private Sub CommandButton1_Click() 

'Define Variables 

Dim Original_String As String 
Dim Reversed_String As String 
Dim Next_Char As String 

Dim Length As Integer 
Dim Pos As Integer 

'Get the Original String 

Original_String = InputBox("Pls enter the original string: ") 

'Find the revised length of the string 

Length = Len(Original_String) 

'Set up the reversed string 
Reversed_String = "" 

'Progress through the string on a character by character basis 
'Starting at the last character and going towards the first character 

For Pos = Length To 1 Step -1 

    Next_Char = Mid(Original_String, Pos, 1) 
    Reversed_String = Reversed_String & Next_Char 
Next Pos 

MsgBox "The reversed string is " & Reversed_String 

End Sub 

一旦你的逆轉字符串,做這樣的事情:

LPosition = InStr函數(Reversed_String, 「」)

這將找到期限。然後使用字符串的長度找到原始字符串那段:

L2Position = LEN(MyString的) - (-LPosition LEN(MyString的))

然後用你的Mid函數來找到你的狀態縮寫。

+0

有一個** InStrRev **功能,不需要先倒轉你的字符串。 –

0

根據您的樣本數據,您可以使用拆分

Dim vData 
vData = Split(myString, ".") 
myString = vData(ubound(vdata) - 1) 
0

找到句點(「」)(和存儲中找到的最後2的位置),直到有沒有更多的用而循環INSTR。

現在國家代碼是在過去的2間發現這樣規定:mid(mystring,period1+1, period2-period1-1)