Excel:如何根据其他列中的文本值在列中创build一个数字?
我有一个重复值的文本列,例如:
| 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 |
根据你的价值意思 –
如果你的意思是“重复组”,那么这样的macros可能工作 –
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和12replace为开始行和结束行的值。
首先,在单元格B2中放置一个数字1,然后在B3中放入以下公式并填写:
=IF(A3=A2,B1,B1+1)
这假设你的“电子邮件”列中的string已经sorting(即:重复项全部紧挨着)。
假设重复的值总是相邻的(没有“foo,bar,foo”),你可以使用这个:
AB 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
有很多方法可以做到这一点,这取决于您的数据表的确切性质。
如果文本列中的重复值是有限的,例如小于10,那么您可以硬编码一些嵌套的if语句。
If(A1="mail1", 1, If(A1="mail2", 2, If(... etc.
我不build议这样做,因为它有点笨拙,你只能拥有多达7(?)嵌套的IF语句,而且如果你想在另一个工作表中使用不同的值来重用,
如果您知道文本干的长度总是相同的,例如在您的示例中,“邮件”始终是前缀,并且长度为4个字符,则可以使用以下公式:
RIGHT(A1,LEN(A2)-4) 'The "4" denotes the length of the string "mail"
希望这可以帮助。
你已经编辑了你的问题,从A中的文本中取出数字,所以MID和RIGHT不再工作,你可能需要的函数是LOOKUP() 。 基本上你需要设置另一个表,只有A的唯一值和他们应该映射到的值。
如果我正确地理解了你的问题,那么数据可能会被sorting,并且需要按列A中不同的值进行编号,所以“foo”为1,“bar”为2,以此类推
我将使用VBA和一个字典来build立列表:
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中的数字。您还可以执行诸如将列单元格B中的单元格引用(例如“A2”或“A5”),您可以将其用于其他Excel函数。
为了使用Scripting.Dictionary,只需在Tools \ References中添加一个引用,然后selectMicrosoft Scripting Runtime。
你是否试图为每个文本列项自动分配一个数字,并在每次重复时在另一列中引用该数字? 例如,给定以下文本项目,你想要这样的输出:
foo 1 bar 2 bar 2 foo 1 stuff 3 stuff 3
如果是这样,有一个简单的非VBA解决scheme:
在单元格b2中将值设为1。 在单元格b3中input公式= IFERROR(VLOOKUP(A3,A $ 2:B2,2,FALSE),MAX(B $ 2:B2)+1)。 将公式从单元格b3复制到数据列表的底部。
对于这个解决scheme,我假设列标题在第1行。