相对搜索活动单元格上方的所有单元格,直到到达 table header 而不是绝对单元格

Relatively search all cells above active cell until reach table header instead of absolute cell

我都不知道怎么问这个;希望这个解释足够清楚。

使用 VBA 录制的宏,在相对选择打开的情况下,我有一个使用 countif($C6:C656,[@Column1]) 的公式(实际上是 Table [=31 正下方的单元格=], 列 1)

我面临的问题是公式没有转换为变量位置,因为我不知道如何使用相对代码实际告诉 vba 一直向上搜索 Table 列,直到到达 header 正下方的单元格。它必须是相对的,因为 table 并不总是在第 655 行创建,并且在 table 本身内有不同数量的行,所以我不能告诉 VBA R[1]C[1]:R[367]c[1] 例如.

下面是在单元格 (B656) 中输入的公式。

=IF(B655="Column2",[@Column1],
IF(COUNTIF($C655:C6,[@Column1]),
(CONCATENATE(TEXT([@Date],"yyyy-m-d"),
"_",TEXT([@Date],"hhmm-s"),
"_R-"&COUNTIF($C655:C6,[@Column1]),
IF([@[TRANSACTION FEE ID]]="","","_"&[@[TRANSACTION FEE ID]]))),
[@Column1]))

下面是打开相关按钮的VBA翻译:

'Enter formula in cell under header (INCLUDES REPEATED DATES FOR DIFFERENT SPREADS)
    Range("TblAccountTradeHistory[[#Headers],[Column2]]").Select
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(R[-1]C=""Column2"",[@Column1]," & Chr(10) & "IF(COUNTIF(R[-1]C3:R656C[1],[@Column1])," & Chr(10) & "(CONCATENATE(TEXT([@Date],""yyyy-m-d"")," & Chr(10) & """_"",TEXT([@Date],""hhmm-s"")," & Chr(10) & """_R-""&COUNTIF(R[-1]C3:R656C[1],[@Column1])," & Chr(10) & "IF([@[TRANSACTION FEE ID]]="""","""",""_""&[@[TRANSACTION FEE ID]])))," & Chr(10) & "[@Column1]))"
    ActiveCell.Offset(1, 0).Range("A1").Select
    
    '^^^^^^^^^^^^^^^NOTE: THERE'S A SEARCH ALL CELLS ABOVE THIS ROW THROUGH THE HEADER, BUT ABOVE FORMULA SAYS "R[-1]C3:R656C" WILL THAT MESS UP FOR TRANSACTIONS THAT AREN'T THAT LOW?

有人想过如何使这项工作有效吗?

不要在 table 秒内使用单元格引用,您的大部分问题都会消失。

假设您的 table 名为“Table1”,尝试插入一个名为 DataRowsAbove 的新列,公式为 =ROW()-ROW(Tables[#Headers]-1

然后插入另一列标题为 Column1Repeated 的公式为 =IF([@DataRowsAbove]=0,0,COUNTIF(OFFSET(Table1[#Headers][Column1],1,0,[@DataRowsAbove],1),[@Column1])

偏移量是这里的秘诀。它为您提供了当前行上方的每个 Column1 值的范围,没有任何单元格地址引用。

那么你的Column2公式可以是

=IF(
 [@Column1Repeated]=0,
 [@Column1],
 CONCATENATE(
  TEXT([@Date],"yyyy-m-d"),
  "_",
  TEXT([@Date],"hhmm-s"),
  "_R-",
  [@Column1Repeated],
  IF(
   [@[TRANSACTION FEE ID]]="",
   "",
   "_"&[@[TRANSACTION FEE ID]]
  )
 )
)

如果这对你有用,那么...

  • 如果您不关心显示的那两个额外的列,那没问题!

  • 如果你可以在A:A之前插入两个新列,将这两个新列移动到新的A和B列中,然后隐藏这些列,那么你的工作表看起来和它一样之前做过,只是它以 C 列开头。

  • 如果您不能执行其中任何一项,则必须将 [@DataRowsAbove][@Column1Repeated] 的提及替换为它们的公式,而不是那两个新列。