Excel VBA:计数分隔符的数量

Excel VBA:计数分隔符的数量

我有以下代码:

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), "*|*")

相关内容