Excel 分裂,逃避某些分裂

Excel 分裂,逃避某些分裂,excel,vba,Excel,Vba,我有一个包含多个问题和答案的单元格,它像CSV一样组织。因此,要将所有这些问题和答案分开,使用逗号作为分隔符的简单拆分应该很容易分开 不幸的是,有些值使用逗号作为十进制分隔符。有没有办法避免这些事件的分裂 幸运的是,我的数据可以使用“,”作为分隔符进行拆分,但如果不是这样,除了手动将十进制分隔符从逗号替换为点之外,还有解决方案吗 例如: 价格:0,09,数量:12,售出:是 使用拆分(“价格:0,09,数量:12,售出:是“,”,”)将产生: 价格:0 09 数量:12个 出售:是给定此测试数据

我有一个包含多个问题和答案的单元格,它像CSV一样组织。因此,要将所有这些问题和答案分开,使用逗号作为分隔符的简单拆分应该很容易分开

不幸的是,有些值使用逗号作为十进制分隔符。有没有办法避免这些事件的分裂

幸运的是,我的数据可以使用“,”作为分隔符进行拆分,但如果不是这样,除了手动将十进制分隔符从逗号替换为点之外,还有解决方案吗

例如:

价格:0,09,数量:12,售出:是 使用拆分(“价格:0,09,数量:12,售出:是“,”,”)将产生:

价格:0
09
数量:12个

出售:是

给定此测试数据,一种可能性是在拆分后循环数组,并且每当字符串中没有
时,将此条目添加到上一个条目中

执行此操作的函数可能如下所示:

Public Function CleanUpSeparator(celldata As String) As String()
    Dim ret() As String
    Dim tmp() As String
    Dim i As Integer, j As Integer

    tmp = Split(celldata, ",")
    For i = 0 To UBound(tmp)
        If InStr(1, tmp(i), ":") < 1 Then
            ' Put this value on the previous line, and restore the comma
            tmp(i - 1) = tmp(i - 1) & "," & tmp(i)
            tmp(i) = ""
        End If
    Next i

    j = 0
    ReDim ret(j)
    For i = 0 To UBound(tmp)
        If tmp(i) <> "" Then
            ret(j) = tmp(i)
            j = j + 1
            ReDim Preserve ret(j)
        End If
    Next i

    ReDim Preserve ret(j - 1)

    CleanUpSeparator = ret
End Function
公共函数cleanupsepator(celldata作为字符串)作为字符串()
Dim ret()作为字符串
Dim tmp()作为字符串
尺寸i为整数,j为整数
tmp=拆分(celldata,“,”)
对于i=0至UBound(tmp)
如果仪表(1,tmp(i),“:”)小于1,则
'将此值放在前一行,并恢复逗号
tmp(i-1)=tmp(i-1)&“,”和tmp(i)
tmp(i)=“
如果结束
接下来我
j=0
雷迪姆·雷特(j)
对于i=0至UBound(tmp)
如果tmp(i)“,则
ret(j)=tmp(i)
j=j+1
ReDim保留ret(j)
如果结束
接下来我
雷迪姆保留网(j-1)
cleanupsepator=ret
端函数

请注意,通过将分隔符
转换为参数,还有改进的余地。

我花了24小时左右的时间思考我认为完全类似的问题,所以我将在这里分享我的解决方案。如果我对这个问题的解决方案的适用性有错误,请原谅我。:-)

我的问题是:我有一个SharePoint列表,其中教师(我是一名小学技术专家)输入年终奖证书供我打印。教师可以为给定的奖项输入多个学生的名字,并用逗号分隔每个名字。我在Access中有一个VBA宏,它将每个名称转换为单独的记录,用于邮件合并。好吧,我撒谎了。这更像是一个故事。问题是:教师如何添加像Hank Williams,Jr.(注意逗号)这样的学生名字,而不让逗号导致“Jr.”在我的宏中被解释为单独的学生

(SharePoint导出到Excel)字段“Students”的完整内容存储在宏中一个名为strStudentsBeforSplit的变量中,该字符串最终与以下语句拆分:

strStudents=Split(strStudentsBeforeSplit,,,-1,vbTextCompare)

这就是问题所在,真的。Split函数使用逗号作为分隔符,但可怜的学生小汉克·威廉姆斯(Hank Williams,Jr.)的名字中有一个逗号。怎么办

我花了很长时间试图找出如何避开逗号。如果这是可能的,我从来没有想过

许多论坛帖子建议使用不同的字符作为分隔符。我想没关系,但我想出了一个解决办法:

  • 在Split函数运行之前,仅将“Jr”前面的特殊逗号替换为不同的不常见字符
  • 在拆分运行后切换回逗号
  • 我的文章到此结束,下面是我宏中完成步骤1的几行代码。这可能会也可能不会引起人们的兴趣,因为它实际上只是处理进行互换的细节。请注意,代码处理了我的老师可能键入名称“Jr”部分的几种不同方式(大部分是错误的)

    'Dealing with the comma before Jr.  This will handle ", Jr." and ", Jr" and " Jr." and " Jr".
    'Replaces the comma with ~ because commas are used to separate fields in Split function below.
    'Will swap ~ back to comma later in UpdateQ_Comma_for_Jr query.
    strStudentsBeforeSplit = Replace(strStudentsBeforeSplit, "Jr", "~ Jr.") 'Every Jr gets this treatment regardless of what else is around it.
    'Note that because of previous Replace functions a few lines prior, the space between the comma and Jr will have been removed.  This adds it back.
    strStudentsBeforeSplit = Replace(strStudentsBeforeSplit, ",~ Jr", "~ Jr") 'If teacher had added a comma, strip it.
    strStudentsBeforeSplit = Replace(strStudentsBeforeSplit, " ~ Jr", "~ Jr") 'In cases when teacher added Jr but no comma, remove the (now extra)...
    '...space that was before Jr.
    

    这就是为什么我喜欢使用一个不太可能“自然”出现的分隔符,比如“”或类似的东西。在转义非预期的分隔符方面,我认为您需要使用replace将预期的分隔符更改为其他分隔符,并使用一些巧妙的字符串逻辑来检测哪些应该被替换,这当然是最理想的选项。但不幸的是,你不能总是决定定界符,因此必须处理第三方给你的东西。是不是由自己定义的非分隔符逗号,例如“代码>”汤姆、鲍伯和Harry每个都有1美元,总共多少美元?“,9美元”< /代码>?如果你可以将数字字符看作这样的定界符,那么是的。例如:“价格:0,09,数量12,售出:是”这确实是一个简洁的解决方案。我不知道会不会有更短的?不知道怎么。。您可以跳过第二次迭代,并在调用该函数的函数中处理空值,即在使用数据时。我更喜欢从源头上清除那种东西。除此之外,VB不太支持删除数组项。我不是指你的代码,它写得相当高效和干净。就一般问题而言,是否存在较短的解决方案。是的,使用另一个分隔符。可以像分号或管道(
    |
    )而不是冒号一样简单。但是你说你不能控制sep,真丢脸。。。