【问题标题】:Relatively search all cells above active cell until reach table header instead of absolute cell相对搜索活动单元格上方的所有单元格,直到到达表格标题而不是绝对单元格
【发布时间】:2022-02-16 00:08:54
【问题描述】:

我什至不知道如何问这个问题;希望这个解释足够清楚。

使用 VBA 录制的宏,打开相对选择,我有一个使用 countif($C$656:C656,[@Column1]) 的公式(实际上是表头 Column1 正下方的单元格)

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

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

=IF(B655="Column2",[@Column1],
IF(COUNTIF($C655:C$656,[@Column1]),
(CONCATENATE(TEXT([@Date],"yyyy-m-d"),
"_",TEXT([@Date],"hhmm-s"),
"_R-"&COUNTIF($C655:C$656,[@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?

有人想知道如何完成这项工作吗?

【问题讨论】:

  • 您能否分享单元格B664 所需的公式,就好像它不在表格中一样?

标签: excel vba excel-formula


【解决方案1】:

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

假设您的表名为“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] 替换为他们的公式,而不是这两个新列。

【讨论】:

  • 感谢您的解释!最终我最终粘贴了值,所以新列没有问题。今天晚些时候我会试一试。 :)
  • 太棒了!我以艰难的方式学到了这一点,并为自己创建了一条经验法则:“如果对表格列公式的更改不会立即更改整个列(我不必将新公式拖到列中),那么我”我做错了。”
  • 另外,如果您要复制并粘贴到另一个 Excel 文件中,那么您绝对应该查看 PowerQuery(数据功能区的“获取和转换”部分)。见stackoverflow.com/questions/70071563/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
相关资源
最近更新 更多