iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 17
0
自我挑戰組

Access VBA的眉眉角角系列 第 17

Access VBA 的眉眉角角Day17: 一些文字處理的子程式

  • 分享至 

  • xImage
  •  

今天要來分享一些文字處理的子程式,有些東西雖然小,但卻能啟很大的作用。
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方式來處理,較為簡單。

以上的程式分享,希望各位會喜歡。


上一篇
Access VBA 的眉眉角角Day16: 匯入外部資料庫以AS/400為例
下一篇
Access VBA 的眉眉角角Day18: 將數字金額轉成文字金額
系列文
Access VBA的眉眉角角30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言