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

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

问题描述:

我一直在寻找一种方式做什么标题说,只是发现 后续线程: Excel: Listing Numbers In Between 2 NumbersExcel:如何列出一系列间隔的数字?

但是我的情况有点不同:存在这样的情况会 输入一些整数单元以逗号和/或连字符分隔,使得多个间隔(与在 许多打印对话框中找到的'页面范围'字段非常相似)。

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

而我需要的结果到另一个小区,但与上线分开,如下面各 数目被返回:

我可以做到这一点使用Excel本地函数,但仅在一个间隔 (例如:1-9)。除此之外,公式不起作用。

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

难道有人请指点一下吗?

任何帮助,非常感谢。

问候

[更新]

我已经使用的代码了几个星期,但只是意识到我需要避免以降序零,重复的数字,也号码。

例如

,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 
+2

嘿,这听起来像你正在投入一个完整的编码练习,而不是一个特定的问题:你可以举一些你在VBA中试过的例子吗? – neophlegm

+0

@neophlegm嗨对不起 –

+0

Hi @neophlegm。对不起。我想我无法用任何人都能理解的方式解释我的问题。无论如何,我正在尝试制作一个记录文件,其他用户可能会要求对某些文件进行一些更改(已编号)。因此,如果有人想对几个文档进行相同的更改,那么具有该间隔的单元格将与我使用excel的本机函数创建的引擎一起工作。唯一缺少的是VBA函数能够完成标题所说的内容。 –

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

下面是一个工作代码的例子。理想情况下,你会抽出一些重复的部分(重新调整输出数组的大小并添加下一个元素),但由于你的问题不是关于任何特定的东西,所以这是'正义'的作用 - 指向你正确的方向。把你提供到单元格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 

在此之上,某些假设,做出关于输入(分隔符是“”)。

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

+0

嘿@pwwolff。非常感谢您让我走向正确的方向! 我将它转换为函数,但结果不再分隔行中的数字。你可以帮帮我吗?我会回答我发布新代码的问题。 –

+0

嘿@pwwolff。你钉了它! 'Wrap Text'就是答案!再次谢谢你! –

+0

@PeterWhite太棒了 - 如果能解决你的问题,你能接受我的答案吗? – pwwolff