Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何在单元格中搜索逗号,并根据是否找到逗号执行两个操作之一?_Excel_Vba - Fatal编程技术网

Excel 如何在单元格中搜索逗号,并根据是否找到逗号执行两个操作之一?

Excel 如何在单元格中搜索逗号,并根据是否找到逗号执行两个操作之一?,excel,vba,Excel,Vba,我有一个大约7000行的excel工作表,每个工作表都有一个列,列中的名称可以是各种形式([firstname lastname],[lastname,firstname],等等)。我需要把所有这些名字分成两列,一列是名字,一列是姓氏 所以我想做的是写一些代码来 在字符串中搜索逗号 如果有逗号,则取逗号前面的所有字符,并将它们放在姓氏列中。然后将逗号后的所有字符放入“名字”列 如果没有逗号,只需将第一个字符串(名字)放在“名字”列中,将第二个字符串(姓氏)放在“姓氏”列中 我已经有一段时间没有使

我有一个大约7000行的excel工作表,每个工作表都有一个列,列中的名称可以是各种形式([firstname lastname],[lastname,firstname],等等)。我需要把所有这些名字分成两列,一列是名字,一列是姓氏

所以我想做的是写一些代码来

  • 在字符串中搜索逗号
  • 如果有逗号,则取逗号前面的所有字符,并将它们放在姓氏列中。然后将逗号后的所有字符放入“名字”列
  • 如果没有逗号,只需将第一个字符串(名字)放在“名字”列中,将第二个字符串(姓氏)放在“姓氏”列中
  • 我已经有一段时间没有使用visual basic代码了,但我想我可以在第一步中使用某种
    find()
    方法,但是在那之后我完全不知所措了。任何帮助都将不胜感激


    经过多次编辑。。。。 这就是我目前所处的位置

    Sub WhatsInAName()
    Dim N As Long, i As Long, v As String, M As Long, X As Long
    N = Cells(Rows.Count, "G").End(xlUp).Row
    For i = 2 To N
        v = Cells(i, "G").Value
        M = InStr(1, v, ",")
        X = InStr(1, v, "@")
        If M > 0 Then
            Cells(i, "H").Value = LTrim(Mid(v, M + 1))
            Cells(i, "I").Value = Left(v, M - 1)
        ElseIf X > 0 Then
            Cells(i, "H").Value = "email"
        Else
            M = InStr(1, v, " ")
            Cells(i, "H").Value = Left(v, M - 1)
            Cells(i, "I").Value = Mid(v, M + 1)
        End If
    Next i
    
    端接头 编辑#


    好的,这就是我的基本结论。在看到解析出的数据后,发现有一堆行的名称旁边有3个名称或额外的jibberish。对于这些问题,我将不得不使用文本到列,直到我弄明白如何使我的代码更高级,以处理这些问题。谢谢大家!这是一次有趣的学习体验

    嗯,这不是最好的解决方案,但您可以使用普通公式,然后再粘贴值

    您发布了一个包含名称的列,并且希望将其分为两列。我做了这样的东西:

    在单元格B2中,我的公式是:

    =IF(LEN(A2)-1=LEN(SUBSTITUTE(A2;" ";""));IF(IFERROR(SEARCH(",";A2);0)=0;TRIM(MID(A2;1;SEARCH(" ";A2)-1));TRIM(MID(A2;SEARCH(",";A2)+1;99)));"Manual fix")
    
    =IF(LEN(A2)-1=LEN(SUBSTITUTE(A2;" ";""));IF(IFERROR (SEARCH(",";A2);0)=0;TRIM(MID(A2;SEARCH(" ";A2)+1;99));TRIM(MID(A2;1;SEARCH(",";A2)-1)));"Manual fix")
    
    在单元格
    C2
    中,我的公式是:

    =IF(LEN(A2)-1=LEN(SUBSTITUTE(A2;" ";""));IF(IFERROR(SEARCH(",";A2);0)=0;TRIM(MID(A2;1;SEARCH(" ";A2)-1));TRIM(MID(A2;SEARCH(",";A2)+1;99)));"Manual fix")
    
    =IF(LEN(A2)-1=LEN(SUBSTITUTE(A2;" ";""));IF(IFERROR (SEARCH(",";A2);0)=0;TRIM(MID(A2;SEARCH(" ";A2)+1;99));TRIM(MID(A2;1;SEARCH(",";A2)-1)));"Manual fix")
    
    一些意见:

  • 如果名称(组合名称)中有2个或更多空格,则公式将返回
    手动修复
  • 该公式仅适用于2种情况:case
    lastname、firstname
    firstname-lastname
    。任何其他情况都会导致错误/意外结果
  • 如果名称的结尾或开头有多余的空格,则会计为2个或更多的空格,因此公式将返回
    手动修复
  • 如图所示,
    Michael Jackson
    Jackson,Michael
    被正确分割
    Jean-Claude Van Dame
    返回
    手动修复
    ,因为它是一个组合名称

    试着让它适应你的需要

    更新:将一个文件示例上载到GDrive,以防您想在live上检查公式

    考虑:

    Sub WhatsInAName()
        Dim N As Long, i As Long, v As String, M As Long
        N = Cells(Rows.Count, "A").End(xlUp).Row
        For i = 1 To N
            v = Cells(i, "A").Value
            M = InStr(1, v, ",")
            If M > 0 Then
                Cells(i, "B").Value = LTrim(Mid(v, M + 1))
                Cells(i, "C").Value = Left(v, M - 1)
            Else
                M = InStr(1, v, " ")
                Cells(i, "B").Value = Left(v, M - 1)
                Cells(i, "C").Value = Mid(v, M + 1)
            End If
        Next i
    End Sub
    
    例如:

    这假设每个单元格包含一个逗号或一个空格,并且解析基于第一次出现的分隔符。还假定:

  • 在列A中输入数据
  • 无标题行(数据从第1行开始)

  • 我想做的是写一些代码好,你的代码在哪里?你被困在哪里?你犯了什么错误?你试过普通的excel公式吗?所以你要做的是1。研究如何使用
    find()
    •2。阅读有关查找方法的Microsoft文档•3。自己尝试一下。如果您陷入困境或出现无法自行修复的错误。您的问题,添加您的代码并向其提问()。添加Foxfire所说的内容,如果名称有两个单词怎么办?宏将如何处理这个问题?如果名字和姓氏只有一个词,那么你所要求的是相当容易的,否则就不容易了。@Pᴇʜ这就是我现在正在研究的内容,但我很难弄清楚如何研究其中的一部分(我想我只是用错误的方式在谷歌上提问),所以我希望人们知道我在寻找的方法。如果没有逗号,只需将第一个字符串(名字)放在第一个名称列中,然后将第二个字符串放在第二个字符串中(姓氏)在姓氏列中。有3个或3个以上字符串的名字呢?像Jean-Claude Van Damme这样的名字,这看起来正是我想做的!!!让我很快尝试一下,然后回到你的工作中来!我现在要做的就是(我没有看到这个问题)就是让它跳过任何电子邮件而不是名字。非常感谢你的帮助,这是巨大的!@Patrick如果你需要更多帮助,只需在这个答案上添加另一条评论。太棒了,谢谢!所以我在帖子上更新了我的代码。我基本上用了你的代码,并尝试扩展If-else语句来解释@符号的存在。However,现在我在这行“Cells(I,“H”).Value=Left(v,M-1)”中得到一个错误,该行表示运行时错误“5”:@Patrick您可能有一个坏记录。这是一个没有逗号、没有@和空格的记录。