相对搜索活动单元格上方的所有单元格,直到到达 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]
的提及替换为它们的公式,而不是那两个新列。
我都不知道怎么问这个;希望这个解释足够清楚。
使用 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]
的提及替换为它们的公式,而不是那两个新列。