今天要來分享一些文字處理的子程式,有些東西雖然小,但卻能啟很大的作用。
Day4時,我們已經有介紹過RegEx(正規表達式)的處理方法,這裡我們就不再提這一塊,我們依照一些特定的需求,撰寫了一些子程式來處理資料,以下介紹:
替換多個空白字元變成一個空白字元:
Function ReplaceMutilSpace(strString As String) As String
'將不定長度的空格變成一格長度的空格
Do
strString = Replace(strString, " ", " ")
Loop Until InStr(strString, " ") = 0
ReplaceMutilSpace = strString
End Function
以上程式只要塞入字串變數進去後,就會吐出字串變數出來,吐出來的資料,會把不定長度的空格變成一格長度的空格。其處理方式為把兩格空格變成一格空格,而且反覆處理,直到沒有兩格空格的情況出現,這樣就達到我們需要的效果。
轉換Excel資料的換行符號改為Access可接受的換行符號:
Function Lf2CrLf(strData As String) As String
'轉換Excel資料的換行符號改為Access可接受的換行符號
strTemp = Replace(strData, vbCrLf, "!!@@##$$!!!!@@##$$!!")
If InStr(strTemp, vbLf) > 0 Then
strTemp = Replace(strTemp, vbLf, vbCrLf)
strTemp = Replace(strTemp, "!!@@##$$!!!!@@##$$!!", vbCrLf)
End If
Lf2CrLf = strTemp
End Function
當資料由Excel複製到Access的文字方塊時,如果Excel儲存格內的資料有包含換行資料的,到Access的文字方塊時顯示會變成沒有換行效果,因為Excel的儲存格換行,是用LF字元換行,而Access的文字方塊,則用CRLF兩個字元,因此,以上程式的作法,先將CRLF兩個換行字元改成很少出現的字串,然後再把LF換行字元變更成CRLF字元,然後再把剛剛變更成很少出現的字串的換行字元改回CRLF字元,這樣就可以正常顯示。
將字串日期(YYYYMMDD)變更為日期類型:
Function String2Date(strDate As String, Optional bnAutoFix As Boolean = False) As Date
'將字串日期(YYYYMMDD)變更為日期類型
If Len(strDate) <> 8 Or IsNumeric(strDate) = False Then Exit Function
'日期有問題時,bnAutoFix = True將進行檢查
If IsDate(Mid(strDate, 1, 4) & "/" & Mid(strDate, 5, 2) & "/" & Mid(strDate, 7, 2)) = False Then
If bnAutoFix = True Then
'如果輸入月份為2月,但日期超過28,將日期改為28
If Mid(strDate, 5, 2) = "02" And Mid(strDate, 7, 2) > 28 Then
String2Date = DateAdd("d", -1, CDate(Mid(strDate, 1, 4) & "/03/01"))
Exit Function
ElseIf InStr(",04,06,09,11,", Mid(strDate, 5, 2)) > 0 And Mid(strDate, 7, 2) > 30 Then
If IsDate(Mid(strDate, 1, 4) & "/" & Mid(strDate, 5, 2) & "/30") = True Then
String2Date = CDate(Mid(strDate, 1, 4) & "/" & Mid(strDate, 5, 2) & "/30")
Exit Function
Else
Exit Function
End If
End If
Else
Exit Function
End If
End If
String2Date = CDate(Mid(strDate, 1, 4) & "/" & Mid(strDate, 5, 2) & "/" & Mid(strDate, 7, 2))
End Function
將日期類型變更為字串日期(YYYYMMDD):
Function Date2String(dateDate As Date) As String
'將日期類型變更為字串日期(YYYYMMDD)
Date2String = Format(dateDate, "YYYYMMDD")
End Function
測試程式:
Sub String2Date與Date2String測試()
Debug.Print String2Date("20160228", True)
Debug.Print String2Date("20160229", True)
Debug.Print String2Date("20160230", True) '打錯日期測試
Debug.Print String2Date("20160431", True) '打錯日期測試
Debug.Print String2Date("20160631", True) '打錯日期測試
Debug.Print String2Date("20160931", True) '打錯日期測試
Debug.Print String2Date("20161131", True) '打錯日期測試
Debug.Print String2Date("20161131") '打錯日期測試,無修正
Debug.Print Date2String(Now)
End Sub
也許您常會發現,有很多資料庫儲存日期,都是用文字儲存,而非日期的資料來儲存,就資料庫觀點,使用文字儲存後,處理速度會比日期的快上許多,原因是不用再由數字換算成日期,因為表面上看起來是日期,但實際儲存在資料庫內的,則是一串數字,例如「2016/12/31」,實際儲存在資料庫的內容為「42735」但因為欄位類型為DateTime,所以顯示出來時,會是我們常看到的日期,因此有時要取用這些文字狀態的日期進行處理,還是要一道轉換程序,這裡我就寫了兩個小程式來處理。
String2Date的程序,我有弄了一個自動修正的功能,讓最後一天日期打錯的資料可以正常顯示出來,例如2016年4月30號打成4月31號,儲存成文字為「20160431」,但轉換後,可帶出「2016/4/30」。
Date2String的部份,則是使用Format方式來處理,較為簡單。
以上的程式分享,希望各位會喜歡。