我有一个包含重复值的文本列,例如:
| 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 |
答案 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行。