VBA在连接函数中标识范围内的最后一个单元格

我正在写一个函数,将采取一系列的单元格,并在逗号分隔的单个单元格中返回它们的值。

所以三,四个股票代号将会是这样的:

GOOG, TSLA, APPL 

简单的方法是:

 For Each cell In rng Tickers = Tickers & cell.Value & ", " Next cell 

问题当然是,最后一个值会有一个逗号,这是不可取的。

所以我认为有可能包含一个If语句来改变最后一个单元格的输出:

 For Each cell In rng If cell = rng.Count - 1 Then Tickers = Tickers & cell.Value & "! " Else Tickers = Tickers + cell.Value & ", " End If Next cell 

但是,这似乎并没有工作我假设,因为cellrng可能不是简单的整数,所以count-1没有意义。

那么最好的办法是什么呢? 有没有一种方法可以让If语句知道单元格是否确实是最后一个范围?

我知道两种方式来做到这一点,第一是:

 For Each cell In rng times = times + 1 If times = rng.Count Then Tickers = Tickers + cell.Value & "! " Else Tickers = Tickers + cell.Value & ", " End If Next cell 

在这种情况下,每当你做循环variables次增加一个,所以当时间等于rng.count第一如果将被选中。

而另一种方式是不使用每个

 For cell = 1 to rng.Count If cell = rng.Count Then Tickers = Tickers + Cells(cell,column).Value & "! " Else Tickers = Tickers + Cells(cell,column).Value & ", " End If Next cell 

其中列variables是数据所在列的编号。

使用分隔符join一串string的最佳方法是使用VBA.Strings.Join函数,它需要一个一维数组和一个分隔符。 所以你首先需要把你的input范围变成一维数组。

这个答案解释了如何获得一个Range外的一维数组。

所以假设你的input范围是连续的,你可以这样做,然后使用VBA.Strings.Join函数连接结果。

例如,如果您的值是在Sheet1!A1:A10 ,则这一行可以得到由逗号分隔的10个值:

 VBA.Strings.Join(Application.Transpose(Sheet1.Range("A1:A10").Value),", ") 

如果范围不是连续的,那么使用源范围中的单元格Count Dim数组,使用For Each迭代每个单元格,填充数组,然后函数可以返回Join(theValues, ", ")

然后,如果你想附加一个感叹号,你不需要关心哪个单元格是最后一个单元格 – 你只需要在你的string后面加一个感叹号,就完成了。

你可以试试这个….

 Function CombineCellContent(ByVal Rng As Range) As String Dim cell As Range Dim str As String For Each cell In Rng If str = "" Then str = cell.Value Else str = str & ", " & cell.Value End If Next cell CombineCellContent = str End Function 

然后假设你的数据在A1:A3范围内,你可以使用下面这个函数…

 =CombineCellContent(A1:A3)