Excel 如何在单元格中搜索逗号,并根据是否找到逗号执行两个操作之一?
我有一个大约7000行的excel工作表,每个工作表都有一个列,列中的名称可以是各种形式([firstname lastname],[lastname,firstname],等等)。我需要把所有这些名字分成两列,一列是名字,一列是姓氏 所以我想做的是写一些代码来Excel 如何在单元格中搜索逗号,并根据是否找到逗号执行两个操作之一?,excel,vba,Excel,Vba,我有一个大约7000行的excel工作表,每个工作表都有一个列,列中的名称可以是各种形式([firstname lastname],[lastname,firstname],等等)。我需要把所有这些名字分成两列,一列是名字,一列是姓氏 所以我想做的是写一些代码来 在字符串中搜索逗号 如果有逗号,则取逗号前面的所有字符,并将它们放在姓氏列中。然后将逗号后的所有字符放入“名字”列 如果没有逗号,只需将第一个字符串(名字)放在“名字”列中,将第二个字符串(姓氏)放在“姓氏”列中 我已经有一段时间没有使
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")
一些意见:
手动修复
lastname、firstname
和firstname-lastname
。任何其他情况都会导致错误/意外结果手动修复
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
例如:
这假设每个单元格包含一个逗号或一个空格,并且解析基于第一次出现的分隔符。还假定:
我想做的是写一些代码好,你的代码在哪里?你被困在哪里?你犯了什么错误?你试过普通的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您可能有一个坏记录。这是一个没有逗号、没有@和空格的记录。