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
但是,这似乎并没有工作我假设,因为cell
和rng
可能不是简单的整数,所以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)