problème d'incompatibilité vba (non compatible excel<2007)

bernaroff

XLDnaute Junior
Bonjour, j'ai un soucis avec ma macro, lorsque j'éxecute ma macro me retourne une erreur d'execution (13) sur une incompatité

le ligne fautive (hou la pas belle):
If (l > 0 And ((Sheets("Puissance périodisée").Cells(4 + l, 5).Value < Sheets("Puissance périodisée").Cells(3 + l, 5).Value - moyenne) Or (Sheets("Puissance périodisée").Cells(4 + l, 5).Value > Sheets("Puissance périodisée").Cells(3 + l, 5).Value + moyenne)))

le l>0, c'est pour démarrer après la première et ne pas tomber sur les titres en l+3, dans les Sheets("Puissance périodisée").Cells ce ne sont que des integer, et moyenne également, malgré tout j'ai un problème d'incompatibilité et je pense que ça doit être dans la façon dont c'est écrit

si quelqu'un peut m'aider je suis vraiment à cours d'idée
merci
Bernaroff
 
Dernière édition:
G

Guest

Guest
Re : problème d'incompatibilité vba

Bonjour,

Difficile de répondre juste sans fichier exemple.
As-tu des cellules "pseudo-vides" dans tes colonnes. (Cellule avec une chaine vide "" ou caratère non imprimable)
Comment est déclaré i

Etc.

A+
 

bernaroff

XLDnaute Junior
Re : problème d'incompatibilité vba

Sub fonction()

Application.ScreenUpdating = False

'supprime les feuilles Calcul et Puissance périodisée si elles existent
If Sheets(Sheets.Count).Name = "Calcul" Then
Sheets("Calcul").Visible = 1
Sheets("Calcul").Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
End If

If Sheets(Sheets.Count).Name = "Puissance périodisée" Then
Sheets("Puissance périodisée").Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
End If

'créer les feuilles
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "Puissance périodisée"

Sheets("Puissance périodisée").Cells(3, 1) = "Début cycle"
Sheets("Puissance périodisée").Cells(3, 3) = "Fin cycle"
Sheets("Puissance périodisée").Cells(3, 5) = "Puissance moyenne cycle"
Sheets("Puissance périodisée").Cells(3, 6) = "perte sur objectif"
Dim i As Long, moyenne As Long, debut As Integer, j As Integer, prod As Double, l As Integer, k As Integer, nbcells As Long, m As Integer
m = 0
debut = 1
prod = 0
moyenne = 0
l = 0
For nbcells = 2 To 750
If Not IsEmpty(Sheets("Points 10").Cells(nbcells, 10).Value) Then
m = m + 1
End If
Next nbcells
For k = 3 To m
moyenne = moyenne + Sheets("Points 10").Cells(k, 10).Value
Next k
moyenne = moyenne * 0.3 / (m)
'moyenne = 50
Dim nom As String
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "Calcul"

