String 基于不同字符VBA解析长字符串
我的头骨折了。我需要像那样解析长字符串String 基于不同字符VBA解析长字符串,string,vba,excel,split,substring,String,Vba,Excel,Split,Substring,我的头骨折了。我需要像那样解析长字符串 2003|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC V8 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2003|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2001|Jaguar|S-Type|B
2003|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC V8 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2003|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2001|Jaguar|S-Type|Base Sedan 4-Door|4.0L 3996CC 244Cu. In. V8 GAS DOHC Naturally Aspirated::To VIN # N52047 2001|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::To VIN # N52047 2002|Ford|Thunderbird 2002|Lincoln|LS 2002|Jaguar|S-Type|Base Sedan 4-Door|4.0L 3996CC 244Cu. In. V8 GAS DOHC Naturally Aspirated::To VIN # N52047 2000|Jaguar|S-Type|Base Sedan 4-Door|4.0L 3996CC 244Cu. In. V8 GAS DOHC Naturally Aspirated::To VIN # N52047 2002|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::To VIN # N52047 2000|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::To VIN # N52047 2000|Lincoln|LS 2003|Lincoln|LS 2001|Lincoln|LS 2003|Ford|Thunderbird 2004|Lincoln|LS 2004|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC V8 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2004|Ford|Thunderbird 2005|Jaguar|S-Type|Sport Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::Base / Sport To VIN # N52047 2005|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::Base / Sport To VIN # N52047 2005|Lincoln|LS 2004|Jaguar|XJ8 2005|Jaguar|S-Type|Sport Sedan 4-Door|4.2L 4196CC V8 GAS DOHC Naturally Aspirated::Base / Sport To VIN # N52047 2006|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::Base / VDP Edition To VIN # N52047 2006|Jaguar|S-Type|VDP Edition Sedan 4-Door|4.2L 4196CC V8 GAS DOHC Naturally Aspirated::Base / VDP Edition To VIN # N52047 2005|Jaguar|XJ8 2004|Jaguar|S-Type|Base Sedan 4-Door|3.0L 183Cu. In. V6 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2006|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC V8 GAS DOHC Naturally Aspirated::Base / VDP Edition To VIN # N52047 2005|Ford|Thunderbird 2006|Lincoln|LS 2000|Jaguar|S-Type|Sport Sedan 4-Door|4.0L 3996CC 244Cu. In. V8 GAS DOHC Naturally Aspirated::To VIN # N52047 2002|Jaguar|S-Type|Sport Sedan 4-Door|4.0L 3996CC 244Cu. In. V8 GAS DOHC Naturally Aspirated::To VIN # N52047 2001|Jaguar|S-Type|Sport Sedan 4-Door|4.0L 3996CC 244Cu. In. V8 GAS DOHC Naturally Aspirated::To VIN # N52047 2002|Jaguar|S-Type|Base Sedan 4-Door|3.0L 2967CC 181Cu. In. V6 GAS DOHC Naturally Aspirated::To VIN # N52047 2005|Jaguar|S-Type|Sport Sedan 4-Door|3.0L 2967CC 181Cu. In. V6 GAS DOHC Naturally Aspirated::Base / Sport To VIN # N52047 2005|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC 256Cu. In. V8 GAS DOHC Naturally Aspirated::Base / Sport To VIN # N52047 2004|Jaguar|S-Type|Base Sedan 4-Door|3.0L 2967CC 181Cu. In. V6 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2003|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC 256Cu. In. V8 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2006|Jaguar|S-Type|Base Sedan 4-Door|3.0L 2967CC 181Cu. In. V6 GAS DOHC Naturally Aspirated::Base / VDP Edition To VIN # N52047 2004|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC 256Cu. In. V8 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2005|Jaguar|S-Type|Sport Sedan 4-Door|4.2L 4196CC 256Cu. In. V8 GAS DOHC Naturally Aspirated::Base / Sport To VIN # N52047 2005|Jaguar|S-Type|Base Sedan 4-Door|3.0L 2967CC 181Cu. In. V6 GAS DOHC Naturally Aspirated::Base / Sport To VIN # N52047 2001|Jaguar|S-Type|Base Sedan 4-Door|3.0L 2967CC 181Cu. In. V6 GAS DOHC Naturally Aspirated::To VIN # N52047 2003|Jaguar|S-Type|Base Sedan 4-Door|3.0L 2967CC 181Cu. In. V6 GAS DOHC Naturally Aspirated::Base To VIN # N52047 2006|Jaguar|S-Type|Base Sedan 4-Door|4.2L 4196CC 256Cu. In. V8 GAS DOHC Naturally Aspirated::Base / VDP Edition To VIN # N52047
我知道我的最终表格有6列
3-(年份、品牌、型号)是必需的
3-(配平、发动机、注释)是可选的
值引擎与Notes合并,并具有字符“:”
其他人有“|”字
这是我的代码的一部分——它工作错误。欢迎并感谢任何建议和改进:)
使用VBScript.RegExp来定位车辆的年份,并将现有的模式替换为可以唯一区别于其他杂波的模式,以便在车辆上使用。双冒号可以用简单的方法处理 我已经提供了一个替代正则表达式解决方案的方法,只需在75年的汽车中循环。虽然有点“蛮力”,但它完成了任务,甚至很难在毫秒内测量两种方法之间的差异。在这种情况下,这是可行的,因为可能的年份是合理有限的;更大范围的可能性应由正则表达式处理
关键是识别年份 这是一个“裸”代码
选项显式
子语法分析字符串()
Dim-Ret作为变体
我想我会坚持多久
变暗rng As范围
设置rng=ThisWorkbook.Worksheets(“parse”).Cells(1,1)”每个记录用哪个字符分隔?CR?如果?CRLF?几个-“|”、“::”和“空格”。如果是1个字符,就很容易了。这些是分隔字段的字符。我可以在屏幕截图上看到换行符,但它不存在于您的代码或示例中。:Base To VIN#N52047 2003
字符串的一部分。许多“空间”你是如何决定突破价值的?我想你必须这样做。首先查找“|”,将其保存在变量中。然后循环:找到前三个“|”来分隔3个字段,然后找到“:::”到第5个字段,然后再找到“|”-到第6个字段和下一排。通过删除变量中的最后四个字符来打断最后一个字符。保存最后一个字符,但不包含最后4个字符。和行号。转到循环的开始请记住第一个值是variableGreat:))非常感谢。我很感激。
Dim Ret
Dim Ret2
Dim strColumnA As String
strColumnA = wsTestComp.Range("A1")
Ret = Split(strColumnA, "|")
j = 1
k = 1
For i = LBound(Ret) To UBound(Ret)
Debug.Print Ret(i)
If IsNumeric(Ret(i)) Then
wsTestComp.Range("A2").Offset(k, j).value = Ret(i)
j = j + 1
Else
If IsNumeric(Right(Ret(i), 4)) Then
Ret2 = Split(Ret(i), "::")
For h = LBound(Ret2) To UBound(Ret2)
If IsNumeric(Right(Ret(i), 4)) Then
wsTestComp.Range("A2").Offset(k, j).value = Left(Ret2(h), Len(Ret2(h)) - 5)
Else
wsTestComp.Range("A2").Offset(k, j).value = Ret2(h)
j = j + 1
End If
Next h
k = k + 1
Else
wsTestComp.Range("A2").Offset(k, j).value = Ret(i)
j = j + 1
End If
End If
Next i
Sub makeCars()
Dim tmp As String, y As Long, bUSE_REGEX As Boolean
Dim pattern As String, replacement As String
Dim rgx As Object, cmat As Object
Dim v1 As Variant, v2 As Variant
bUSE_REGEX = True
With Worksheets("Sheet1")
tmp = .Range("A1").Value2
tmp = Replace(tmp, Chr(58) & Chr(58), Chr(124))
tmp = Replace(tmp, Chr(124), Chr(167))
End With
If bUSE_REGEX Then
'REGEX method
Set rgx = CreateObject("VBScript.RegExp")
With rgx
.Global = True
.pattern = "\s[0-9]{4}\§"
Set cmat = .Execute(tmp)
For y = 0 To cmat.Count - 1
replacement = Replace(cmat(y), Chr(32), Chr(182))
tmp = Replace(tmp, cmat(y), replacement)
Next y
End With
Else
'non-REGEX method
For y = 1950 To 2025
tmp = Replace(tmp, Chr(32) & y & Chr(167), Chr(182) & y & Chr(167))
Next y
End If
With Worksheets("Sheet1")
v1 = Split(tmp, Chr(182))
For y = LBound(v1) To UBound(v1)
v2 = Split(v1(y), Chr(167))
.Cells(y + 2, 1).Resize(1, UBound(v2) + 1) = v2
Next y
End With
End Sub
Option Explicit
Sub parsestring()
Dim Ret As Variant
Dim i As Long
Dim rng As Range
Set rng = ThisWorkbook.Worksheets("parse").Cells(1, 1) '<== cell with the string to parse
Ret = Split(Replace(Replace(rng.Value, "|", " |"), "::", " |"), " ")
For i = LBound(Ret) To UBound(Ret)
If Ret(i) Like "####" Then Ret(i) = "§§" & Ret(i)
Next i
Ret = Split(Join(Ret), "§§")
With rng.Offset(2, 2) '<== the "database" will be placed two rows and columns away from the cell with the string to parse
.Resize(UBound(Ret) + 1) = WorksheetFunction.Transpose(Ret)
.Resize(UBound(Ret) + 1).TextToColumns Destination:=.Cells(1, 1), DataType:=xlDelimited, Other:=True, OtherChar:="|"
.CurrentRegion.EntireColumn.AutoFit
End With
End Sub
Sub parsestring2()
Dim Ret As Variant
Dim i As Long
Dim rng As Range
Set rng = ThisWorkbook.Worksheets("parse").Cells(1, 1) '<== cell with the string to parse
Ret = Split(Replace(Replace(rng.Value, "|", " |"), "::", " |"), " ")
For i = LBound(Ret) To UBound(Ret)
If Ret(i) Like "####" Then Ret(i) = "§§" & Ret(i)
Next i
Ret = Split(Join(Ret), "§§")
With rng.Offset(2, 2) '<== the "database" will be placed two rows and columns away from the cell with the string to parse
.Resize(UBound(Ret) + 1) = WorksheetFunction.Transpose(Ret)
.Resize(UBound(Ret) + 1).TextToColumns Destination:=.Cells(1, 1), DataType:=xlDelimited, Other:=True, OtherChar:="|"
With .Resize(1, 6)
.Value = Array("Year", "Make", "Model", "Trim", "Engine", "Notes")
.Interior.ColorIndex = 16
.Font.ColorIndex = 2
End With
.CurrentRegion.Sort key1:="Year", order1:=xlDescending, key2:="Make", order2:=xlAscending, key3:="Model", order3:=xlAscending, header:=xlYes
.CurrentRegion.EntireColumn.AutoFit
End With
End Sub