InStr 函数 VBA: 将文件名与文本对象进行比较时遇到问题
InStr function VBA: trouble comparing file name with text object
一般背景:
我正在尝试遍历 Word 文档中的文本行,其中每一行都是一个唯一的示例名称(例如 Sample1、Sample2, Sample3),然后插入文件名中包含样本名称的特定文件夹中的图像(例如 Sample1 a.png, 示例 1 b.png、示例 2 xyz.png、示例 3 xxx.png ).
我使用的代码示例:
Dim fso As New FileSystemObject
Set MySource = fso.GetFolder("C:\Test\")
numParas = ActiveDocument.Paragraphs.Count
counter = 0
While counter < numParas
counter = counter + 1
sampleName = ActiveDocument.Paragraphs(counter).Range.Text
For Each File In MySource.Files
If InStr(File.Name, sampleName) > 0 Then
' Insert script here to insert pictures
MsgBox ("File found")
End If
Next File
Wend
问题/问题:
当我使用 sampleName(一个 Range.Text 对象)File.Name 时,我无法让 InStr
工作。
但是,如果我使用 If InStr(File.Name, "Sample1") > 0 Then
而不是 If InStr(File.Name, sampleName) > 0 Then
,它确实有效;虽然这不允许我遍历许多示例名称。
从文件夹添加文件的其他选项:
此线程 (Loop through files in a folder using VBA?) 展示了循环访问文件夹中文件的更快捷方式。我尝试使用 Dir
和以下代码:
Dim StrFile As String
Dim FolderStr As String
numParas = ActiveDocument.Paragraphs.Count
counter = 0
While counter < numParas
counter = counter + 1
sampleName = ActiveDocument.Paragraphs(counter).Range.Text
FolderStr = "C:\Test\*" + sampleName + "*.png"
MsgBox (FolderStr) 'First message box
StrFile = Dir("C:\Test\*" + sampleName + "*.png")
Do While Len(StrFile) > 0
' Insert script here to insert pictures
MsgBox ("File found")
StrFile = Dir
Loop
Wend
Questions/problems:
- 我无法迭代创建 Dir 对象,因为我无法将
sampleName
文本对象与字符串连接起来。
例如,在上面脚本的第一个消息框中,我得到以下输出,文件地址在两个单独的行而不是一个字符串上。
C:\Test\*Sample1
*.png
感谢您提供的任何帮助!
当您使用 inStr
比较两个项目 File.Name
和 sampleName
时,您会忘记 Samplename
是来自包含 paragraph ending mark
的段落的文本。您需要以任何方式剪切最后一个字符,例如:
sampleName = ActiveDocument.Paragraphs(counter).Range.Text
sampleName = Left(sampleName, Len(sampleName) - 1) 'this new line removes paragraph ending mark
一般背景:
我正在尝试遍历 Word 文档中的文本行,其中每一行都是一个唯一的示例名称(例如 Sample1、Sample2, Sample3),然后插入文件名中包含样本名称的特定文件夹中的图像(例如 Sample1 a.png, 示例 1 b.png、示例 2 xyz.png、示例 3 xxx.png ).
我使用的代码示例:
Dim fso As New FileSystemObject
Set MySource = fso.GetFolder("C:\Test\")
numParas = ActiveDocument.Paragraphs.Count
counter = 0
While counter < numParas
counter = counter + 1
sampleName = ActiveDocument.Paragraphs(counter).Range.Text
For Each File In MySource.Files
If InStr(File.Name, sampleName) > 0 Then
' Insert script here to insert pictures
MsgBox ("File found")
End If
Next File
Wend
问题/问题:
当我使用 sampleName(一个 Range.Text 对象)File.Name 时,我无法让
InStr
工作。但是,如果我使用
If InStr(File.Name, "Sample1") > 0 Then
而不是If InStr(File.Name, sampleName) > 0 Then
,它确实有效;虽然这不允许我遍历许多示例名称。
从文件夹添加文件的其他选项:
此线程 (Loop through files in a folder using VBA?) 展示了循环访问文件夹中文件的更快捷方式。我尝试使用 Dir
和以下代码:
Dim StrFile As String
Dim FolderStr As String
numParas = ActiveDocument.Paragraphs.Count
counter = 0
While counter < numParas
counter = counter + 1
sampleName = ActiveDocument.Paragraphs(counter).Range.Text
FolderStr = "C:\Test\*" + sampleName + "*.png"
MsgBox (FolderStr) 'First message box
StrFile = Dir("C:\Test\*" + sampleName + "*.png")
Do While Len(StrFile) > 0
' Insert script here to insert pictures
MsgBox ("File found")
StrFile = Dir
Loop
Wend
Questions/problems:
- 我无法迭代创建 Dir 对象,因为我无法将
sampleName
文本对象与字符串连接起来。
例如,在上面脚本的第一个消息框中,我得到以下输出,文件地址在两个单独的行而不是一个字符串上。
C:\Test\*Sample1
*.png
感谢您提供的任何帮助!
当您使用 inStr
比较两个项目 File.Name
和 sampleName
时,您会忘记 Samplename
是来自包含 paragraph ending mark
的段落的文本。您需要以任何方式剪切最后一个字符,例如:
sampleName = ActiveDocument.Paragraphs(counter).Range.Text
sampleName = Left(sampleName, Len(sampleName) - 1) 'this new line removes paragraph ending mark