Regex 替换字符串中的所有字符,除非它们位于双引号内
遗憾的是,我不熟悉正则表达式,因为我不是程序员,但我想这个问题很容易用正则表达式解决(不过,我肯定会接受其他建议) 我想使用split函数分割一个单元格的值,并将其分散到多个单元格上。分隔符是逗号。但问题是,一些用户在注释中使用逗号,例如,Split函数使用逗号在注释中间拆分字符串 例如,包含以下值的单元格: 0001,“姓名”,“地址”,“喜欢苹果,桔子 还有李子“ 需要分成多个单元格,分别显示0001“姓名”、“地址”和“喜欢苹果、桔子和李子” 我的代码也会分割注释,我希望它用双引号忽略注释或其他所有内容。以下是一个示例:Regex 替换字符串中的所有字符,除非它们位于双引号内,regex,vba,excel,Regex,Vba,Excel,遗憾的是,我不熟悉正则表达式,因为我不是程序员,但我想这个问题很容易用正则表达式解决(不过,我肯定会接受其他建议) 我想使用split函数分割一个单元格的值,并将其分散到多个单元格上。分隔符是逗号。但问题是,一些用户在注释中使用逗号,例如,Split函数使用逗号在注释中间拆分字符串 例如,包含以下值的单元格: 0001,“姓名”,“地址”,“喜欢苹果,桔子 还有李子“ 需要分成多个单元格,分别显示0001“姓名”、“地址”和“喜欢苹果、桔子和李子” 我的代码也会分割注释,我希望它用双引号忽略注释
Sub SplittingStrings()
Dim wb As Workbook
Dim ws As Worksheet
Dim strInput As String
Dim counter As Integer
Dim cell As Variant
Dim splitCount As Integer
Dim splitString() As String
Dim category As Variant
Set wb = ActiveWorkbook
Set ws = wb.ActiveSheet
counter = 1
For Each cell In Range("A1", "A2000")
If cell.Value <> "" Then
strInput = cell.Value
splitCount = 2
splitString = Split(strInput, ",")
For Each category In splitString
Cells(counter, splitCount).Value = category
splitCount = splitCount + 1
Next category
End If
counter = counter + 1
Next cell
End Sub
子拆分字符串()
将wb设置为工作簿
将ws设置为工作表
像弦一样的模糊的条纹
作为整数的Dim计数器
变暗细胞
Dim splitCount为整数
Dim splitString()作为字符串
作为变体的Dim类别
设置wb=ActiveWorkbook
设置ws=wb.ActiveSheet
计数器=1
对于范围内的每个单元格(“A1”、“A2000”)
如果单元格的.Value为“”,则
strInput=cell.Value
拆分计数=2
splitString=Split(strInput,“,”)
对于splitString中的每个类别
单元格(计数器、拆分计数)。值=类别
splitCount=splitCount+1
下一类
如果结束
计数器=计数器+1
下一个细胞
端接头
如何将带有双引号的内容排除在拆分函数的考虑范围之外?请尝试一下,看看是否获得了所需的输出 如果需要,调整变量
Sub SplittingStringsUsingRegEx()
Dim lr As Long, c As Long
Dim Rng As Range, cell As Range
Dim RE, Match, Matches
Application.ScreenUpdating = False
lr = Cells(Rows.Count, 1).End(xlUp).Row
Set Rng = Range("A1:A" & lr)
Set RE = CreateObject("VBScript.RegExp")
With RE
.Global = True
.Pattern = "\d+|"".+?"""
End With
c = 2
For Each cell In Rng
If RE.test(cell.Value) Then
Set Matches = RE.Execute(cell.Value)
For Each Match In Matches
Cells(cell.Row, c) = Replace(Match, """", "")
c = c + 1
Next Match
End If
c = 2
Next cell
Application.ScreenUpdating = True
End Sub
没有正则表达式:
我们需要“保护”用双引号封装的逗号:
Sub ProtectStuff()
Dim i As Long, N As Long, v As String, v2 As String
Dim ProtectMode As Boolean, DQ As String, rep As String
Dim CH As String, arr
DQ = """"
rep = Chr(1)
N = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To N
v = Cells(i, "A").Value
If v <> "" Then
ProtectMode = False
v2 = ""
For j = 1 To Len(v)
CH = Mid(v, j, 1)
If CH = DQ Then ProtectMode = Not ProtectMode
If CH = "," And ProtectMode Then CH = rep
v2 = v2 & CH
Next j
End If
arr = Split(v2, ",")
j = 2
For Each a In arr
Cells(i, j) = Replace(a, rep, ",")
j = j + 1
Next a
Next i
End Sub
Sub-ProtectStuff()
尺寸i为长,N为长,v为字符串,v2为字符串
Dim ProtectMode为布尔值,DQ为字符串,rep为字符串
调暗的琴弦,arr
DQ=“”“
rep=Chr(1)
N=单元格(Rows.Count,“A”)。结束(xlUp)。行
对于i=1到N
v=单元格(i,“A”)。数值
如果v“那么
ProtectMode=False
v2=“”
对于j=1到Len(v)
CH=中间(v,j,1)
如果CH=DQ,则ProtectMode=Not ProtectMode
如果CH=“,”和ProtectMode,则CH=rep
v2=v2&CH
下一个j
如果结束
arr=拆分(v2,“,”)
j=2
对于arr中的每个a
单元格(i,j)=替换(a,rep,“,”)
j=j+1
下一个
接下来我
端接头
文本到列将执行您想要的操作,与拆分功能不同。您可以使用内置的Excel“文本到列”,这将正确拆分它。不需要VBA。@braX-如果我理解OP,我可能不理解,他们不希望它在引号内用逗号分隔,所以“喜欢苹果、桔子和李子”应该被忽略。@SJR-这是绝对正确的,抱歉,不清楚。@SJR文本到列处理该问题-默认情况下,它假定引号是文本限定符,并且不会在引号内用逗号分隔。@Rory-曙光初现,谢谢。在一次测试之后,第一条注释解决了这个问题(我把它全部收回@braX),所以它似乎是有效的,然而,一个
“
被删除了才能工作,所以在Excel中,它必须加倍”
才能识别“
”?这是正确的。要输入双引号,您需要将双引号加倍。:)