在MS Excel VBA上。 如何在范围公式中使用当前(非活动)行的值?

让我们来看看。 我有一个整个列的命名范围,让说A:一个名为MyColumn。 如果我把单元格B1的公式“= MyColumn”…它会自动采取与“MyColumn”相交的“MyColumn”,在这种情况下,当然,A1的单元格。 我可以将这个公式从B1填充到B5,其值将从A1到A5。 我们可以这样做。

我需要使用这个逻辑在VBA上编写一个公式。 使用ActiveCell.Row对我来说是没有意义的,因为如果我从B1拖放到B5 …所有单元格被填充为B1,如下所示:

Function Test(ByVal a As Range) As String Test = a(ActiveCell.Row) End Function 

以上,我的结果是这样的:

 valor1 | valor1 valor2 | valor1 valor3 | valor1 valor.. | ... valorn | valor1 

只有当我select一个单元格时,该值是固定的,按F2然后input。

我究竟打算做什么? 我需要一个只能从单元格右侧修剪空格的函数,因为它的值是缩进的,但可以包含尾随空格。 我的实际function如下所示:

 Function TrimIndented(ByVal tText As Range) As String TrimIndented = RTrim(tText(ActiveCell.Row)) End Function 

经过对networking的深入研究之后,我只find了使用“活动单元”的解决scheme,但是我发现了一些关于“本书”的引用“当前运行代码”的东西,而不是活动的。 我需要这样的东西,但是对于一个细胞。

你能帮我么?

==== – 编辑

  • 我需要保留领先的空间。
  • 内置公式=修剪(单元格)修剪尾部和前导空格
  • NamedRangeA可以包含任意数量的值,并且RangeB将始终包含准备好的公式。
  • 这将会像一个模板

==== –

感谢致敬 :)

尝试像下面的UDF。

请注意,对于部署到客户端的UDF,您应该通过在循环之前将范围加载到数组中来提高其性能,还可以考虑使用它来处理input数组等等以及Excel公式中遇到的各种其他常见types。 这是为了赋予用户期望的内置function的function和性能。

用法如下:

  1. 在string上使用: =RTRIM(" hello ") (return:“hello”)
  2. 在单个单元格上使用: =RTRIM(A1) (返回A1 =“hello”:“hello”)(这当然可以拖到一列等)
  3. 用作数组公式(例如,范围B1:B5,在下面的公式中input并用Ctrl + Shift + Enterinput): =RTRIM(A1:A5) (返回:A1中每个单元格的数组:A5 RTrim反过来(例如{“a”,“b”}等)
  4. 使用INDEX来缩小这个范围,例如: =RTRIM(INDEX(myName,ROW()))

示例代码:

 Function RTRIM(ref) Dim i As Long, j As Long Dim results If TypeOf ref Is Range Then ReDim results(1 To ref.Rows.Count, 1 To ref.Columns.Count) For i = 1 To UBound(results, 1) For j = 1 To UBound(results, 2) results(i, j) = VBA.RTrim(ref(i, j)) Next j Next i RTRIM = results ElseIf VarType(ref) = vbString Then RTRIM = VBA.RTrim(ref) Else RTRIM = CVErr(XlCVError.xlErrValue) End If End Function 

这会解决你的问题吗?

 Sub Sample() Dim lRow As Long, i As Long With Sheet1 lRow = .Range("A" & .Rows.Count).End(xlUp).Row For i = 1 To lRow .Range("B" & i).Value = RTrim(.Range("A" & i).Value) Next i End With End Sub 

如果你真的想要一个function,那么试试这个

 Function Test(ByVal a As Range) As String Test = RTrim(a.Value) End Function 

然后在B1单元格中,input公式=Test(A1) 。 现在你将能够拖动公式。


编辑

如果你仍然想坚持原来的方法,那么改变你的function

 Function Test(Rw As Long, ByVal a As Range) As String Test = RTrim(a(Rw).Value) End Function 

然后使用=Test(ROW(),MyColumn)作为公式。 现在你将能够拖放:)

在这里输入图像说明