2

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

4 回答 4

4

您可以使用 aFileSystemObject获取基本文件名(即不带扩展名的文件名),然后使用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

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

于 2015-07-28T00:04:09.687 回答
1

我建议使用内置函数(例如MID()INSTRREV())而不是创建外部对象来做你想做的事。

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


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

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

例如

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
于 2015-08-27T19:09:26.700 回答
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)
于 2015-07-29T12:50:56.427 回答
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
于 2015-07-28T00:22:51.320 回答