Signaler

Erreur 13

Posez votre question martinre - Dernière réponse le 19 mai 2017 à 14:39 par Patrice33740
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.


Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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...
Patrice33740 6170Messages postés dimanche 13 juin 2010Date d'inscription 23 octobre 2017 Dernière intervention - 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
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !