如何在VBA中提取文件名的一部分?

时间:2015-07-27 23:50:42

标签: string vba parsing solidworks

我需要从文件路径中提取文件名的一部分。 我的宏需要能够处理不同长度的路径/名称,但我想要的文件名的部分始终在同一个地方开始;我需要从文件扩展名的开头和结尾(不包括“。”)中提取刚开始14个字符的文件名部分。

例如,我希望我的宏从以下路径名中提取文本"Fixed Table"

C:\Users\m.jones\Desktop\New folder (2)\LS4102-104-01 Fixed Table.slddrw

修改

我刚试过这个,下面的代码似乎有效。这是一种有效的方法,还是我会遇到问题?

PartNoDes = Mid(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\") + 1)
PartNoDes = Right(PartNoDes, Len(PartNoDes) - 14)
PartNoDes = Left(PartNoDes, Len(PartNoDes) - 7)

4 个答案:

答案 0 :(得分:4)

您可以使用FileSystemObject获取基本文件名(即没有扩展名的文件名),然后使用Mid()提取部分文件名。

Const strFile As String = "C:\Users\m.jones\Desktop\New folder (2)\LS4102-104-01 Fixed Table.slddrw"

With CreateObject("Scripting.FileSystemObject")
    Debug.Print Mid$(.GetBaseName(strFile), 14)    ' => "Fixed Table"
End With

此方法应优先于查找\.的字符串解析,因为文件名可能包含不属于扩展名的句点。

答案 1 :(得分:1)

我建议使用内置函数(例如MID()INSTRREV())而不是创建外部对象来执行您想要的操作。

您发布的“答案”在正确的轨道上 - 虽然您以问题的形式发布了它,但我认为最好将其作为原始问题的编辑。

回答你的回答问题:
方法有效吗? 你会遇到问题吗?对于这个应用程序 - 可能不是。但我建议不要硬编码扩展中的字符数。我没有看到Solidworks很快改变他们的绘图扩展 - 但它是可能的(例如,看看微软:.xls到.xlsx等)并且它限制了你处理其他扩展的能力(例如.Slpdrt,.Sldasm等。)

另外,我会将swDraw.GetPathName转换为变量,以降低在swDraw COM对象上重复调用该函数的开销。

E.g。

Dim FilePath as String
FilePath= swDraw.GetPathName

你可以在一行中做你想做的事:

Mid(FilePath, InStrRev(FilePath, "\") + 14, InStrRev(FilePath, ".") - InStrRev(FilePath, "\") - 14)

测试:

Sub QuickTest()
    Const FilePath= "C:\Users\m.jones\Desktop\New folder (2)\LS4102-104-01 Fixed Table.slddrw"
    MsgBox Mid(FilePath, InStrRev(FilePath, "\") + 14, InStrRev(FilePath, ".") - InStrRev(FilePath, "\") - 14)

End Sub

您可以使用变量更轻松地阅读:

Sub QuickTest()
    Const FilePath= "C:\Users\m.jones\Desktop\New folder (2)\LS4102-104-01 Fixed Table.slddrw"

    Dim MidStart As Long
    MidStart = InStrRev(FilePath, "\") + 14

    Dim MidEnd As Long
    MidEnd = InStrRev(FilePath, ".")

    Dim MyText As String
    MyText = Mid(FilePath, MidStart, MidEnd - MidStart)

    MsgBox MyText
End Sub

答案 2 :(得分:0)

也许这会做你想要的,使用Split然后获取结果数组的一部分,使用ubound确保我们有最后一个斜线和完全停止的实例,这可以消除名称中的完整停止的任何问题或任何级别的目录树:

Sub FileChop()
Dim MyString As String, FileChop As String
'MyString = "C:\Users\m.jones\Desktop\New folder (2)\LS4102-104-01 Fixed Table.slddrw"
MyString = "LS4102-104-01 Mr. Smith.slddrw"
FileChop = Mid(Split(MyString, "\")(UBound(Split(MyString, "\"))), 14, 100) 'Including extension
MsgBox FileChop
FileChop = Left(FileChop, (Len(FileChop) - 1) - Len(Split(FileChop, ".")(UBound(Split(FileChop, "."))))) 'Excluding extension
MsgBox FileChop
End Sub

答案 3 :(得分:0)

我知道这并没有直接回答您的问题,但SolidWorks提供了对使用.NET库的VSTA的访问权限,而后者反过来比VBA强大得多。创建宏时,VB或C#中的VSTA下拉菜单中有一个选项。

在这种情况下,你可以简单地使用

Imports System.IO

Dim PathName as string = Path.GetFilePath(swModelDoc2.GetPathName)
or
Dim PathName as string = Path.GetFileNameWithoutExtension(swModelDoc2.GetPathName)