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