首页 > 解决方案 > 从数组 VBA 创建范围值

问题描述

我是 VBA 的新手。有人可以在这里帮助我吗

我有两个数组

Pages=(1,2,3,4,5,6,7,8,9,10)
Exclusion=(1,1,3,3,7)

我想编写一段代码来比较数组并给我一个像这样的输出

(1,2,3,4-6,7,8-10)

在迭代 Pages 数组时,如果 Exclusion 数组上有可用的值,我想在结果数组中保留单个元素,否则应将值分组

标签: arraysexcelvba

解决方案


这需要一点精度,我希望我做对了。这是我构造的函数。它没有将 4 放在一个单独的组中,因为它没有列在排除项中,但它肯定需要比我做的更多的测试。做我的客人哈哈:

Function Pagelist(Pages As Variant, _
                  Exclusions As Variant) As String
    ' 015

    Dim Fun() As String
    Dim n As Long
    Dim Excl As String
    Dim Sp() As String
    Dim i As Long

    ReDim Fun(LBound(Pages) + UBound(Pages))
    Excl = "," & Join(Exclusions, ",") & ","

    For i = LBound(Pages) To UBound(Pages)
        If InStr(Excl, "," & Pages(i) & ",") Then
            If Len(Fun(n)) Then n = n + 1
            Fun(n) = Pages(i)
            n = n + 1
        Else
            If Len(Fun(n)) Then
                Sp = Split(Fun(n), "-")
                If UBound(Sp) = 0 Then ReDim Preserve Sp(1)
                Sp(1) = Pages(i)
                Fun(n) = Join(Sp, "-")
            Else
                Fun(n) = Pages(i)
            End If
        End If
    Next i

    If n Then ReDim Preserve Fun(n)
    Pagelist = Join(Fun, ",")
End Function

出于测试目的,您可以使用如下过程调用该函数。

Private Sub Test()

    Dim Pages As Variant
    Dim Exclusions As Variant

    Pages = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    Exclusions = Array(1, 1, 3, 3, 7)
    Debug.Print Pagelist(Pages, Exclusions)
End Sub

推荐阅读