Excel 如何根据另一列的值增加一列中的值

Excel 如何根据另一列的值增加一列中的值,excel,vbscript,Excel,Vbscript,如何根据另一列的值增加一列中的值 前 如果是 A B TS-1 TS-1 TS-1 TS-2 TS-2 TS-3 TS-3 TS-3 TS-3 应该是 A B TS-1 TC-1-1 TS-1 TC-1-2 TS-1 TC-1-3 TS-2 TC-2-1 TS-2 TC-2-2 TS-3 TC-3-1 TS-3 TC-3-2 TS-3

如何根据另一列的值增加一列中的值

如果是

 A             B    

TS-1
TS-1
TS-1
TS-2
TS-2
TS-3
TS-3
TS-3
TS-3
应该是

 A             B
TS-1        TC-1-1
TS-1        TC-1-2
TS-1        TC-1-3
TS-2        TC-2-1
TS-2        TC-2-2
TS-3        TC-3-1
TS-3        TC-3-2
TS-3        TC-3-3
TS-3        TC-3-4

在B列中应该是这样的,这取决于A列中的值的数量这看起来很容易实现

设置

  • 有一个变量valA,将数字存储在colA中
  • 有一个变量valB,该变量存储要打印在colB中的最右边的数字
算法

  • 分析一行中的文本
  • valA与前一行不同时,您知道必须将valB重置为1
  • 打印valB并将其递增1
  • 继续解析,直到到达末尾

如果环境良好,可以通过对旧值应用函数来计算新值。在这种情况下,不能编写纯公式/函数,因为新值不仅取决于旧值,还取决于它所属组(1、2、3,…)的元素数

因此,您必须在源元素上编写一个循环,以跟踪组。当看到“组”时,想想“字典”——不要使用If和变量跟踪组标识符的更改,让字典为您工作。额外的好处:不依赖订单

代码:

  Dim aSrc : aSrc = Split("TS-1 TS-1 TS-1 TS-2 TS-2 TS-3 TS-3 TS-3 TS-3")
  WScript.Echo "aSrc:", Join(aSrc)
  Dim aExp : aExp = Split("TC-1-1 TC-1-2 TC-1-3 TC-2-1 TC-2-2 TC-3-1 TC-3-2 TC-3-3 TC-3-4")
  ReDim aRes(UBound(aSrc))
  Dim dicN : Set dicN = CreateObject("Scripting.Dictionary")
  Dim nRow : nRow     = 0
  Dim sInp
  For Each sInp In aSrc
      Dim aParts : aParts = Split(sInp, "-")
      dicN(aParts(1)) = dicN(aParts(1)) + 1
      aRes(nRow) = "TC-" & aParts(1) & "-" & dicN(aParts(1))
      nRow = nRow + 1
  Next
  WScript.Echo "aExp:", Join(aExp)
  WScript.Echo "aRes:", Join(aRes)
输出:

aSrc: TS-1 TS-1 TS-1 TS-2 TS-2 TS-3 TS-3 TS-3 TS-3
aExp: TC-1-1 TC-1-2 TC-1-3 TC-2-1 TC-2-2 TC-3-1 TC-3-2 TC-3-3 TC-3-4
aRes: TC-1-1 TC-1-2 TC-1-3 TC-2-1 TC-2-2 TC-3-1 TC-3-2 TC-3-3 TC-3-4

您也可以通过使用辅助列在不使用VBA的情况下执行此操作。将以下公式放入C列(从C2开始!):

=如果(A1A2,1,C1+1) 注意:这假设列a中的列表已排序

然后,在B列中使用以下公式:

=SUBSTITUTE(A2,"S","C")&"-"&C2 =替换(A2,“S”、“C”)和“-”以及C2
  • 在单元格B1中复制此公式:
    =A1&“-”&COUNTIF(A$1:A1;A1)
  • 将内容从B1拖动到dataselection的末尾

  • 这在Office 2010中不起作用。将其更新为=A1&“-”&COUNTIF(A$1:A1,A1) =SUBSTITUTE(A2,"S","C")&"-"&C2