【问题标题】:String Manupulation in VBAVBA中的字符串操作
【发布时间】:2014-09-09 02:31:44
【问题描述】:

我有需要拆分为多个的单列,例如 excel 中的文本到列。然而,有一个小挑战。常规分隔符将不起作用。考虑下面的字符串

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 行的列表。 我使用以下公式检查“\” i 列 B 的出现,计数范围为 0-66

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

我需要帮助来编写以下逻辑代码

  1. 在字符串中查找“\”
  2. 找到“\”之前的空格并拆分

我使用了以下代码,但它没有达到目的

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

请帮助编写一个牢记第 1 点和第 2 点的代码。

【问题讨论】:

  • 我尝试使用以下代码反转字符串 'Function Reverse(str As String) As String Reverse = StrReverse(Trim(str)) End Function' 但是停留在如何找到 \ 然后拆分\ 后面的空格
  • 这段文字是从哪里来的?如果您可以在连接之前添加引号会容易得多
  • @ Luke,嗨,该文本是从 SCCM 报告中导出的,该报告提供了 AD 森林中所有对象的列表。我正在尝试从那里过滤用户组。
  • 你找不到Group Domain,将其替换为Group @ Domain(假设你的字符串中没有@)然后拆分@?然后就可以换回来了。不需要 VBA,尽管此过程可以自动化。

标签: string vba excel texttrimming


【解决方案1】:

这是一个你可以使用的函数,cmets + code 是不言自明的

代码:

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

截图:

Nagging Doubt:我觉得最有效的方法是使用一些基于Regex 的解决方案,但现在应该这样做。

【讨论】:

  • 好奇:能不能直接用Domain@拆分(@是数字通配符)?
  • 其实我确实在寻找一些通配符的方法,但是这么早就想不到!请务必发布直接拆分,因为这将是最有效的(至少在代码行中)。此外,它会比Domain@ 复杂一点,因为Domain 本身就是一个变量字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多