【问题标题】:How to use a user defined range in a formula in vba如何在vba的公式中使用用户定义的范围
【发布时间】:2021-11-30 09:46:42
【问题描述】:

我正在尝试定义从 B2(常量)开始到最后一个单元格的范围,其中的数据将逐月更改。我想采用相同的范围长度并为 A 列定义另一个范围,该范围也将从 A2(常量)开始,但只会向下延伸至 B 列。我正在尝试将它们标识为范围并在 vba 的公式中使用变暗的范围,但它不喜欢它......有什么想法吗?

Dim Data As range
Dim Time As range
range("b2").Select
'Select Range

Set Data = range("B2", range("B2").End(xlDown))
Set Time("A2", range("A2").End(xlDown))
ActiveCell.Offset(1, 1).Select
ActiveCell.FormulaR1C1 = _
"=FORECAST.ETS([@Timeline],.address(data),.address(time):R[-1]C[-2],1,0)"

【问题讨论】:

  • 您的代码中是否也有错字?或者就这样:Set Time("A2", range("A2").End(xlDown)),应该是Set Time = Range("A2",...)。但正如我所提到的,我会将Time 更改为timeRng

标签: excel vba range formula


【解决方案1】:

你需要关闭公式字符串,添加地址,然后继续:

"=FORECAST.ETS([@Timeline],.address(" & data.address & "),.address(" & 
time.address & "):R[-1]C[-2],1,0)"

注意,由于您使用的是 R1C1 样式,您可能必须在 .address 两个部分上都这样做,

time.address(ReferenceStyle:=xlR1C1)

所以:

"=FORECAST.ETS([@Timeline],.address(" & data.address(ReferenceStyle:=xlR1C1) & "),.address(" & 
time.address(ReferenceStyle:=xlR1C1) & "):R[-1]C[-2],1,0)"

编辑:另外,我会更改关键字Time,因为我认为这是一个保留字。也许Dim timeRng as Range

【讨论】:

  • Dim Data As range Dim Time As range Set Data = range("B2", range("B2").End(xlDown)) Set Time = Data.Offset(columnOffset:=-1) ActiveCell.Offset(1, 1).Select ActiveCell.FormulaR1C1 = _ "=FORECAST.ETS([@Timeline],.address(" & data.address & "),.address(" & time.address & "): R[-1]C[-2],1,0)" 结束子
  • 我进行了上述更改(我不知道如何以正确的格式发布...抱歉)。它现在会引发语法错误。
  • @FrankCicconeII - 什么错误?您是否尝试添加ReferenceStyle
  • 我不确定我是否理解参考样式的含义或如何实现...另外参考指定哪些工作表我故意将其保留为未定义,因为我希望能够使用此宏多个标签。
  • @FrankCicconeII - 查看我的编辑。另外,如果是这种情况,请确保您使用工作表限定您的范围,并avoid using .Select/.Activate
【解决方案2】:

除了@BruceWayne 的answer,解决您问题的第一部分:

如果我有一个范围 B2:B50,并且我想要对应的 A 列,那么我可以使用 Offset 函数:

Set time = data.Offset(columnOffset:=-1)

或者,您可以像这样构造列:

Set time = Sheet1.Range("A2").Resize(Rows(data), 1) 'nrows, 1 column

那么你可以把 A2 放在任何地方


FWIW:

  • range("b2").Select is unnecessary 如果你养成这种习惯,你的代码真的会变慢(这只是因为宏记录器不知道你到底想要什么)。您可以使用 Range("B2").Offset(1,1).FormulaR1C1 而不选择
  • 您可以在excel中命名单元格并引用名称:Range("myNamedCell")
  • 始终最好在工作表名称前加上完全限定的引用(例如Sheet1.Range("A1")),因为这将始终引用同一个单元格,而Range("A1") 指的是当您运行宏时碰巧选择的任何工作表上的 A1

【讨论】:

  • 谢谢你们的帮助...我想我从两组回复中都知道了...应该是:
  • ActiveCell.FormulaR1C1 = _ "=FORECAST.ETS([@Timeline],(" & Data.Address(ReferenceStyle:=xlR1C1) & "),(" & rngTime.Address(ReferenceStyle:= xlR1C1) & "):R[-1]C[-2],1,0)"
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多