2017-10-05 5 views
0

Je cherchais un moyen de faire ce que dit le titre et vient de trouver le fil de suivi : Excel: Listing Numbers In Between 2 NumbersExcel: Comment lister les numéros d'une séquence d'intervalles?

Mais mon cas est un peu différent: il y a une cellule où sera dactylographiées des nombres entiers séparés par des virgules et/ou des traits d'union, rendant intervalles multiples (à peu près comme ce champ 'page' trouvé dans beaucoup de boîtes de dialogue d'impression).

Par exemple: 1-3,9-11,17,19,21-22,25

Et je dois le résultat à retourner dans une autre cellule, mais avec chaque numéro séparés sur les lignes, comme ci-dessous :

Je peux le faire en utilisant Excel des fonctions natives, mais pour une seule intervalle (par exemple: 1-9). Pour quelque chose de plus que cela, la formule ne fonctionne pas.

Existe-t-il un moyen d'accomplir tout cela dans VBA?

Quelqu'un pourrait-il me diriger vers une direction?

Toute aide est très appréciée.

Cordialement

[Mise à jour]

J'utilisant le code pour quelques semaines, mais juste de réaliser que je dois éviter des zéros, des chiffres répétés et aussi des numéros dans l'ordre décroissant.

par exemple.

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

Ainsi , J'ai besoin d'un #VALUE! un message d'erreur sera renvoyé si les nombres tapés ne sont pas dans l'ordre croissant ou si zéro ou des nombres répétés ont été trouvés.

Je travaille sur le code et déjà résolu les problèmes mentionnés ci-dessus pour seulement les intervalles typés (x-y), mais je ne peux pas trouver une solution pour les nombres discrets délimités par des virgules.

Toute aide est très appréciée.

Le code jusqu'à présent:

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

Hey, il semble que vous lancez un exercice de codage entier plutôt qu'un problème spécifique: pouvez-vous donner quelques exemples de ce que vous avez essayé dans VBA? – neophlegm

+0

@neophlegm Salut Désolé –

+0

Salut @neophlegm. Je suis désolé. Je pense que je ne pourrais pas expliquer mon problème d'une manière que n'importe qui pourrait le comprendre. Quoi qu'il en soit, j'essayais de créer un fichier d'enregistrement où d'autres utilisateurs pouvaient demander des modifications à certains documents (déjà numérotés). Ainsi, si quelqu'un veut apporter les mêmes modifications à plusieurs documents, la cellule avec cet intervalle fonctionnerait avec un moteur que j'ai fait en utilisant les fonctions natives d'Excel. Et la seule chose qui manque est une fonction VBA capable de faire ce que le titre dit. –

Répondre

0

Pour répondre à votre question: oui, il est possible.

Ci-dessous un exemple de code de travail. Idéalement, vous résumé quelques-unes des pièces répétitives sur (Redimensionnement de la matrice de sortie et en ajoutant l'élément suivant), mais étant donné que votre question ne portait pas sur quelque chose de précis, voici quelque chose qui « juste » fonctionne - pour vous diriger dans la bonne direction . Mettez ce que vous avez fourni dans la cellule A1 et la sortie requise sera écrite dans la cellule 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 

En plus de cela, certaines hypothèses sont faites sur l'entrée (séparateur est « »).

Bien sûr, vous pouvez convertir en fonction afin de pouvoir l'utiliser comme une formule directement dans Excel.

+0

Hé @pwwolff. Merci beaucoup de m'avoir placé dans la bonne direction! Je l'ai converti en une fonction, mais le résultat ne sépare plus les nombres en lignes. Pourriez-vous m'aider? Je vais répondre à ma question en postant le nouveau code. –

+0

Hé @pwwolff. Vous avez réussi! 'Wrap Text' est la réponse! Encore merci! –

+0

@PeterWhite super - pourriez-vous accepter ma réponse si elle a résolu votre problème? – pwwolff