![Excel VBA:计数分隔符的数量](https://linux22.com/image/1463890/Excel%20VBA%EF%BC%9A%E8%AE%A1%E6%95%B0%E5%88%86%E9%9A%94%E7%AC%A6%E7%9A%84%E6%95%B0%E9%87%8F.png)
我有以下代码:
Sub CopyTest()
Dim skuRow As Integer
Dim curSku As String
Dim numSkus As Integer
Dim impType As String
Dim copyRows As Integer
Dim supAcc As String
Dim arr_TotalList As Variant
Dim locs As String
Dim colorMax As String
With ActiveSheet
copyRows = 3
impType = "-LE"
supAcc = ""
numSkus = Sheets(2).Cells(Sheets(2).Rows.Count, "A").End(xlUp).Row
skuRow = 1
Rows("1:" & copyRows).Copy
For i = copyRows + 1 To (copyRows * numSkus) + 1 Step copyRows
arr_TotalList = Split(CurVal, "|")
colorMax = Sheets(2).Range("C" & skuRow).Value
If colorMax = "" Then
colorMax = "4"
End If
curSku = Sheets(2).Range("A" & skuRow).Value
locs = Sheets(2).Range("B" & skuRow).Value
arr_TotalList = Split(locs, "|")
Range("A" & i).Select
ActiveSheet.Paste
For n = 0 To copyRows - 1 Step 1
If n = 0 Then
Range("B" & i + n) = supAcc & curSku & impType
Range("E" & i + n) = colorMax
Else
Range("G" & i + n) = arr_TotalList(n - 1)
Range("B" & i + n) = supAcc & curSku & impType
End If
Next n
skuRow = skuRow + 1
Next i
End With
End Sub
此代码基本上使用 Sheet 1 中的数据模板并复制该模板并从 Sheet 2 中实现数据,无论在“copyRows”中设置多少次
现在,每次我更改“copyRows”数量时,我都必须调整 Sheet 1 中的模板。例如,如果 copyRows 为 4,则在 Sheet 1 中,模板将包含 4 行预定义的内容,第一行是必需的,接下来的行基于 Sheet 2 数据中值的“|”分隔符。例如,Sheet 2 的 B 列包含“Test1|Test2|Test3”这样的数据
我正在尝试进一步自动化此代码,这样我就不必手动更改 copyRows 并在模板表中添加或删除其他行。在模板表中,我希望只有两行,第一行是必需的,第二行将基于“|”分隔符值的数量。
例如,我正在考虑为 copyRows 添加一个计数公式,=LEN(Sheets(2).B:B)-LEN(SUBSTITUTE(Sheets(2).B:B,"|",""))
然后添加 1。我该如何为 copyRows 输入公式?
答案1
此函数将查找工作表 B 列中“|”字符出现的次数。
Function FindDelimeters()
Dim lastrow As Long
Dim DelimCount As Long
lastrow = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row
DelimCount = Sheets(2).Evaluate("=SUM(LEN(B1:B" & lastrow & ")-LEN(SUBSTITUTE(B1:B" & lastrow & ",""|"","""")))")
FindDelimeters = DelimCount
End Function
答案2
我不能 100% 确定源数据是什么样的,但我认为您可以先定义 skuRow,然后按如下方式设置 copyRows:
copyRows = 1 + UBound(Split(Sheets(2).Range("B" & skuRow).Value, "|"))
答案3
其他选择
=COUNTIF(B:B/"*|*")
Application.CountIf(Sheets(2).Columns(2), "*|*")