请参阅底部以获取从答案中使用的替换代码。使用VBA从文件名中提取可变长度字符串
我正在处理一个电子表格,它从目录中的文件列表中提取名称。这些文件被命名为John Doe 01011980.xlsx
和Janey B Deer 02031983.xlsx
,因此名字和姓氏的长度可变,可以但不总是包含中间首字母,然后是简化的出生日期。这是我目前使用的代码(不起作用)将文件名称中的名称排序。
Private Sub nextname_Click()
Dim strDir As String, first As String, last As String, dateofbirth As String, check As String
strDir = Worksheets("Sheet1").Range("A1").Text
strDir = Dir
If strDir = "" Then
Unload Me
MsgBox ("I couldn't find any other client files by that name.")
Exit Sub
End If
check = Left(strDir, InStr(1, strDir, ".xlsx", vbTextCompare) - 10)
''THE ISSUE IS CONTAINED HEREIN
If InStr(1, check, " * ", vbTextCompare) > 0 Then
first = Trim(Left(check, Len(check) - InStr(1, check, " ", vbTextCompare) - 2))
last = Trim(Right(check, Len(check) - InStr(1, check, " ", vbTextCompare) - 2))
Else
first = Trim(Left(check, Len(check) - InStr(1, check, " ", vbTextCompare)))
last = Trim(Right(check, Len(check) - InStr(1, check, " ", vbTextCompare)))
End If
''END ISSUE
dateofbirth = mid(strDir, Len(strDir) - 12, 2) & "/" & mid(strDir, Len(strDir) - 10, 2) & "/" & mid(strDir, Len(strDir) - 8, 4)
Worksheets("Sheet1").Range("A1") = "C:\filepath\" & strDir
reviewNameUserform.first_Text.Text = first
reviewNameUserform.last_Text.Text = last
reviewNameUserform.dob_Text.Text = dateofbirth
如上面标明是在拉出第一和最后一个名字的文件名,最特别是当有一个中间的初始问题。目前,它仅使用Else
语句来显示John
和Doe
或Janey B
和B Deer
,当我想它来检测是否有中间初始,然后拉出John
和Doe
或Janey
和Deer
。我用Left
,Right
,Mid
和InStr
摆弄了很多,无济于事。
替换
check = Left(strDir, InStr(1, strDir, ".xlsx", vbTextCompare) - 10)
''THE ISSUE IS CONTAINED HEREIN
If InStr(1, check, " * ", vbTextCompare) > 0 Then
first = Trim(Left(check, Len(check) - InStr(1, check, " ", vbTextCompare) - 2))
last = Trim(Right(check, Len(check) - InStr(1, check, " ", vbTextCompare) - 2))
Else
first = Trim(Left(check, Len(check) - InStr(1, check, " ", vbTextCompare)))
last = Trim(Right(check, Len(check) - InStr(1, check, " ", vbTextCompare)))
End If
''END ISSUE
dateofbirth = mid(strDir, Len(strDir) - 12, 2) & "/" & mid(strDir, Len(strDir) - 10, 2) & "/" & mid(strDir, Len(strDir) - 8, 4)
与
If InStr(filename, ".xlsx") = 0 Then
MsgBox ("There is no file with that extension.")
'Possibly include code to check for .xlsm or other extensions.
Exit Sub
ElseIf (Len(filename) - Len(Replace(filename, " ", ""))) < 2 Then
MsgBox ("File name format does not match expected format. File name format is FIRST M LAST mmddyyyy.xlsx")
'Possibly include code to check for misnamed files.
Exit Sub
Else
filename = strDir
filename = mid(filename, 1, InStr(filename, ".xlsx") - 1)
dateofbirth = mid(filename, InStrRev(filename, " ") + 1)
filename = mid(filename, 1, InStrRev(filename, " ") - 1)
first = mid(filename, 1, InStr(filename, " ") - 1)
filename = mid(filename, InStr(filename, " ") + 1)
last = mid(filename, InStrRev(filename, " ") + 1)
middlename = Trim(mid(filename, 1, InStr(filename, " ")))
End If
dateofbirth = mid(dateofbirth, 1, 2) & "/" & mid(dateofbirth, 3, 2) & "/" & mid(dateofbirth, 5, 4)
'Preserved for later use.
'namesData = Split(Replace(strDir, ".xlsx", ""), " ")
'first = namesData(0)
'If UBound(namesData) = 3 Then
' middlename = namesData(1)
' last = namesData(2)
' dateofbirth = namesData(3)
'ElseIf UBound(namesData) = 2 Then
' last = namesData(1)
' dateofbirth = namesData(2)
'End If
,并添加
reviewNameUserform.middle_Text.Text = middlename
不要''通过space' split'然后测试数的每个元素的第一个字符。在那之前使用所有元素。 – findwindow