vba 读取带分隔和非分隔空格的字符串的宏
vba Macro to Read String with delimited and non delimited spaces
我有一个 .txt 文档,其中 table 信息如下
Recipient PanelSize NumberOfAlerts
Michigan Regional 42454 15756
Wellcare 21234 8492
Michigan Patient Care 6789 1056
我正在使用 VBA 宏来读取 .txt 文件并输入到 Excel sheet.
我的问题主要与收件人有关。收件人姓名包含空格,因此使用
vDatavalues = Split(sLine, " ")
像
这样分隔收件人
Michigan| |Patient| |Care|
我不想要。
如何将正在阅读的行拆分为 3 列,从 table 中逐行正确阅读?
编辑:这是我尝试读取和格式化的 .txt 文件的示例 TEST.txt
这个有效:
Dim sLine As String
sLine = "Michigan Patient Care 6789 1056"
'Remove all double spaces
Do While InStr(sLine, " ") <> 0
sLine = Replace(sLine, " ", " ")
Loop
'Split using space delimiters
Dim splitLine() As String
splitLine = Split(sLine, " ")
'Collect recipient pieces
'(i.e. all pieces but the last two, which we know are PanelSize and NumberOfAlerts)
Dim splitRecipient() As String
ReDim splitRecipient(0 To UBound(splitLine) - 2)
Dim i As Long
For i = 0 To UBound(splitRecipient)
splitRecipient(i) = splitLine(i)
Next i
'Join recipient pieces
MsgBox "Recipient: " & Join(splitRecipient, " ") & vbCrLf & _
"PanelSize: " & splitLine(UBound(splitLine) - 1) & vbCrLf & _
"NumberOfAlerts: " & splitLine(UBound(splitLine))
但实际上,如果您的文件是固定宽度格式,列始终具有相同的宽度并用空格填充,那么它会容易得多。在您的示例中,第一列看起来是 30 个字符宽,第二列是 27 个字符。所以在这种情况下,您可以这样做:
Dim sLines() As String
ReDim sLines(1 To 3)
sLines(1) = "Michigan Regional 42454 15756"
sLines(2) = "Wellcare 21234 8492"
sLines(3) = "Michigan Patient Care 6789 1056"
Dim iLine As Long
For iLine = LBound(sLines) To UBound(sLines)
MsgBox "Recipient: " & Trim(Mid(sLines(iLine), 1, 30)) & vbCrLf & _
"PanelSize: " & Trim(Mid(sLines(iLine), 31, 27)) & vbCrLf & _
"NumberOfAlerts: " & Trim(Mid(sLines(iLine), 58))
Next iLine
然后第一行被解析为:
我有一个 .txt 文档,其中 table 信息如下
Recipient PanelSize NumberOfAlerts
Michigan Regional 42454 15756
Wellcare 21234 8492
Michigan Patient Care 6789 1056
我正在使用 VBA 宏来读取 .txt 文件并输入到 Excel sheet.
我的问题主要与收件人有关。收件人姓名包含空格,因此使用
vDatavalues = Split(sLine, " ")
像
这样分隔收件人Michigan| |Patient| |Care|
我不想要。
如何将正在阅读的行拆分为 3 列,从 table 中逐行正确阅读?
编辑:这是我尝试读取和格式化的 .txt 文件的示例 TEST.txt
这个有效:
Dim sLine As String
sLine = "Michigan Patient Care 6789 1056"
'Remove all double spaces
Do While InStr(sLine, " ") <> 0
sLine = Replace(sLine, " ", " ")
Loop
'Split using space delimiters
Dim splitLine() As String
splitLine = Split(sLine, " ")
'Collect recipient pieces
'(i.e. all pieces but the last two, which we know are PanelSize and NumberOfAlerts)
Dim splitRecipient() As String
ReDim splitRecipient(0 To UBound(splitLine) - 2)
Dim i As Long
For i = 0 To UBound(splitRecipient)
splitRecipient(i) = splitLine(i)
Next i
'Join recipient pieces
MsgBox "Recipient: " & Join(splitRecipient, " ") & vbCrLf & _
"PanelSize: " & splitLine(UBound(splitLine) - 1) & vbCrLf & _
"NumberOfAlerts: " & splitLine(UBound(splitLine))
但实际上,如果您的文件是固定宽度格式,列始终具有相同的宽度并用空格填充,那么它会容易得多。在您的示例中,第一列看起来是 30 个字符宽,第二列是 27 个字符。所以在这种情况下,您可以这样做:
Dim sLines() As String
ReDim sLines(1 To 3)
sLines(1) = "Michigan Regional 42454 15756"
sLines(2) = "Wellcare 21234 8492"
sLines(3) = "Michigan Patient Care 6789 1056"
Dim iLine As Long
For iLine = LBound(sLines) To UBound(sLines)
MsgBox "Recipient: " & Trim(Mid(sLines(iLine), 1, 30)) & vbCrLf & _
"PanelSize: " & Trim(Mid(sLines(iLine), 31, 27)) & vbCrLf & _
"NumberOfAlerts: " & Trim(Mid(sLines(iLine), 58))
Next iLine
然后第一行被解析为: