如何在VBA函数中使用带填充的活动单元格行和列



我编写了一个函数,该函数将使用分隔符将所有单元格连接到该函数所在单元格的左侧。我的代码是:

Public Function Concat_To_Left(delim As String)
Dim C, R As Long
Dim S As String
Dim Cell As Range
Set Cell = ActiveCell
C = Cell.Column
R = Cell.Row
S = Cells(R, 1).Value
For i = 2 To (C - 1)
S = S & delim & Cells(R, i).Value
Next i
Concat_To_Left = S
End Function

如果计算单行,则此代码有效。我遇到的问题是,当我将函数填充到列的底部时(通过双击excel工作表中单元格的右下角(,cell.row和cell.column似乎是从第一个单元格保存的。这导致具有此函数的所有单元格都具有与从中填充的单元格相同的值。

屏幕更新、事件和警报均为开/关。Application.Calculation设置为xlCalculationAutomatic

有人能告诉我如何让这个函数在公式填充到的每个单元格上工作吗?为每个单元格使用正确的行和列(在填充时,列并不重要(?

Scott关于使用TEXT联接的评论是我试图实现的一种变通方法。

=TEXTJOIN(", ",TRUE,B2:INDEX(2:2,COLUMN()-1))

他提供的TEXTJOIN自定义代码链接也非常好:MS Excel-带有分隔符的Concat

添加Application.Volatile并不能使我的功能正常工作。我没有找到一种方法让我的函数在不需要范围参数的情况下使用fill-down,所以TEXTJOIN是下一个最好的选择,它现在回答了我的问题。

编辑:

我写这个宏是为了代替函数:

Private Sub Concat_To_Left()
Dim C, R, LR As Long
Dim Cell As Range
LR = ActiveWorkbook.ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
C = ActiveCell.Column
R = ActiveCell.Row

For Each Cell In ActiveWorkbook.ActiveSheet.Range(Cells(R, C), Cells(LR, C))
Cell.Value = Cells(Cell.Row, 1).Value
For i = 2 To (C - 1)
Cell.Value = Cell.Value & "|" & Cells(Cell.Row, i).Value
Next i
Next Cell

End Sub

这个使用"|"作为分隔符,从活动单元格向下填充到最后一行,将每个单元格连接到左侧,包括空格。

最新更新