'remplir les plages de données
For i = 4 To m
If ((Sheets("Points 10").Cells(i, 10).Value > Sheets("Points 10").Cells(i - 1, 10).Value + moyenne Or Sheets("Points 10").Cells(i, 10).Value < Sheets("Points 10").Cells(i - 1, 10).Value - moyenne Or i = m) And i - debut - 3 > 6) Then
Sheets("Puissance périodisée").Cells(4 + l, 1).Value = Sheets("Points 10").Cells(debut + 2, 1).Value
Sheets("Puissance périodisée").Cells(4 + l, 2).Value = Sheets("Points 10").Cells(debut + 2, 2).Text
Sheets("Puissance périodisée").Cells(4 + l, 3).Value = Sheets("Points 10").Cells(i - 1, 1).Value
Sheets("Puissance périodisée").Cells(4 + l, 4).Value = Sheets("Points 10").Cells(i, 2).Text
For j = debut + 2 To i - 1
prod = prod + Sheets("Points 10").Cells(j, 10).Value
Next j
Sheets("Puissance périodisée").Cells(4 + l, 5).Value = prod / (i - debut - 2)
Sheets("Puissance périodisée").Cells(4 + l, 6).Value = Sheets("Points 10").Cells(i - 1, 12).Value - Sheets("Puissance périodisée").Cells(4 + l, 5).Value
If (i = m) Then
Sheets("Puissance périodisée").Cells(4 + l, 3).Value = Sheets("Points 10").Cells(m, 1).Value
Sheets("Puissance périodisée").Cells(4 + l, 4).Value = Sheets("Points 10").Cells(m, 2).Text
prod = prod + Sheets("Points 10").Cells(m, 10).Value
Sheets("Puissance périodisée").Cells(4 + l, 5).Value = prod / (m - debut - 1)
Sheets("Puissance périodisée").Cells(4 + l, 6).Value = Sheets("Points 10").Cells(i - 1, 12).Value - Sheets("Points 10").Cells(4 + l, 5).Value
End If
If (l > 1 And ((Sheets("Puissance périodisée").Cells(4 + l, 5).Value < Sheets("Puissance périodisée").Cells(3 + l, 5).Value - moyenne) Or (Sheets("Puissance périodisée").Cells(4 + l, 5).Value > Sheets("Puissance périodisée").Cells(3 + l, 5).Value + moyenne))) Then
Sheets("Puissance périodisée").Cells(3 + l, 3).Value = Sheets("Puissance périodisée").Cells(4 + l, 3).Value
Sheets("Puissance périodisée").Cells(3 + l, 4).Text = Sheets("Puissance périodisée").Cells(4 + l, 4).Text
Sheets("Puissance périodisée").Cells(3 + l, 5).Value = 0.5 * Sheets("Puissance périodisée").Cells(3 + l, 5).Value * Sheets("Puissance périodisée").Cells(4 + l, 5).Value
l = l - 1
End If

Dim n As Integer
For n = 0 To m / 24
Sheets("Calcul").Cells(24 * n + 1, 1).Value = Sheets("Points 10").Cells(24 * n + 3, 1).Text
Next n
For n = debut + 2 To i - 1
Sheets("Calcul").Cells(n - 2, 2).Value = Sheets("Puissance périodisée").Cells(4 + l, 5).Value
Next n
prod = 0
debut = i - 2
l = l + 1
End If
Next i

'créer le graphique
Sheets("Calcul").Activate
Columns("C:C").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("'Calcul'!$B:$B")
ActiveChart.ChartType = xlLine
ActiveChart.SeriesCollection(1).XValues = "='Calcul'!$A:$A"
Sheets("Calcul").Select
ActiveChart.Legend.Select
ActiveChart.SeriesCollection(1).Name = "=""Puissance périodisée"""
Selection.Delete
ActiveChart.ChartArea.Copy
Sheets("Puissance périodisée").Activate
ActiveSheet.Paste
ActiveSheet.ChartObjects(1).Left = Range("H2").Left
ActiveSheet.ChartObjects(1).Top = Range("H2").Top

For j = 1 To 6
Range(Cells(1, j), Cells(3, j)).Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.MergeCells = True
End With
Next j

Sheets("Calcul").Visible = 0
Sheets("Synthèse").Select
End Sub

voila le reste de mon module, seulement je peux pas vraiment donner d'exmple puisque le fichier est assez lourd (non téléchargeable sur ce site) avec une dizaine de module
si tu arrives à le comprendre (et surtout si tu as le courage de le lire, c'est assez ennuyeux)...
 
G

Guest

Guest
Re : problème d'incompatibilité vba

Re,

Dans
Code:
Sheets("Puissance périodisée").Cells(3 + l, 5).Value - moyenne)
(2 fois présente dans ta condition).
à la première boucle l vaut 3 donc .Cells(3+l,5) = la cinquième colonne de la ligne d'entête de ton tableau de la feuille "Puissance périodisiée"

Correction
Code:
 Sheets("Puissance périodisée").Cells(4+ l, 5).Value - moyenne)

Ou alors initialiser l à 1 avant la boucle.

P.s. où l'on voit l'intérêt :
1 - d'un fichier exemple
2 - de la fenêtre d'execution de vbe (CTRL+G) pour affichage des variables par en mode pas à pas:
?Sheets("Puissance périodisée").Cells(3 + l, 5).Value
A+
 

