String 在第n个逗号后将单元格中的字符串拆分为多个字符串/单元格
所以我有一个Excel电子表格,大约有20个单元格,其中包含股票代码,每个单元格用逗号分隔。有些行有8-10个标记;有些人超过50岁 对于我使用的其中一个网站,它们将您一次可以查询的股票代码数量限制为12个。因此,对于超过12个标记的行,我希望能够让excel自动(通过运行VBA脚本或在相邻单元格中输入公式)在相邻单元格中输入第13-24个标记 例如,如果我在D1中有:String 在第n个逗号后将单元格中的字符串拆分为多个字符串/单元格,string,excel,vba,excel-formula,String,Excel,Vba,Excel Formula,所以我有一个Excel电子表格,大约有20个单元格,其中包含股票代码,每个单元格用逗号分隔。有些行有8-10个标记;有些人超过50岁 对于我使用的其中一个网站,它们将您一次可以查询的股票代码数量限制为12个。因此,对于超过12个标记的行,我希望能够让excel自动(通过运行VBA脚本或在相邻单元格中输入公式)在相邻单元格中输入第13-24个标记 例如,如果我在D1中有: gs,fb,lnkd,nflx,aapl,goog,amzn,tsla,bidu,cmg,twtr,tsla,kors,pcl
gs,fb,lnkd,nflx,aapl,goog,amzn,tsla,bidu,cmg,twtr,tsla,kors,pcln.yhoo
我希望Excel将上述字符串保留在A1中,但将以下两个字符串放在E1和F1中:
E1 = gs,fb,lnkd,nflx,aapl,goog,amzn,tsla,bidu,cmg,twtr,tsla
F1 = ,kors,pcln.yhoo
另外,正如我提到的,一些单元格可能有50个以上的标记,因此理想情况下,代码能够将24-36个标记放在G1中,将37-48个标记放在H1中,等等
我相信这是相对简单的,但我对编码相当无知,尽管我有使用VBA的基本能力。感谢您提供的帮助。以下功能完全满足您的要求:
Function nextN(r As Range, s As Integer, n As Integer, Optional d)
' for a given range, split string by delimiter d (default: comma)
' then return at most n values starting at the s-th
If IsMissing(d) Then d = ","
splitarray = Split(r.Text, d)
If UBound(splitarray) > s Then
If (UBound(splitarray) > s + n) Then lastVal = s + n - 1 Else lastVal = UBound(splitarray)
For ii = s To lastVal
retval = retval & splitarray(ii) & ","
Next ii
nextN = Left(retval, Len(retval) - 1) ' strip last comma
Exit Function
End If
nextN = ""
End Function
如果您的长字符串位于单元格A1
,uou将在单元格B1中输入以下等式:
=nextN($A1, 12*(COLUMN()-2), 12)
然后将方程式拖到C、D、E……列,再拖到第2、3……行
以下是一个屏幕截图:
如果代码中的注释不清楚:
函数的第一个参数是带有“用逗号分隔的许多股票代码”的单元格
第二个参数是单元格中的偏移量:偏移量0
表示“从开头开始”,偏移量12
表示“跳过前12个”,等等。在这种情况下,我使用工作表函数COLUMN()
获取列号(B=2),以计算偏移量(如果您希望数据块为12,则B列中的偏移量必须为0,C列中的偏移量必须为12,以此类推。此公式可为您动态计算这些数字)
第三个参数是要返回的(最大)元素数
正如您在示例中所看到的,如果您要求的元素比实际的元素多,它只会在可用的数字处停止。@user3133470如果这回答了您的问题,您会将此答案标记为“已接受”吗?这是问题旁边的一个小复选标记…如果有人知道这个答案的什么值得投反对票,我很高兴听到它;它让我困惑…+1的工作answer@floris-我看了又看,但我找不到任何东西可以让我选择您的回答为“已接受”这是我在屏幕上看到的:谢谢。你正在看问题(我的错,那是我让你看的…),你需要看答案。在“分数”下面有一个灰色复选框。