2017-10-05 11 views
0

私は 次のスレッドを見つけたものタイトルが言うと、ちょうど行うための方法を探していました: 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

こんにちは@neophlegm。ごめんなさい。私は誰もが理解できる方法で私の問題を説明することができなかったと思う。とにかく、私は、他のユーザーがいくつかの文書に変更を要求できるレコードファイルを作成しようとしていました(既に番号が付けられています)。したがって、複数のドキュメントに同じ変更を加えたい場合、その間隔のセルは、Excelのネイティブ関数を使用して作成したエンジンと一緒に動作します。そして唯一欠けているのは、タイトルが言っていることをすることができるVBAの機能です。 –

答えて

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 

をこの上に、一定の仮定は(セパレータは「」である)入力について作られています。

もちろんExcelで数式として直接使用できるように、これを関数に変換することができます。

+0

ちょっと@pwwolff。正しい方向に私を入れてくれてありがとう! 私はそれを関数に変換しましたが、結果はもはや行内の数値を分離していません。私たちを手伝ってくれますか?私は新しいコードを投稿して私の質問に答えます。 –

+0

ちょっと@pwwolff。あなたはそれを釘付け! 'Wrap Text'は答えです!再びありがとう! –

+0

@PeterWhite偉大な - あなたの問題を解決した場合私の答えを受け入れることができますか? – pwwolff

関連する問題