Excel:如何根据其他列中的文本值在列中创建数字?

时间:2009-01-19 19:47:44

标签: excel

我有一个包含重复值的文本列,例如:

   |    A    | 
---|---------|
 1 | emails  |
 2 |  foo    |
 3 |  foo    |
 4 |  bar    |
 5 |  bar    |
 6 |  stuff  |
 7 |  stuff  |
 8 |  stuff  |

我想要做的是让另一列包含数字,以便每个数字与第一列中的值匹配,例如:

   |    A    |    B    | 
---|---------|---------|
 1 | emails  | number  |
 2 |  foo    |    1    |
 3 |  foo    |    1    |
 4 |  bar    |    2    |
 5 |  bar    |    2    |
 6 |  stuff  |    3    |
 7 |  stuff  |    3    |
 8 |  stuff  |    3    |

7 个答案:

答案 0 :(得分:2)

首先,在单元格B2中放置数字1,然后将以下公式放在B3中并填充:

=IF(A3=A2,B1,B1+1)

这假定您的“电子邮件”列中的字符串已经排序(即:重复项彼此相邻)。

答案 1 :(得分:2)

假设重复的值总是相邻的(没有“foo,bar,foo”),你可以使用它:

  A B
1 X 0
2 a 1
3 a 1
4 b 2
5 b 2
6 c 3
7 d 4
8 d 4
9 d 4

B2为“= IF(A2 = A1,B1,B1 + 1)”,然后填写为B9

答案 2 :(得分:1)

取决于你的价值 -

如果您的意思是“重复群组”,那么像这样的宏可能有效 -


Sub Check()
    Dim start As Integer
    start = 1
    For Row = 2 To 12
        Cells.Item(Row, 2) = start
        If Cells.Item(Row, 1) <> Cells.Item(Row + 1, 1) Then
            start = start + 1
        End If
    Next
End Sub

如果您的意思是“取A列中每个值末尾的数字”,那么这可能有效 -


Sub Check()
    Dim i As Integer
    Dim value As String
    Dim number As String
    Dim c As String
    For Row = 2 To 12
        number = ""
        value = Cells.Item(Row, 1)
        For i = 1 To Len(value)
            c = Mid(value, i, 1)
            If IsNumeric(c) Then
                number = number & c
            End If
        Next
        Cells.Item(Row, 2) = number
    Next
End Sub

编辑 - 根据OP的评论,我猜他们的意思是“重复群组”,但我会留下这两个代码示例。

编辑 - 将代码复制并粘贴到excel Visual Basic编辑器中,然后单击“播放”。将常量2和12替换为起始行和结束行的值。

答案 3 :(得分:0)

根据数据表的确切性质,有多种方法可以做到这一点。

如果文本列中的重复值受限,例如小于10,那么你可以硬编码一些嵌套的if语句。

If(A1="mail1", 1, If(A1="mail2", 2, If(... etc.

我不建议这是因为它有点笨拙,你只能拥有最多7(?)嵌套的IF语句,如果你想在另一个工作表中使用不同值的代码,则不能非常可重用。

如果您知道文本词干的长度始终相同,例如在您的示例中,“mail”始终是前缀,长度为4个字符,然后您可以使用以下公式:

RIGHT(A1,LEN(A2)-4) 'The "4" denotes the length of the string "mail"

希望这有帮助。

答案 4 :(得分:0)

您已编辑了问题,以便从A中的文字中删除数字,因此 MID RIGHT 不再有效,您可能会使用此功能需要的是 LOOKUP()。基本上,您需要设置另一个表,其中只包含A的唯一值以及它们应映射到的值。

答案 5 :(得分:0)

如果我理解你的问题,数据可能会被排序,需要用A列中的不同值进行编号,因此“foo”为1,“bar”为2,依此类推A列中的唯一值。

我会使用VBA和Dictionary来构建列表:

Public Sub UpdateMapValues()
    Dim MappedValues As New Scripting.Dictionary
    Dim oSheet As Worksheet
    Dim Name As String
    Dim Index As Long
    Dim Number As Long
    Dim LastNumber As Long
    Set oSheet = ActiveSheet
    LastNumber = 0
    For Index = 2 To oSheet.UsedRange.Rows.Count
        Name = oSheet.Cells(Index, 1).Text
        If Not MappedValues.Exists(Name) Then
            LastNumber = LastNumber + 1
            Number = LastNumber
            Call MappedValues.Add(Name, Number)
        Else
            Number = MappedValues(Name)
        End If
        oSheet.Cells(Index, 2).Value = CStr(Number)
    Next Index
End Sub

这将更新B列中的数字。您还可以执行诸如将单元格引用(例如“A2”或“A5”)放在B列中,以便用于其他Excel函数。

要使用Scripting.Dictionary,只需在Tools \ References中添加引用,然后选择Microsoft Scripting Runtime。

答案 6 :(得分:0)

您是否尝试为每个文本列项自动分配一个数字,并在每次重复时在另一列中引用该数字?例如,给定以下文本项,您是否需要这样的输出:

foo 1 酒吧2 酒吧2 foo 1 东西3 东西3

如果是这样,有一个简单的非vba解决方案:

在单元格b2中输入值1。 将公式= IFERROR(VLOOKUP(A3,A $ 2:B2,2,FALSE),MAX(B $ 2:B2)+1)放在单元格b3中。 将公式从单元格b3复制到数据列表的底部。

对于此解决方案,我假设列标题位于第1行。