VB, insertion d'une ligne si cellule est supérieure à...

ceddeg

XLDnaute Nouveau
Bonjour à tous,

Je suis habitué à enregistrer mes macros dans excel, puis les retravailler dans vb.
Mais dans le cas ci-dessous, je coince.

J'ai un tableau en 2 colonnes, la colonne A contient un code, la colonne B une valeur.
Je dois pouvoir créer une macro qui :
Si une valeur dépasse 99, elle crée 2 lignes avec le même code et split les valeurs pour ne pas dépasser 99.
Soit :

Code1 131

Doit devenir

Code1 99
code1 32

Merci d'avance.

ceddeg
 

Pièces jointes

  • probleme.xlsx
    8.1 KB · Affichages: 32
  • probleme.xlsx
    8.1 KB · Affichages: 34

thebenoit59

XLDnaute Accro
Re : VB, insertion d'une ligne si cellule est supérieure à...

Bonjour ceddeg.

Une première solution:
Code:
Option Explicit

Sub Inférieur_100()
Dim i As Integer, c As Variant, a
Dim ShD As Worksheet, ShR As Worksheet
Dim d As Object

Set ShD = Sheets("Données"): Set ShR = Sheets("Résultat désiré")
Set d = CreateObject("Scripting.Dictionary")

With ShD
For i = 1 To .[a65000].End(xlUp).Row
If .Cells(i, 2).Value < 100 Then
d(.Cells(i, 1).Value) = .Cells(i, 2).Value
Else: d(.Cells(i, 1).Value) = 99 & ":" & (.Cells(i, 2).Value - 99)
End If
Next i
End With

With ShR
i = 1
For Each c In d.keys
a = Application.Transpose(Split(d(c), ":"))
.Cells(i, 4).Resize(UBound(a), 1).Value = c
.Cells(i, 5).Resize(UBound(a), 1).Value = a
i = i + UBound(a)
Next c
End With

End Sub
 

ceddeg

XLDnaute Nouveau
Re : VB, insertion d'une ligne si cellule est supérieure à...

Je pense que c'est ok en modifiant ainsi :


Sub Inférieur_100()
Dim i As Integer, c As Variant, a
Dim ShD As Worksheet, ShR As Worksheet
Dim d As Object

Set ShD = Sheets("Données"): Set ShR = Sheets("Résultat désiré")
Set d = CreateObject("Scripting.Dictionary")

With ShD
For i = 1 To .[a65000].End(xlUp).Row
If .Cells(i, 2).Value < 100 Then
d(.Cells(i, 1).Value) = .Cells(i, 2).Value
Else: d(.Cells(i, 1).Value) = 99 & ":" & (.Cells(i, 2).Value - 99)
End If
Next i
End With

With ShD
i = 1
For Each c In d.keys
a = Application.Transpose(Split(d(c), ":"))
.Cells(i, 1).Resize(UBound(a), 1).Value = c
.Cells(i, 2).Resize(UBound(a), 1).Value = a
i = i + UBound(a)
Next c
End With

End Sub
 

thebenoit59

XLDnaute Accro
Re : VB, insertion d'une ligne si cellule est supérieure à...

C'est une solution.
A ce moment, évite les balises With en double.
Et au lieu d'écraser les valeurs, effectue plutôt un ClearContents de A1 à B&dernière ligne avant de remettre les valeurs.
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 070
Membres
103 453
dernier inscrit
Choupi