【问题标题】:Excel: how to create a number in a column according to a text value in other column?Excel:如何根据其他列中的文本值在列中创建一个数字?
【发布时间】:2009-02-12 23:48:33
【问题描述】:

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

   |    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    |

【问题讨论】:

  • 对不起,我没说清楚,有文字的那一栏没有我想要的数字,它没有任何数字。

标签: excel


【解决方案1】:

首先,在单元格B2中填入数字1,然后在B3中填入以下公式并填写:

=IF(A3=A2,B1,B1+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

    【讨论】:

      【解决方案3】:

      取决于你所说的价值 -

      如果您的意思是“重复组”,那么像这样的宏可能会起作用 -

      
      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 替换为开始行和结束行的值。

      【讨论】:

        【解决方案4】:

        有多种方法可以做到这一点,具体取决于数据表的确切性质。

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

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

        我不建议这样做,因为它有点笨拙,您最多只能有 7(?)个嵌套 IF 语句,并且如果您想将另一个工作表中的代码用于不同的值,则不能很好地重用。

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

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

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            如果我正确理解您的问题,则数据可能已排序并且需要按 A 列中的不同值编号,因此“foo”为 1,“bar”为 2,以此类推 A 列中的唯一值。

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

            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”)放入可用于其他 Excel 功能的 B 列中。

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

            【讨论】:

              【解决方案7】:

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

              富 1 酒吧 2 酒吧 2 富 1 东西 3 东西3

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

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

              对于这个解决方案,我假设列标题在第 1 行。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-04-12
                • 2023-01-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-01-24
                相关资源
                最近更新 更多