Splitter un nombre via si et condition

Bonjour à toutes et tous,

Dores et déjà, je vous souhaite un joyeux Noël et une bonne et heureuse année 2019.

Est ce possible de splitter un nombre via un si ou faut il passer via une macro étant donné qu'il y a plusieurs conditions et ce pour des nombre allant de 1 jusque 25000.

Exemple :

1050 doit donner 1*500 et 1*550

2521 doit donner 2*1000 et 1*521

14032 doit donner 13*1000, 1*500 et 1*532.

Si le nombre est inférieur à 100, ça doit afficher une erreur

Ci-joint un fichier avec le résultat voulu et j'ai aussi fait un petit process du résultat voulu, mais je m'y perd.

Merci pour vos réponses.

David,

8split.xlsx (21.12 Ko)

Bonjour,

voici un exemple,

10david5-split.xlsx (21.64 Ko)

et Bonne Fêtes de fin d'année à toi également

Bonjour,

Et un autre à tester !...

Cdlt.

11split.xlsm (37.67 Ko)

Salut David,

Salut l'équipe,

Il y a des critères qui se mélangent, me semble-t-il, non ?

  • nombre en [A] ;
  • indice par mille en [B] ;
  • par 500 en [C] ;
  • le reste en [D].
Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim iNb%, iSplit%
'
Application.EnableEvents = False
If Not Intersect(Target, Range("A:A")) Is Nothing Then
    iNb = CInt(Target)
    For x = 1 To IIf(iNb < 100, 0, 2)
        For y = 1 To 25
            iSplit = IIf(iNb - (y * Choose(x, 1000, 500)) > 500, 2, IIf(iNb - (y * Choose(x, 1000, 500)) = 0, 0, 1))
            If iSplit < 2 Then _
                Target.Offset(0, x) = y - iSplit: _
                iNb = iNb - ((y - iSplit) * Choose(x, 1000, 500)): _
                Exit For
        Next
    Next
    Target.Offset(0, 3) = IIf(iNb = CInt(Target), "Erreur", iNb)
End If
Application.EnableEvents = True
'
End Sub

A tester, comme on dit...

A+

6split.xlsm (15.94 Ko)

Salut le forum,

petite erreur, à force de vouloir condenser, j'avais omis un petit détail concernant les < 100...

Target.Offset(0, 3) = IIf(iNb = CInt(Target) And iNb < 100, "Erreur", iNb)

Merci au camarade m'ayant mis la puce à l'oreille!

Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim iNb%, iSplit%
'
Application.EnableEvents = False
If Not Intersect(Target, Range("A:A")) Is Nothing Then
    iNb = CInt(Target)
    For x = 1 To IIf(iNb < 100, 0, 2)
        For y = 1 To 25
            iSplit = IIf(iNb - (y * Choose(x, 1000, 500)) > 500, 2, IIf(iNb - (y * Choose(x, 1000, 500)) = 0, 0, 1))
            If iSplit < 2 Then _
                Target.Offset(0, x) = y - iSplit: _
                iNb = iNb - ((y - iSplit) * Choose(x, 1000, 500)): _
                Exit For
        Next
    Next
    Target.Offset(0, 3) = IIf(iNb = CInt(Target) And iNb < 100, "Erreur", iNb)
End If
Application.EnableEvents = True
'
End Sub
4split.xlsm (15.97 Ko)

Bonjour,

Pour ma part, avec des éléments confus, j'ai opté pour une méthode pédagogique !

A adapter par david5.

La procédure pour information :

Public Sub Split_number()
Dim n As Long, i As Long, m As Double
    With ActiveSheet
        .Cells(1).CurrentRegion.Offset(1, 1).ClearContents
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            Select Case .Cells(i, 1).Value
                Case 0 To 100
                    .Cells(i, 1).Offset(, 1) = "Erreur"
                Case 101 To 999
                    With .Cells(i, 1)
                        .Offset(, 1).Value = 1
                        .Offset(, 2).Value = .Value
                    End With
                Case 1000 To 1099
                    With .Cells(i, 1)
                        .Offset(, 1).Value = 1
                        .Offset(, 2).Value = 1000
                        .Offset(, 3).Value = .Value - 1000
                    End With
                Case 1100 To 25000:
                    With .Cells(i, 1)
                        .Offset(, 1).Value = Int(.Value / 1000)
                        .Offset(, 2).Value = 1000
                        m = .Value - 1000 * Int(.Value / 1000)
                        If m <= 500 Then
                            .Offset(, 3).Value = m
                        Else
                            .Offset(, 3).Value = 500
                            .Offset(, 4).Value = m - 500
                        End If
                    End With
                Case Else:
            End Select
        Next
    End With
End Sub

Bonjour à toutes et tous,

Un grand merci à tous pour vos réponses contructives.

Et encore une bonne et heureuse année à vous tous et toutes.

David,

Rechercher des sujets similaires à "splitter nombre via condition"