Excel:如何列出一系列间隔的数字?

时间:2017-10-05 23:27:11

标签: excel vba range sequence intervals

  

我一直在寻找一种方法来完成标题所说的内容并找到了   跟随线程:   Excel: Listing Numbers In Between 2 Numbers

     

但我的情况有点不同:有一个单元格会在哪里   输入一些用逗号和/或连字符分隔的整数,制作   多个间隔(非常类似于'页面范围'字段   许多打印对话框)。

     

例如:1-3,9-11,17,19,21-22,25

     

我需要在另一个单元格中返回结果,但每个单元格都要返回   在行上分隔的数字,如下所示:

     

1

     

2

     

3

     

9

     

10

     

11

     

17

     

19

     

21

     

22

     

25

     

我可以使用excel本机函数执行此操作,但只能使用一个时间间隔   (例如:1-9)。除此之外,公式不起作用。

     

有没有办法在VBA中完成所有这些?

     

有人可以指点一个方向吗?

     

非常感谢任何帮助。

     

此致

[更新]

我已经使用了几个星期的代码,但我意识到我需要避免使用零,重复的数字以及按降序排列的数字。

e.g。

0 下,1,3-的 10,8 下,12,14,的 16,16- 下,22,的 27,24 -30,36,的 42,39

因此,我需要一个#VALUE!如果键入的数字不是按升序排列,或者如果找到零或重复的数字,则返回错误消息。

我已经处理过代码并且已经解决了上述问题仅针对类型化的区间(x-y), 但我无法找到逗号分隔的离散数字的解决方案。

非常感谢任何帮助。

到目前为止的代码:

Function RANGEX(strInput As String) As String
Dim intCurrent  As Integer
Dim outputArray() As Variant
Dim intCount As Integer

intCount = 1

For Each i In Split(strInput, ",")
    ReDim Preserve outputArray(1 To intCount)

    If InStr(i, "-") > 0 Then
        If CInt(Split(i, "-")(0)) > 0 And CInt(Split(i, "-")(0)) < CInt(Split(i, "-")(1)) Then
            For x = CInt(Split(i, "-")(0)) To CInt(Split(i, "-")(1))
                intCurrent = x
                ReDim Preserve outputArray(1 To intCount)
                outputArray(intCount) = intCurrent
                intCount = intCount + 1
            Next x
        Else
            RANGEX = CVErr(xlErrValue)
        End If
    Else
        ReDim Preserve outputArray(1 To intCount)
        intCurrent = CInt(i)
        outputArray(intCount) = intCurrent
        intCount = intCount + 1
    End If

Next i

RANGEX = Join(outputArray, ",")

End Function

1 个答案:

答案 0 :(得分:0)

回答你的问题:是的,这是可能的。

下面是工作代码的示例。理想情况下,你会抽出一些重复的部分(调整输出数组的大小并添加下一个元素),但由于你的问题并不是针对任何具体的问题,所以这里只是“只是”。工作 - 指出你正确的方向。将您提供的内容放入单元格A1,并将所需的输出写入单元格B1:

Sub Testing()
Dim strInput As String
Dim strOutput As String
Dim intCurrent  As Integer
Dim outputArray() As Variant
Dim intCount As Integer

intCount = 1

strInput = ActiveSheet.Cells(1, 1)
For Each i In Split(strInput, ",")
    ReDim Preserve outputArray(1 To intCount)
    If InStr(i, "-") > 0 Then
        For x = CInt(Split(i, "-")(0)) To CInt(Split(i, "-")(1))
            intCurrent = x
            ReDim Preserve outputArray(1 To intCount)
            outputArray(intCount) = intCurrent
            intCount = intCount + 1
        Next x
    Else
        ReDim Preserve outputArray(1 To intCount)
        intCurrent = CInt(i)
        outputArray(intCount) = intCurrent
        intCount = intCount + 1
    End If
Next i
strOutput = Join(outputArray, vbCrLf)
ActiveSheet.Cells(1, 2) = strOutput
End Sub

除此之外,还对输入做了一些假设(分隔符是&#39;,&#39;)。

当然,您可以将其转换为函数,以便能够直接在Excel中将其用作公式。