inserer une ligne sous condition (VBA)

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

  • Classeur2.xlsx
    13.7 KB · Affichages: 73

pascal21

XLDnaute Barbatruc
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

  • mise en place bonus.xlsm
    19.7 KB · Affichages: 35

job75

XLDnaute Barbatruc
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

  • Insertion bonus(1).xlsm
    36.4 KB · Affichages: 53

job75

XLDnaute Barbatruc
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+
 

pascal21

XLDnaute Barbatruc
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
 

Discussions similaires

Réponses
5
Affichages
343
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 104
Messages
2 085 346
Membres
102 868
dernier inscrit
JJV