String VBA未定义的字符串结构

String VBA未定义的字符串结构,string,vba,delimiter,String,Vba,Delimiter,我试图在代码中编写一个函数,允许我根据文件名搜索特定文件。该函数正在工作,但现在名称的结构发生了变化,给我带来了麻烦 我的代码以宏的形式控制word文档。此文档从另一个程序获取信息,并将其放入word文档的formfields中。 然后,我的代码获取formfields的“值”,并使用它们搜索特定文件夹中的.txt文件,该文件的名称与formfields中存储的值匹配 现在.txt的名称已经更改,该名称将包含一些额外的信息,我无法通过word文档访问这些信息 例如: W_X_Y_Z.txt 其中

我试图在代码中编写一个函数,允许我根据文件名搜索特定文件。该函数正在工作,但现在名称的结构发生了变化,给我带来了麻烦

我的代码以宏的形式控制word文档。此文档从另一个程序获取信息,并将其放入word文档的formfields中。 然后,我的代码获取formfields的“值”,并使用它们搜索特定文件夹中的.txt文件,该文件的名称与formfields中存储的值匹配

现在.txt的名称已经更改,该名称将包含一些额外的信息,我无法通过word文档访问这些信息

例如: W_X_Y_Z.txt 其中Y和Z在文档的表单字段中可用,可以访问,但W和X我不知道

需要解决的问题: 所以我需要做的是找到一种忽略W和X的方法,只基于Y和Z进行搜索

想法: 我的一个想法是搜索具有以下结构的文件 ???uuuuy_Z.txt,但我不确定它将如何工作,因为在“”中,如果它在字符串中,是否包含数字?“?”是否仅表示2个未知字符或任何数量?如果只有两种方法可以定义一个未知字符串,其中字符和字符数都是未知的

第二个想法是在
\uu
上使用分隔符,并以某种方式找出如何告诉宏如何忽略第二个
\u
之后的所有内容

欢迎提出任何想法或建议进行调查

多谢各位


我现在将尝试添加一些代码,但请记住,我在本文档中继承了很多代码,因此我不知道每个细节都做了什么,这就是我避免键入代码的原因

截至目前的代码:

ActiveDocument.FormFields("Remissnummer").Select
Remiss = Selection.Text
Selection.Collapse Direction:=wdCollapseStart

ActiveDocument.FormFields("Personid").Select
strTmpPersonnr = Selection.Text
intNumCharsPersNr = Len(strTmpPersonnr)
Selection.Collapse Direction:=wdCollapseStart

strFileName = strTmpPersonnr
p_strFileReportPath = "G:\HMC\Fysiologiska kliniken\Eko\Export\"
strImportFile = p_strFileReportPath & "*" & strFileName & "_" & Remiss & strFileExt

If Len(Dir$(strImportFile)) = 0 Then
MsgBox "Error"
Else
'starts importing values from the file
当文件名具有已知结构(即只有Y_Z.txt)时,此方法有效 现在,尽管结构已经改变,正如我上面解释的,这两个新变量是未知的,可以是从字母到数字的任何东西

我试过:

Ignore = "*"

strImportFile = p_strFileReportPath & Ignore & "_" & Ignore & "_" & strFileName & "_" & Remiss & strFileExt
但它只是冻结了,当进入任务管理器时,你们可以看到越来越多的内存被分配给了word。。。10分钟后我停止了


所以我猜我不能用“*”来解释文件名的未知部分,但我现在有点不知所措了。

看起来你可以使用正则表达式。只需浏览regexvba并熟悉其概念。使用它,您可以为任何常规模式创建查找查询


在这里,您可以看到AFAIK上的一些示例。在VBA中,有两种方法可用于迭代文件:

  • 功能,或
  • 中的和
如果您使用的是文件系统对象,则可以使用以下任意一种方法对每个文件进行迭代并验证文件名:

  • VBA字符串函数,如和
  • VBA运算符,与模式匹配字符串进行比较
  • 正则表达式
如果您正在使用Dir(每次调用Dir时不带参数以获取下一个文件名),那么除了前面的方法外,您还可以将文件名模式传递给函数2,它将只返回与模式匹配的结果

无论您是使用Like运算符还是将模式传递给Dir函数,模式中的
匹配任何单个字符,而
*
匹配任意数量的字符:

  • “ab?d”
    匹配
    “abcd”
    “abgd”
    ,但不匹配
    “abcgd”
  • “ab*d”
    匹配
    “abcd”
    “abgd”
    “abcgd”
有关在VBA中使用正则表达式的详细信息,请参见


一,。仅在Windows上,因为Macintosh上的Office不支持ActiveX/COM自动化的使用。

2.仅在Windows上。在Macintosh上,
*
是有效的文件名字符,因此不能用于通配符。

总是有助于发布现有代码…我知道,对不起,我认为我解释的方式已经足够了,因为问题不太基于编码,而是缺乏VBA函数的知识,由于导入正在工作,唯一缺少的是找到您不知道其完整名称的内容的方法。调整一行现有代码要比在我们不知道您的代码是如何构造的情况下尝试提出建议容易得多。在这里发布你的代码也能让人们知道他们的回答应该在什么级别。啊,好吧,这样我就可以使用“*”定义两个等于*的伪变量,然后搜索fake_fake_Y_Z.txt?其中fake=*@Grahagblah我猜您可以搜索字符串表达式
“*.+Y+“.+Z+”.txt”
,其中
Y
Z
包含表单字段中的值。但是如果没有看到一些代码,很难确定。我会试试这个,看看它是否有效。感谢您的帮助,并对问题的性质表示抱歉。请解释一下@Zev的评论:您可以编译搜索模式并测试Windows资源管理器是否只列出所需的文件。一旦有了正确的格式,就可以继续编程了。我更喜欢
Dir
而不是
FileSystemObject
RegEx
(因为它们要复杂得多),请参见此处的示例:@AcsErno可以按照您的建议执行,但我的评论的意思是,此字符串格式可以与VBA
Like
运算符一起使用,或传递到
Dir
函数中。