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

在MS Excel VBA上。如何在范围公式上使用当前(非活动)行的值?,vba,excel,this,trim,Vba,Excel,This,Trim,让我们看看。我有一个整个列的命名范围,比如a:a命名的MyColumn。 如果我放在B1单元格中,公式=MyColumn。。。它会自动获取与MyColumn相交的MyColumn上的细胞,在本例中,当然是A1。 我可以将这个公式从B1拖放到B5,其值将从A1到A5。我们对此没有意见 我需要在VBA上使用此逻辑编写公式。使用ActiveCell.Row对我来说毫无意义,因为如果我从B1拖放到B5。。。所有单元格填充为B1,如下所示: Function Test(ByVal a As Range)

让我们看看。我有一个整个列的命名范围,比如a: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
Function TrimIndented(ByVal tText As Range) As String
    TrimIndented = RTrim(tText(ActiveCell.Row))
End Function
根据以上内容,我的结果如下:

Function Test(ByVal a As Range) As String
    Test = a(ActiveCell.Row)
End Function
valor1  | valor1
valor2  | valor1
valor3  | valor1
valor.. | ...
valorn  | valor1
Function TrimIndented(ByVal tText As Range) As String
    TrimIndented = RTrim(tText(ActiveCell.Row))
End Function
仅当我选择一个单元格,按F2键,然后输入时,该值才是固定的

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

Function Test(ByVal a As Range) As String
    Test = a(ActiveCell.Row)
End Function
valor1  | valor1
valor2  | valor1
valor3  | valor1
valor.. | ...
valorn  | valor1
Function TrimIndented(ByVal tText As Range) As String
    TrimIndented = RTrim(tText(ActiveCell.Row))
End Function
在对web进行了一次轻度深入的研究之后,我只找到了使用Active Cell的解决方案,但我发现了有关此工作簿的一些内容,它引用了当前运行代码的书,而不是Active Cell。我需要那样的东西,但是要一个牢房

你能帮帮我吗

===-编辑

我需要保留前导空格。 内置公式=修剪单元格修剪尾随和前导空间 NamedRangeA可以包含任意数量的值,RangeB应始终包含公式ready。 它将类似于一个模板 ====-


谢谢,问候:

这能解决您的问题吗

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 Test(ByVal a As Range) As String
    Test = RTrim(a.Value)
End Function
然后在单元格B1中,输入公式=TestA1。现在,您将能够向下拖动公式

编辑

如果您仍然想坚持原来的方法,那么将函数更改为

Function Test(Rw As Long, ByVal a As Range) As String
    Test = RTrim(a(Rw).Value)
End Function
然后使用=TestROW,MyColumn作为公式。现在,您可以拖放:


尝试下面这样的自定义项

注意到,对于部署到客户端的UDF,应该通过在循环之前加载范围到数组中来改进其在大型数据集上的性能,还考虑将其适配为处理输入数组等以及Excel公式中的各种其他经常遇到的类型。这是为了让它具有用户期望的内置功能的功能和性能

用法如下:

在字符串上使用:=RTRIM hello return:hello 在单个单元格上使用:=RTRIMA1返回A1=hello:hello这当然可以拖到列等 用作数组公式选择范围B1:B5,输入以下公式并按Ctrl+Shift+enter键输入:=RTRIMA1:A5返回:A1:A5中每个单元格的数组,依次为{a,b}等 要使用定义的名称对此行的交集进行操作,请使用INDEX缩小范围,如:=RTRIMINDEXmyName,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

只是想了解您想要的:您正在尝试从A1>b1复制值并修剪值?函数myFunccell作为Range:myFunc=RTrimcell:End函数有什么问题,然后传入相关的单元格?也许我不理解你的问题。如果你只使用A列和b列。。这个伪公式怎么样:选择b1:insert formula=TrimA1:copyDown使用xlDown向下复制公式?这样就可以设置整个列,显示相邻单元格中的修剪值。@krishKM,是的,我需要将命名范围传递给我的函数,并让函数在其当前行中获取特定值。该函数将与指定的Range@Cygemth:正如前面的评论者所问,我不明白为什么您要使用vba来完成这个简单的任务?如果你真的想那样做,跟着我的假哈哈哈,你赢了我。我打算使用Left.RangeA&I,Len.RangeA&I-1,但不完全是这样,因为我需要将范围或命名范围作为函数的参数传递,以便它可以在多个范围/工作表上使用。然而,是的,这就是我的想法另一方面如果我尝试使用As Range和RTrima.Value,结果会出现PoundValue错误:@Cygemth:上面的代码都经过了尝试和测试:如果你想在其他表单中使用它,为什么不使用第一个选项呢。@SiddharthRout但不得不承认RTrim看起来更优雅:+1实际上我传递给公式的参数更像是=TestA:AI喜欢它,只是因为它是一个数组公式,一般来说非常棒,如果需要更改要操作的行数,我需要重写Ctrl+Shift+输入公式。如果不是像你正确地说的那样查看整个输入数组,而是识别从哪个单元格/行调用它,那就太好了。独立于ActiveCell。有什么想法吗@Cygemth请参阅使用示例4-这将为有问题的行返回RTrim哦,是的,它也可以工作。。。如果我把你的代码和Application.Caller.Row属性结合起来。。。它不需要嵌套索引函数,同时保留了大部分乐趣
多义性。它只会丢失数组函数。。。让我试试!:又是DHi!是的,它有效!!我只是用Application.Caller.Row属性替换了循环,正如@RBarryYoung所说的那样。谢谢你们两位!我会将我的最终代码添加到您的答案中,以便与我的问题和您的答案一起公开!谢谢