IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Suite trop grande de if ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    IGE
    Inscrit en
    Mars 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : IGE

    Informations forums :
    Inscription : Mars 2016
    Messages : 24
    Par défaut Suite trop grande de if ?
    Bonjour,

    j'ai un souci avec cette macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Range("AA2").Select
        ActiveCell.FormulaR1C1 = _
            "=IF(RC[-24]=1,""AOI1"",IF(RC[-23]=1,""AOI2"",IF(RC[-22]=1,""AOI3"",IF(RC[-21]=1,""AOI4"",IF(RC[-20]=1,""AOI5"",IF(RC[-19]=1,""AOI6"",IF(RC[-18]=1,""AOI7"",IF(RC[-17]=1,""AOI8"",IF(RC[-16]=1,""AOI9"",IF(RC[-15]=1,""AOI10"",IF(RC[-14]=1,""AOI11"",IF(RC[-13]=1,""AOI12"",IF(RC[-12]=1,""AOI13"",IF(RC[-11]=1,""AOI14"",IF(RC[-10]=1,""AOI15"",IF(RC[-9]=1,""AOI16"",IF(RC[-8]" & _
            "17"",IF(RC[-7]=1,""AOI18"",IF(RC[-6]=1,""AOi19"",IF(RC[-5]=1,""AOI20"",IF(RC[-4]=1,""AOI21"",IF(RC[-3]=1,""AOI22"",IF(RC[-2]=1,""AOI23"",IF(RC[-1]=1,""AOI24"",""""))))))))))))))))))))))))"
        Range("AA2").Select
        Selection.AutoFill Destination:=Range("AA2:AA300438")
        Range("AA2:AA300438").Select
    je ne comprend pas pourquoi, et ce que cela peux venir de la suite trop grande de fonction IF?
    lorsque j'en met moins cela marche.
    auriez vous une solution.
    merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Tu le dis toi-même : formule trop longue
    Solution 1 : une fonction personnalisée (elle sera utilisable comme n'importe quelle autre formule)
    Solution 2 : traiter directement par VBA
    Je préfère la seconde car il n'est jamais heureux de mélanger dans un même projet Formules et VBA

  3. #3
    Membre averti
    Homme Profil pro
    IGE
    Inscrit en
    Mars 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : IGE

    Informations forums :
    Inscription : Mars 2016
    Messages : 24
    Par défaut
    ok,

    je ne connais pas rand chose en VBA, c'est une macro que j'ai enregistré automatiquement.
    des conseils?

    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    des conseils ?
    Oui. Et un seul : t'intéresser à VBA (thème de cette section du forum)
    Car dans un cas (fonction personnalisée) comme dans l'autre (tout en VBA), il ne s'agit de rien d'autre que d'expressions conditionnelles simples (et au demeurant assez similaires quel que soit le langage de développement)

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 735
    Par défaut
    Bonjour,

    Ta formule est complexe sans que ce soit nécessaire.

    Il te faut quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ="AOI" & EQUIV(1; C2:Z2; 0)
    (vérifie si la plage est ok, j'ai toujours du mal avec la notation R1C1... :p)

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Promethee25 Voir le message
    Bonjour,

    (vérifie si la plage est ok, j'ai toujours du mal avec la notation R1C1... :p)
    Petit mémo :

    R = Ligne || C = Colonne (ok j'ai rien appris à quiconque là)
    [] signifie qu'on travaille en position relative par rapport à la cellule où est écrite la formule

    RC = référence de la cellule où est écrite la formule
    RxCx = lignes et colonne numéro x en notation absolue ==> pour x = 1, quelque soit la position de départ ou d'arrivée, on est sur $A$1
    R[x]C[x] = décalage de x lignes et x colonnes par rapport à la cellule où est située la formule ==> pour x = 1 et une formule écrite en B2, la référence est C3

  7. #7
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    par macro, sans formule, mais je doute du temps d'execution pour plus de 300 000 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub essai()
    Dim Dercel As Range, Tb, x As Long, y As Long
    With Sheets("Feuil1") 'à changer par le nom de la feuille
      Set Dercel = .Range("C" & .Rows.Count).End(xlUp) 'derniere cellule utilisée en col C
      Tb = .Range("C2", Dercel(1, 25)) 'un tableau qui contient les valeurs des colonnes (de C à z) + colonne vide "AA"
      For x = 1 To UBound(Tb, 1)
        For y = 1 To 24
          If Tb(x, y) = 1 Then Tb(x, 25) = "AOI" & y': Exit For à voir
        Next y
      Next x
      .Range("C2").Resize(UBound(Tb, 1), UBound(Tb, 2)) = Tb
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Membre averti
    Homme Profil pro
    IGE
    Inscrit en
    Mars 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : IGE

    Informations forums :
    Inscription : Mars 2016
    Messages : 24
    Par défaut
    merci casefayere

    ton code marche sans souci, c'est exactement ce qu'il me fallait.
    c'est super.

    comme tu dit çela prend un peux de tps sur mes fichiers de plus de 800000 lignes.

    Résolu.

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 735
    Par défaut
    Tu n'as pas essayé avec EQUIV?
    L'avantage est qu'avec une formule, tes cases se mettront automatiquement à jour si tes cellules sources changent de valeur (si tant est que ça puisse arriver dans ton cas).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range("AA2").Formula = "=INDIRECT(""AOI"" & MATCH(1, C2:Z2, 0))"
        Range("AA2").Select
        Selection.AutoFill Destination:=Range("AA2:AA300438")
        Range("AA2:AA300438").Select
    Le risque est que ce soit lourd avec INDIRECT.

    Edit: INDEX serait peut-être plus appropriée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("AA2").Formula = "=INDEX(AOI:AOI, MATCH(1, C2:Z2, 0))"

  10. #10
    Membre averti
    Homme Profil pro
    IGE
    Inscrit en
    Mars 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : IGE

    Informations forums :
    Inscription : Mars 2016
    Messages : 24
    Par défaut
    je vais essayer cette fct voir si elle marche aussi.
    mais je ne devrais pas avoir de changement dans ma table.

    merci Promethee25

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pour information, le nombre de caractères sur une même linge de code en vba est limité.

    Place ta formule dan un string et affecte ce string a ta cellule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim formule as string
    Formule ="=IF(RC[-24]=1,""AOI1"",IF(RC[-"
    Formule=Formule & "17"",IF(RC[-7]=1,""AOI18"",IF(RC[-6..."
    ActiveCell.FormulaR1C1 = formule

Discussions similaires

  1. [XL-2013] Changer le format d'une cellule via une macro excel 2013
    Par zigolink dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/03/2016, 19h40
  2. Ajustement de données MACRO EXCEL 1000 (help)
    Par EnzoExcel dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/12/2014, 16h40
  3. [XL-2013] Enregistrer un fichier Excel 2013 en Excel 2007 avec macros
    Par TOUGMA dans le forum Excel
    Réponses: 7
    Dernier message: 02/03/2014, 09h03
  4. [Excel-2013] Souci avec la fonction "Decaler" dans une macro
    Par rvaysse dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/03/2014, 10h17
  5. [XL-2013] Macros xl ne marchent plus sous excel 2013
    Par burotic2009 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 30/09/2013, 21h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo