Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-删除动态文件名中的日期_Vba_Excel - Fatal编程技术网

Excel VBA-删除动态文件名中的日期

Excel VBA-删除动态文件名中的日期,vba,excel,Vba,Excel,我是VBA的业余爱好者 我的目标是压缩文件夹与多个文件,我已经设法实现。但是我需要格式化文件名 文件夹中的某些文件可能包含日期作为文件名的前缀或后缀(例如:ddmmyyyyexpense.xlsx或expenseddmyyyy.txt) 我想从文件名中删除日期 注意:我可以有任何文件类型 .xls .xlsx .csv .txt 我尝试在其中一个字符串后面添加通配符,然后 VBtextcompare但它不起作用。因为我喜欢RegExp,所以我会:) 此代码查找八位数字,测试这是否是有效日期,如果

我是VBA的业余爱好者

我的目标是压缩文件夹与多个文件,我已经设法实现。但是我需要格式化文件名

文件夹中的某些文件可能包含日期作为文件名的前缀或后缀(例如:
ddmmyyyyexpense.xlsx
expenseddmyyyy.txt

我想从文件名中删除日期

注意:我可以有任何文件类型

.xls
.xlsx
.csv
.txt

我尝试在其中一个字符串后面添加通配符,然后
VBtextcompare
但它不起作用。

因为我喜欢RegExp,所以我会:)

此代码查找八位数字,测试这是否是有效日期,如果是,则将其删除

如果您有多个可能的日期,或者如果8位数字被其他数字包围,则需要细化

下面的代码将三个示例字符串提供给cleaning函数,它从第一个和第三个字符串中去掉日期,第二个字符串保持原样

Sub TestDate()
Debug.Print CleanStr("01142012expense.xlsx")
Debug.Print CleanStr("421142012expense.xlsx")
Debug.Print CleanStr("expense16042015.xlsx")
End Sub
代码


到目前为止你试过了吗?我只试过拉拉链,但效果很好。我试着比较一下,但没有效果。我不知道该使用什么,也不知道有什么内置函数可以帮助我me@brettdjVBtextcompare不起作用。我甚至尝试在其中一个字符串后面添加通配符。还是不行。请帮我一下,我相信这会奏效的。我现在就试试。不管怎样,如果代码中有2015年4月17日这样的字符串怎么办?我想很好地处理这种情况。当你给出答案时,至少我会尝试复制这个..:)。不要说话。太神了我几个小时的思考过程你很快就完成了。我很好奇。谢谢你,非常感谢。天才!!我没有测试它,但它可能有效。我只想知道你为什么把它分成三部分。由于整个日期都应该删除,所以您最好将模式定义为“\d{8}”,这也会使If语句更容易。除非你想确定它是一个日期,但在这种情况下,正则表达式会非常复杂。@MichaëlBenjaminSaerens这就是为什么我将它分成三部分,用一个简单的ISDATE来测试有效日期(而不是一个复杂的正则表达式)。@brettdj不知为什么我忽略了If语句的这一部分。我的任命。
Function CleanStr(strIn As String) As String
Dim objRegex As Object
Dim objRegMC As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
    .Pattern = "(\d{2})(\d{2})(\d{4})"
    If .test(strIn) Then
        Set objRegMC = .Execute(strIn)
        If IsDate(objRegMC(0).submatches(0) & "/" & objRegMC(0).submatches(1) & "/" & objRegMC(0).submatches(2)) Then
            CleanStr = .Replace(strIn, vbNullString)
        Else
            CleanStr = strIn
        End If
    End If
End With
End Function