Erreur 13

Fermé
martinre - Modifié le 19 mai 2017 à 21:59
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 19 mai 2017 à 14:39
Bonjour,

Je suis actuellement en stage dans une entreprise de TP et je souhaite mettre en place des macros pour automatiser les arrêtés de compte.

J'ai un problème sur une formule qui fonctionne avec "sum" mais qui ne fonctionne pas avec "if". En effet, je voudrai que la macro écrive la formule =SI(Produit<>0(ex:A15);Marge(ex:C15)/A15;""). Il faut que ca s'écrive dans la case D15.

La macro est donc :

Sub Totaux()

' définitions:
Dim Sheets As Integer
Dim CptLig As Integer
Dim CptCol As Integer
Dim NbLigne As Integer
Dim NbColonne As Integer

' Compte les éléments
NbOnglet = Worksheets.Count

For Sheets = 1 To NbOnglet
    ' Compte le nombre de ligne
    NbLigne = Worksheets(Sheets).Cells.SpecialCells(xlCellTypeLastCell).Row
    ' Compte le nombre de colonne
    NbColonne = Worksheets(Sheets).Cells.SpecialCells(xlCellTypeLastCell).Column
Next

' On parcourt tous les onglets
For Sheets = 1 To NbOnglet
    ' On parcourt les colonnes
    For CptCol = 6 To NbColonne
        ' On remplace la somme dans les colonnes de pourcentage par des if
        If CptCol = 9 Or CptCol = 13 Or CptCol = 21 Or CptCol = 25 Or CptCol = 29 Or CptCol = 33 Then
            <bold>Worksheets(Sheets).Cells(NbLigne + 1, CptCol).Formula = "=if(" + Cells(NbLigne + 1, CptCol - 3).Address(0, 0) <> 0 + ";" + Cells(NbLigne + 1, CptCol - 1).Address(0, 0) / Cells(NbLigne + 1, CptCol - 3).Adress(0, 0) + ";" + "" + ")"</bold>
        End If
    Next
Next


La formule en gras m'indique une erreur 13 d'incompatibilité et je n'arrive pas a comprendre pourquoi puisque la formule pour une somme (ci dessous) fonctionne...
Worksheets(Sheets).Cells(NbLigne + 1, CptCol).Formula = "=sum(" + Cells(4, CptCol).Address(0, 0) + ":" + Cells(NbLigne, CptCol).Address(0, 0) + ")"


J'espère que quelqu'un pourra m'aider...

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.


A voir également:

2 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
Modifié le 19 mai 2017 à 14:34
Bonjour,

Il y a de nombreuses erreurs sur cette ligne :
1) Sheets
est un mot du langage VBA, pour éviter toute ambigüité de compilation, il est impératif ne ne pas utiliser les mots du langage pour nommer des variables.
2) if(" + Cells
toujours pour éviter les ambigüités lors de la compilation, il est préférable d'utiliser "&" plutôt que "+" pour concaténer des chaines de caractères
3) Cells(NbLigne + 1, CptCol - 3).Address(0, 0) <> 0
a pour résultat True ou False, le "<> 0" doit être intégré à la chaine de caractères
4) CptCol - 3).Adress(0, 0)
en VBA adresse prend 2 d (Address)
5) + "" +
ajoute un seul double cote , pour en ajouter 2 il faut écrire : & """" &
PS:
6) + ";" +
En VBA, avec formula, le séparateur d'argument est la virgule, i.e. & "," &
Cependant tu peux aussi écrire les formules dans le langage courant (français) en utilisant FormulaLocal.

Ce qui pourrait donner :
Worksheets(NoSheet).Cells(NbLigne + 1, CptCol).Formula = "=if(" & Cells(NbLigne + 1, CptCol - 3).Address(0, 0) & "<> 0 ," & Cells(NbLigne + 1, CptCol - 1).Address(0, 0) & "/" & Cells(NbLigne + 1, CptCol - 3).Address(0, 0) & ","""")"


Cordialement
Patrice
0
Merci Patrice ca fonctionne en effet ! Pas toujours facile pour un stagiaire de trouver directement les bonnes formules et certaines choses m'ont échappé...surtout quand on galère pendant 2j...
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
19 mai 2017 à 14:39
Re,

Pour faciliter la détection d'erreur, tu peux utiliser une variable intermédiaire (en cas d'erreur tu peux voir la valeur de la variable dans la fenêtre variables locales)
Exemple :
formule = "=if(" & Cells(NbLigne + 1, CptCol - 3).Address(0, 0) & _
          "<> 0 ," & Cells(NbLigne + 1, CptCol - 1).Address(0, 0) & _
          "/" & Cells(NbLigne + 1, CptCol - 3).Address(0, 0) & ","""")"
Worksheets(NoSheet).Cells(NbLigne + 1, CptCol).Formula = formule
0