inserer une ligne sous condition (VBA)

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pascal21

XLDnaute Barbatruc
bonjour le forum
après de multiples recherches sur le net, je n'ai pas trouvé de réponse que je puisse exploiter avec mes maigres connaissances en VBA
en gros tout est dans le titre et dans le fichier joint que j'ai essayé de rendre le plus explicite possible
il s'agit, par exemple, d'inserer sur la ligne 12 un texte si ligne 11 col G il y a "OK"
merci de votre aide
 

Pièces jointes

bonsoir le forum
je reviens vers vous car en voulant retranscrire et adapter le code de JOB75
Code (Text):
Sub Insertion_Tableaux1()
Dim P As Range, t, ref, rest(), d As Object, i&, n&, j%
Set P = Intersect(Range("a3:i" & Rows.Count), ActiveSheet.UsedRange.EntireRow)
If P Is Nothing Then Exit Sub
t = P.Resize(P.Rows.Count + 1).FormulaR1C1 'tableau des formules
ref = P.Resize(P.Rows.Count + 1).Columns(12) 'au moins 2 cellules "" pour col "ok"
ReDim rest(1 To UBound(t) + Application.CountIf(P.Columns(11), "ok"), 1 To 12)
'---détermination des lignes à traiter (dernier malus ok)---
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(t) - 1
If ref(i, 1) = "ok" And t(i + 1, 4) <> "Bonus période sans malus" Then d(t(i, 1)) = i
Next
'---création du tableau rest---
For i = 1 To UBound(t) - 1
n = n + 1
For j = 1 To 12
'****************
rest(n, j) = t(i, j)
'******************
Next
If i = d(t(i, 1)) Then
n = n + 1 'ligne ajoutée
rest(n, 1) = t(i, 1)
rest(n, 2) = t(i, 2) 'agence
rest(n, 3) = Date 'date du jour
rest(n, 4) = "Bonus période sans malus"
rest(n, 5) = t(i, 5) 'bonus caché
rest(n, 6) = t(i, 6) 'malus caché
rest(n, 7) = t(i, 7) 'bonus
rest(n, 8) = t(i, 8) 'malus
rest(n, 9) = t(i, 9) 'nbre de jours caché
rest(n, 10) = t(i, 10) 'Nbre de mois
rest(n, 12) = t(i, 12) 'bonus-malus
End If
Next
'---restitution---
Set P = P.Resize(n)
P.Rows(1).AutoFill P, xlFillFormats 'copie les formats
Application.DisplayAlerts = False 'facultatif, s'il y a des liaisons avec un classeur inconnu...
P.FormulaR1C1 = rest
End Sub


j'ai une erreur sur la ligne entre les ***********
alors qu'il fonctionnait au départ avant MES modifs
estce que vous voyez où est la betise que j'ai fait
dans le fichier joint le code est activé à l'ouverture de la feuille1
merci de votre aide

Pièces jointes:
 

Pièces jointes

Bonsoir Pascal, Bruno, le forum,

J'ai réétudié le problème (à partir du fichier du post #1) et c'est finalement assez compliqué.

Dans le fichier joint voyez les 5 noms définis Nom Date Malus Suivant Jours et la fonction VBA MalusSuivant.

La macro Insertion_Tableaux a aussi été revue (il n'y a plus de tests "ok").

Mes meilleurs vœux à tous pour 2017.

Bonne nuit.
 

Pièces jointes

Bonjour Pascal, le forum,

Notez que l'essentiel du temps de calcul est dû au tri initial et à la restitution finale :

Chez moi sur Win 10 - Excel 2013 avec le fichier précédent :

- tri initial 2,1 millisecondes

- création des tableaux VBA 0,71 milliseconde

- restitution finale 4,9 millisecondes.

Si l'on ajoute des Application.Calculation cela n'améliore pas la durée totale.

A+
 
Code:
Sub Insertion_Tableaux()
Dim P As Range, t, ub&, jours, rest(), i&, n&, j%, ok As Boolean
Set P = Intersect(Range("A10:k" & Rows.Count), ActiveSheet.UsedRange.EntireRow)
If P Is Nothing Then Exit Sub
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'si la feuille est filtrée
P.Sort P(1, 2), xlAscending, P(1), , xlAscending, P(1, 7), Header:=xlNo 'tri sur les dates
t = P.Resize(P.Rows.Count + 1).FormulaR1C1 'tableau des formules
ub = UBound(t) - 1
jours = P.Resize(P.Rows.Count + 1).Columns(7) 'au moins 2 cellules
ReDim rest(1 To ub + Application.CountIf(P.Columns(7), ">=90"), 1 To 7) ' ceci ">=90" à modifier si changement de la periode sans malus
'---création du tableau rest---
For i = 1 To ub
  n = n + 1
  For j = 1 To 11
'*********************************
    rest(n, j) = t(i, j)
'*********************************
  Next j
  ok = True
  For j = i + 1 To ub 'si plusieurs lignes de même nom et même date
    If t(j, 1) <> t(i, 1) Or t(j, 2) <> t(i, 2) Then Exit For
    If t(i + 1, 3) = "Bonus période longue sans malus" Then ok = False: Exit For
  Next j
  If Val(jours(i, 1)) >= Sheets("data").Range("g11").Value And ok Then
    n = n + 1 'ligne ajoutée
    rest(n, 1) = t(i, 1)
    rest(n, 2) = Date 't(i, 2) 'même date
    rest(n, 3) = "Bonus période longue sans malus"
    rest(n, 4) = t(i, 4) 'copie la formule en colonne D
    rest(n, 5) = t(i, 5) 'copie la formule en colonne e
    rest(n, 6) = t(i, 6) 'copie la formule en colonne f
    rest(n, 7) = t(i, 7) 'copie la formule en colonne g
    rest(n, 9) = t(i, 9) 'copie la formule en colonne i
    rest(n, 10) = t(i, 10) 'copie la formule en colonne j
    rest(n, 11) = t(i, 11) 'copie la formule en colonne k
   
  End If
Next i
'---restitution---
Application.DisplayAlerts = False 'facultatif, s'il y a des liaisons avec un classeur inconnu...
P.Resize(n).FormulaR1C1 = rest
End Sub
re
j'ai toujours une erreur sur la ligne entre les ***********
indice n'appartenant pas à la sélection
tableau qui va de A10 à la colonne K
merci de votre aide
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
26
Affichages
2 K
Retour