在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和性能。
用法如下:
- 在string上使用:
=RTRIM(" hello ")
(return:“hello”) - 在单个单元格上使用:
=RTRIM(A1)
(返回A1 =“hello”:“hello”)(这当然可以拖到一列等) - 用作数组公式(例如,范围B1:B5,在下面的公式中input并用Ctrl + Shift + Enterinput):
=RTRIM(A1:A5)
(返回:A1中每个单元格的数组:A5 RTrim反过来(例如{“a”,“b”}等) - 使用
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)
作为公式。 现在你将能够拖放:)