簡體   English   中英

根據不同的字符VBA解析長字符串

[英]Parse long string based with different character VBA

我傷了頭。 我需要解析這樣的長字符串。

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合並,並具有字符“ ::”,其他則具有字符“ |”

決賽桌

這是我的代碼的一部分-工作不正確。 任何建議和改進都受到歡迎和贊賞:)

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

使用VBScript.RegExp來定位車輛的年份,並用可以與其他混亂情況唯一區分開的模式替換現有模式,以使用Split功能 可以使用簡單的Replace函數來處理雙冒號。

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

我提供了RegEx解決方案的替代方案,只需騎行75年可能的汽車就可以了。 雖然有點像“蠻力”,但它可以完成工作,甚至很難以毫秒為單位來衡量兩種方法之間的差異。 在這種情況下,這是可行的,因為可能的年份受到合理限制; RegEx應處理更廣泛的可能性。

regex_car_models

關鍵是認出年份

這是一個“裸”代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM