1

Excel の Text-to-columns のように、単一の列を複数に分割する必要があります。ただし、小さな課題があります。従来の区切り文字は機能しません。以下の文字列を考えてみましょう

Original: Domain\Domain Admins Domain2\User Group Domain3\Developers .....(And so on)
Required: Domain\Domain Admins | Domain2\User Group | Domain3\Developers .....(And so on)

必要な文字列のパイプは、ここで分割し、文字列の長さに応じて次の列にコピーする必要があることを意味します。

列 A に 506 行のリストがあります。次の式を使用して、列 B の "\" の発生を確認しました。カウント範囲は 0 ~ 66 です。

=LEN(A2)-LEN(SUBSTITUTE(A2,"\",""))

次のロジックをコーディングするのに助けが必要です

  1. 文字列で「\」を検索
  2. 「\」の直前のスペースを見つけて分割します

次のコードを使用しましたが、目的を果たしません

Range("A1:A506").Select
Selection.TextToColumns 

ポイント1と2を念頭に置いたコードを手伝ってください。

4

1 に答える 1

0

ここに使用できる機能があります。コメントとコードは一目瞭然です

コード:

Function SplitThis(InputStr As String) As Variant
    
    Dim SplitStr() As String, SubStr() As String, RightmostStr As String
    Dim OutputStr() As String
    
    Dim Delim_Level1 As String, Delim_Level2 As String, Delim_Cut As String
    
    Delim_Level1 = "\"
    Delim_Level2 = " "
    Delim_Cut = "}"         ' Any character you are guaranteed not to find in your original string
    
    'InputStr = "Domain\Domain Admins Domain2\User Group Domain3\Developer"
    SplitStr = Split(InputStr, Delim_Level1)
    
    ' SplitStr(0) = "Domain"
    ' SplitStr(1) = "Domain Admins Domain2"
    ' SplitStr(2) = "User Group Domain3"
    ' SplitStr(3) = "Developer"
    
    Dim i As Long
    For i = 1 To UBound(SplitStr) - 1                   ' i.e. 1 --> 2
        SubStr = Split(SplitStr(i), Delim_Level2)
        RightmostStr = SubStr(UBound(SubStr))
        
        ReDim Preserve SubStr(0 To UBound(SubStr) - 1)
        
        SplitStr(i) = Join(SubStr, Delim_Level2) & Delim_Cut & RightmostStr
        
    Next i
    
    ' SplitStr(0) = "Domain"
    ' SplitStr(1) = "Domain Admins{Domain2"
    ' SplitStr(2) = "User Group{Domain3"
    ' SplitStr(3) = "Developer"
    
    ' These are joined to create:
    ' "Domain\Domain Admins}Domain2\User Group}Domain3\Developer"
    '
    ' Which is split at the character "}" to create the output
    
    OutputStr = Split(Join(SplitStr, Delim_Level1), Delim_Cut)
    
    Dim OutputVariant() As Variant
    ReDim OutputVariant(0 To 0, 0 To UBound(OutputStr))
    
    For i = 0 To UBound(OutputStr)
        OutputVariant(0, i) = OutputStr(i)
    Next i
    
    SplitThis = OutputVariant
End Function

使用法:

Cell A1   : "Domain\Domain Admins Domain2\User Group Domain3\Developer"
Cell A3:C3: {=SplitThis(A1)}       ' Array formula

スクリーンショット:

ここに画像の説明を入力

しつこい疑問:Regexこれを行う最も効率的な方法は、何らかのベースのソリューションを使用することだと感じていますが、今のところはこれで十分です。

于 2014-07-18T08:46:38.663 に答える