VBA代码正在拾取未调出的列

时间:2018-05-07 18:04:18

标签: regex excel-vba vba excel

Sub UpdateDMDCLCSIM()

Dim SIM_DM_DCLC As Worksheet
Dim TextFileUpdated As Date

Set SIM_DM_DCLC = ThisWorkbook.Sheets(Sheet52.Name)

TextFileUpdated = DateValue(FileDateTime("\\networkshare\dept\DCGSI\Extracts\SIM_DM_DCLC.csv"))

Application.DisplayAlerts = False

    Application.StatusBar = "Importing latest DM DCLC SIM Data..."


    With SIM_DM_DCLC.QueryTables.Add(Connection:= _
            "TEXT;\\networkshare\dept\DCGSI\Extracts\SIM_DM_DCLC.csv" _
            , Destination:=SIM_DM_DCLC.Range("$A$1"))
            .Name = "SIM_DM_DCLC"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 936
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
    End With


    'Change to MySQL date format.
    SIM_DM_DCLC.Range("I:K", "P:T").Replace Chr(84), " "
    SIM_DM_DCLC.Range("I:K", "P:T").Replace Chr(90), ""
    SIM_DM_DCLC.Range("I:K", "P:T").NumberFormat = "yyyy-mm-dd hh:mm:ss"

好的,这样就会打开一个下载到网络共享的csv并修复一些日期。原始文件中的日期格式为YYYY-MM-DDTHH:MM:SSZ,这应该从相应列中的那些日期中删除T和Z.我遇到的问题是,由于一些奇怪的原因,它正在处理文件中的列L,我无法弄清楚原因。

所以我在VBA中查找了一些代码用于regex替换,并尝试重构代码以使用以下代码来尝试解决问题:

Sub UpdateDMDCLCSIM()

On Error GoTo ErrorHandler

    Dim SIM_DM_DCLC As Worksheet
    Dim TextFileUpdated As Date

    Set SIM_DM_DCLC = ThisWorkbook.Sheets(Sheet52.Name)

    TextFileUpdated = DateValue(FileDateTime("\\networksharem\dept\DCGSI\Extracts\SIM_DM_DCLC.csv"))

    Application.DisplayAlerts = False

        Application.StatusBar = "Importing latest DM DCLC SIM Data..."


        With SIM_DM_DCLC.QueryTables.Add(Connection:= _
                "TEXT;\\networkshare\dept\DCGSI\Extracts\SIM_DM_DCLC.csv" _
                , Destination:=SIM_DM_DCLC.Range("$A$1"))
                .Name = "SIM_DM_DCLC"
                .FieldNames = True
                .RowNumbers = False
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .RefreshStyle = xlInsertDeleteCells
                .SavePassword = False
                .SaveData = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .TextFilePromptOnRefresh = False
                .TextFilePlatform = 936
                .TextFileStartRow = 1
                .TextFileParseType = xlDelimited
                .TextFileTextQualifier = xlTextQualifierDoubleQuote
                .TextFileConsecutiveDelimiter = False
                .TextFileTabDelimiter = True
                .TextFileSemicolonDelimiter = False
                .TextFileCommaDelimiter = True
                .TextFileSpaceDelimiter = False
                .TextFileTrailingMinusNumbers = True
                .Refresh BackgroundQuery:=False
        End With

        'Change to MySQL date format.
         Set regex = CreateObject("VBScript.RegExp")
         regex.Pattern = "/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z)$/"

         For Each cell In SIM_DM_DCLC.UsedRange
              If cell.Value <> "" Then cell.Value = regex.Replace(cell.Value, "/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/")
         Next cell

很确定5017 - 我在regex.Replace上获得的应用程序定义或对象定义的错误意味着我的正则表达式有问题。只是不确定它是什么。

1 个答案:

答案 0 :(得分:0)

嗯,你必须检查一个实际的匹配,而不只是一个空白;这是更新和适当的代码部分。

'Change to MySQL date format.
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z)$"

For Each cell In SIM_DM_DCLC.UsedRange
    If cell.Value = regex.Pattern Then cell.Value = regex.Replace(cell.Value, "^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$")
Next cell