bernaroff

XLDnaute Junior
Re : problème d'incompatibilité vba

si dans le code enlève les 5 lignes du if qui posent problème, tu as un apperçu de ce que je souhaite faire, ce que je souhaite rajouter, c'est enlever les valeurs qui sont trop proches les unes des autres pour seulement gardé une courbe par palier montrant les changements important
dans la conditions j'ai donc un (valeur courante)<(valeur précédente)-pas et un (valeur courante)>(valeur précédente)+pas
je vois bien sinon que le l pose problème, mais en mettant dans la condition if (l>0) je pense que cela règle le problème de la première incrémentation non ?
 
G

Guest

Guest
Re : problème d'incompatibilité vba

Re,

If te faut alors faire 2 if imbriqués car la totalité des membre d'une condition IF est évaluée

Code:
IF l>0 then
    IF ((Sheets("Puissance périodisée").Cells(4 + l, 5).Value < Sheets("Puissance périodisée").Cells(3 + l, 5).Value - moyenne) Or (Sheets("Puissance périodisée").Cells(4 + l, 5).Value > Sheets("Puissance périodisée").Cells(3 + l, 5).Value + moyenne))) Then
   'Le code de traitement
   End IF
End IF



Prochain message écrit de cette façon (sans aération, ni Re bonjour ou Re, ni merci) je ne répond plus. On n'est pas des machines.

A+
 

bernaroff

XLDnaute Junior
Re : problème d'incompatibilité vba

bon de toute évidence tu as raison, c'est bien la première incrémentation du l qui pose problème, seulement je ne souhaite pas que le if qui pose problème se fasse sur la première incrémentation mais ne commence qu'à la deuxième ...
j'ai essayé avec un l<>0 ou un l>0 mais rien ne marche...

merci beaucoup pour ton aide
 

bernaroff

XLDnaute Junior
Re : problème d'incompatibilité vba

Re

d'abord je m'excuse pour mon ton un peu tranchant, malheureusement je n'ai aucune patience avec la programmation et lorsque j'ai un bug ça m'énerve assez vite, mais ne le prends pas contre toi...

enfin merci beaucoup pour ton aide et ta patience, il me reste un ou deux trucs à fixer la dedans et je devrais pouvoir le faire fonctionner

Cdt
Bernaroff
 
G

Guest

Guest
Re : problème d'incompatibilité vba

RE,

dans le code de la première itération:

Code:
If l>0 Then

 
   'Je mets ici le traitement qui n'est pas concerné par la 
première itération

 
End if

 
 

 
'Je mets ici le traitement concerné par TOUTES les itérations
'.......
'......
'Après incrémentation de l le traitement contenu dans If l>0 sera exécuté 
à la prochaine itération
l=l+1

N'est-ce pas ce que tu souhaites?

A+
 

bernaroff

XLDnaute Junior
Re : problème d'incompatibilité vba

Re

En fait ta solution avec un double if imbriqué a très bien marché, mais du coup après un autre problème s'est afficher, et ce sont mes indices qui n'étaient pas bon

en PJ le résultats de ce que je cherchais

Merci et bonne fin d'après midi
Bernaroff
 

Pièces jointes

  • exemple 3.xls
    218.5 KB · Affichages: 48
  • exemple 3.xls
    218.5 KB · Affichages: 52
  • exemple 3.xls
    218.5 KB · Affichages: 48
G

Guest

Guest
Re : problème d'incompatibilité vba

Re,

Résoudu alors:) Merci du retour et du fichier qui fonctionne.

Ta pièce jointe bien que en .xls ne peut fonctionner que sur une version Excel 2007
AddChart n'existe pas pour les objets Shapes en version inférieures.

Ré-édite ton post et signale l'incompatibilité du fichier avec version <2007, pour les futurs forumeurs ce sera utile.

A+
 

Statistiques des forums

Discussions
312 465
Messages
2 088 659
Membres
103 910
dernier inscrit
amor57