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 列中的值的数量

4

4 回答 4

3
  1. 将此公式复制到单元格 B1 中:=A1 & "-" & COUNTIF(A$1:A1;A1)
  2. 将内容从 B1 拖到数据选择的末尾。
于 2013-01-21T14:23:44.287 回答
0

这看起来很容易完成。

设置

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

算法

  • 连续解析文本。
  • valA与上一行不同时,您知道必须将 valB 重置为 1。
  • 打印valB并将其增加 1。
  • 继续解析直到结束。
于 2013-01-20T19:31:39.583 回答
0

在好的情况下,您可以通过将函数应用于后者来基于旧值计算新值。在这种情况下,您不能编写纯公式/函数,因为新值不仅取决于旧值,还取决于它所属的组 (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
于 2013-01-20T19:55:17.423 回答
0

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

=IF(A1A2,1,C1+1)

注意:这假设您在 a 列中的列表已排序!

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

=SUBSTITUTE(A2,"S","C")&"-"&C2
于 2013-01-21T09:04:24.217 回答