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 :

Question sur formule :=SI(ET(ESTVIDE [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Question sur formule :=SI(ET(ESTVIDE
    Bonjour,

    J’aurais besoin de vos conseils concernant la formule =SI(ET(ESTVIDE

    En effet j’ai inséré dans mon tableau une fonction qui permet de vérifier si une plage de cellules est vide.

    Ainsi, j'ai mis dans la cellule AEC la formule suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ET(ESTVIDE(AEH3);ESTVIDE(AEI3);ESTVIDE(AEJ3);ESTVIDE(AEK3);ESTVIDE(AEL3);ESTVIDE(AEM3);ESTVIDE(AEN3);ESTVIDE(AEO3);ESTVIDE(AEP3);ESTVIDE(AEQ3);ESTVIDE(AER3);ESTVIDE(AES3);ESTVIDE(AET3);ESTVIDE(AEU3);ESTVIDE(AEV3);ESTVIDE(AEW3);ESTVIDE(AEX3));"X";"")
    Ce qui me met donc une X si elles sont bien vides, sinon rien.

    Est-il possible de simplifier cette formule ?

    D’autre part, il m’arrive que lorsque je rajoute des lignes, cette formule saute parfois, donc je me demandais si l’on pouvait la remplacer en mettant un code vba dans la feuille ?

    Merci d’avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Est-il possible de simplifier cette formule ?
    Je pense que oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NB.VIDE(AEH3:AEX3);"X";"")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NBVAL(AEH3:AEX3);"";"X")
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci Philippe pour ta rapide réponse.

    J'ai essayé tes 2 codes, et c'est le 2ème qui fonctionne !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NBVAL(AEH3:AEX3);"";"X")
    Ca va me simplifier grandement la tâche.

    Si vous avez une idée sur une version en vba je suis toujours intéressée

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai essayé tes 2 codes, et c'est le 2ème qui fonctionne !!
    Effectivement, j'ai répondu un peu vite.
    Pour la première formule, il fallait vérifier que toutes les cellules étaient vides (17 dans ce cas-ci)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NB.VIDE(AEH3:AEX3)=17;"x";"")
    Pour renvoyer le nombre de cellules d'une façon dynamique et pas par constante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NB.VIDE(AEH3:AEX3)=COLONNES(AEH3:AEX3);"x";"")
    Attention qu'il y a une petite différence entre NB.VIDE et NBVAL
    Si dans une des cellules de la plage mise en argument (ici AEH3:AEX3), il y a une formule, NB.VIDE, NBVAL la considère comme remplie. Sauf si cette formule renvoie une chaîne vide comme par exemple.
    Dans ce cas précis si la condition est fausse, la formule renverra donc une chaîne vide dans la cellule et NB.VIDE la considère alors comme vide alors que NBVAL la considère comme remplie.

    Si vous avez une idée sur une version en vba je suis toujours intéressée
    Voici un exemple de procédure VBA qui écrit "X" dans la cellule AEF3 de la feuille nommée [Feuil1] si la plage AEH3:AEX3 de cette même feuille est vide ou une chaîne vide dans le cas contraire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub t()
     Dim sht As Worksheet
     Set sht = ThisWorkbook.Worksheets("Feuil1")
     With sht
     .Range("AEF3") = IIf(Application.WorksheetFunction.CountA(.Range("AEH3:AEX3")), "", "X")
     End With
    End Sub
    S'il faut faire une boucle sur plusieurs lignes par exemple de la ligne 2 à la ligne 100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub t()
     Dim sht As Worksheet, r As Long
     Set sht = ThisWorkbook.Worksheets("Feuil1")
     For r = 2 To 100
      With sht
      .Range("AEF" & r) = IIf(Application.WorksheetFunction.CountA(.Range("AEH" & r & ":AEX" & r)), "", "X")
      End With
     Next
    End Sub
    Autre scénario, on souhaite placer la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NBVAL(AEH2:AEX2);"";"X")
    dans la plage AEF2:AEF100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub t()
     Dim sht As Worksheet, myFormula As String
     myFormula = "=IF(COUNTA(AEH2:AEX2),"""",""X"")"
     Set sht = ThisWorkbook.Worksheets("Feuil1")
     sht.Range("AEF2:AEF100") = myFormula
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonjour Philipe,

    C'est un très bon rappel pour moi sur les nuances entre NB.VIDE, NBVAL.

    J'ajoutes qu'en VBA, il est préférable (c'est ma pensée) de s'affranchir de ces fonctions dans la plupart des cas.
    Les Propriétés de l'objet global SpecialCells sont déjà disponibles en mémoire pour répondre à ces besoins.

    Sans doute devras tu aussi lui expliquer dans tes explications limpides, les pièges possibles avec xlCellTypeBlanks
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour Ousmane,
    C'est vrai qu'au moment de rédiger les multiples possibilités de compter les cellules vides ou plutôt non vides, j'ai complètement oublié la propriété SpecialCells avec comme argument la constante xlCellTypeBlanks.
    Il y a aussi la formule BDNBVAL mais qui ne convient pas à son cas particulier et puis SOMMEPROD pourquoi pas mais cela devient un peu lourd.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour Philippe et Ousmane, le forum,

    Merci à vous de prendre le temps de vous pencher sur mon cas j'espère que vous serez patients car je suis novice et je ne maitrise pas bien le vba mais je persévère.

    Philippe, j'ai essayé de comprendre la différence entre valeur "constante" et valeur "dynamique" mais effectivement avec cette formule ça fonctionne aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NB.VIDE(AEH3:AEX3)=COLONNES(AEH3:AEX3);"x";"")
    J'ai essayé depuis ce matin de comprendre, j'ai fait plusieurs essais avec différentes formules, et j'ai pu quand même adapter une des formules avec un de mes autres fichiers, plus simple ne contenant qu'une seule feuille pour lequel ce code me sera bien utile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub t()
     Dim sht As Worksheet, r As Long
     Set sht = ThisWorkbook.Worksheets("OCT")
     For r = 2 To 350
      With sht
      .Range("D6" & r) = IIf(Application.WorksheetFunction.CountA(.Range("E" & r & ":BX" & r)), "", "X")
      .Calculate
      End With
     Next
     End Sub
    Par contre je n'ai pas réussi à l'adapter sur un autre classeur qui lui contient plusieurs feuilles qui se rafraichissent automatiquement à l'activation en fonction des données stockées dans une feuille nommée "base" permettant d'attribuer un ID pour chaque ligne et de renvoyer les infos sur les autres feuilles.

    Voici le code de la feuille sur laquelle je souhaite appliquer cette formule (la cellule où se trouve la formule corresponde à :
    - dans la feuille "typo" : (i,10) - Cellule J
    - dans la feuille "base" : (j,809) - Cellule AEC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.DisplayAlerts = 0: Application.EnableEvents = 0
    i = Target.Row
    If Cells(i, 1) = "" Then Application.EnableEvents = -1: Exit Sub
    'Récupération de l'Identifiant de la ligne modifiée
    Id = Cells(i, 1)
      'On cherche l'Id dans la colonne A de Base
      'Si on le trouve
      If Not IsError(Application.Match(Id, Sheets("Base").Columns(1), 0)) Then
      'Mise en majuscule et nom propre des Nom et Prénom
      Cells(i, 4) = StrConv(Cells(i, 4), 1)
       With Sheets("Base")
        'Si l'Id est trouvé
        If Not IsError(Application.Match(Id, .Columns(1), 0)) Then
          j = Application.Match(Id, .Columns(1), 0)
          'on copie les données modifiée dans Base
          .Cells(j, 2).Resize(, 4).Value = Cells(i, 2).Resize(, 4).Value
          .Cells(j, 25) = Cells(i, 6)
          .Cells(j, 28) = Cells(i, 7)
          .Cells(j, 29) = Cells(i, 8)
          .Cells(j, 808) = Cells(i, 9)
          .Cells(j, 809) = Cells(i, 10)
          .Cells(j, 810).Risize(, 4).Value = Cells(i, 11).Resize(, 4).Value
          .Cells(j, 814).Resize(, 17).Value = Cells(i, 15).Resize(, 17).Value
           Cells(i, 10) = "=IF(COUNTA(O5:AE5),"""",""X"")"
                End If
      End With
    End If
    Application.DisplayAlerts = -1: Application.EnableEvents = -1
    End Sub
    Private Sub Worksheet_Activate()
    Application.DisplayAlerts = 0: Application.EnableEvents = 0
    'A l'activation de la feuille
      'On cherche la dernière ligne pleine pour supprimer les données
       j = [A65536].End(xlUp).Row
      If j > 4 Then Rows("5:" & j).ClearContents
      With ("Base")
      'Pour toutes les lignes de "Base"
      For j = 3 To .[A65536].End(xlUp).Row
        If .Cells(j, 2) <> "" Then
          'On copie les données de Base dans la feuille activée
          i = [A65536].End(xlUp)(2).Row
          Cells(i, 1).Resize(, 5).Value = .Cells(j, 1).Resize(, 5).Value
          Cells(i, 6) = .Cells(j, 25)
          Cells(i, 7) = .Cells(j, 28)
          Cells(i, 8) = .Cells(j, 29)
          Cells(i, 9) = .Cells(j, 808)
          Cells(i, 10) = .Cells(j, 809)
          Cells(i, 11).Resize(, 4).Value = .Cells(j, 810).Resize(, 4).Value
          Cells(i, 15).Resize(, 17).Value = .Cells(j, 814).Resize(, 17).Value
          Cells(i, 10) = "=IF(COUNTA(O5:AE5),"""",""X"")"
     
        End If
        Next
      End With
      j = [A65536].End(xlUp).Row
      If j > 4 Then Range("A5:AE" & [D65536].End(xlUp).Row).Sort [D5], xlAscending, [E5], , xlAscending, , , xlNo
    Application.DisplayAlerts = -1: Application.EnableEvents = -1
    End Sub
    Au départ, je voulais suivre le même principe que dans la feuille "Suivi" : en effet, j'ai sur celle-ci autre un code pour calculer une échéance mais je n'y suis pas parvenue, voici comment elle se présente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.DisplayAlerts = 0: Application.EnableEvents = 0
    i = Target.Row
    If Cells(i, 1) = "" Then Application.EnableEvents = -1: Exit Sub
    'Récupération de l'Identifiant de la ligne modifiée
    Id = Cells(i, 1)
      'On cherche l'Id dans la colonne A de Base
      'Si on le trouve
      If Not IsError(Application.Match(Id, Sheets("Base").Columns(1), 0)) Then
      'Mise en majuscule et nom propre des Nom et Prénom
      Cells(i, 4) = StrConv(Cells(i, 4), 1)
      With Sheets("Base")
        'Si l'Id est trouvé
        If Not IsError(Application.Match(Id, .Columns(1), 0)) Then
          j = Application.Match(Id, .Columns(1), 0)
          'on copie les données modifiée dans Base
          .Cells(j, 2).Resize(, 4).Value = Cells(i, 2).Resize(, 4).Value
          .Cells(j, 25) = Cells(i, 6)
          .Cells(j, 46) = Cells(i, 7)
          .Cells(j, 47) = Cells(i, 8)
          .Cells(j, 16) = Cells(i, 9)
          .Cells(j, 15) = Cells(i, 10)
          .Cells(j, 30) = Cells(i, 11)
           .Cells(j, 18) = Cells(i, 12)
            .Cells(j, 31) = Cells(i, 13)
          .Cells(j, 32).Resize(, 14).Value = Cells(i, 14).Resize(, 14).Value
          .Cells(j, 831).Resize(, 3).Value = Cells(i, 28).Resize(, 3).Value
             
             If Cells(i, 12) <> "" Then
              Cells(i, 13) = Application.WorksheetFunction.EoMonth(Cells(i, 12), -1)
            Else
              Cells(i, 13) = ""
          End If
                End If
      End With
    End If
    Application.DisplayAlerts = -1: Application.EnableEvents = -1
    End Sub
    La formule concerne les lignes en rouge, qui a été également reportée dans la partie "Activate"

    Je voulais vous mettre le fichier mais cela n'a pas fonctionné j'ignore pourquoi, c'est un fichier xlsm de 615 ko.


    J'espère que ce n'est pas trop fouillis et que pourrez m'aider à comprendre mes erreurs.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Philippe, j'ai essayé de comprendre la différence entre valeur "constante" et valeur "dynamique" mais effectivement avec cette formule ça fonctionne aussi
    Si une valeur est constante, elle ne peut être modifiée
    Dans cette formule, le chiffre 6 est une constante et t'oblige à compter le nombre de cellules qu'il y a dans la plage B3:G3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NB.VIDE(B3:G3)=6;"x";"")
    Dans la formule ci-dessous, la constante 6 est remplacée par la formule COLONNES(plage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NB.VIDE(B3:G3)=COLONNES(B3:G3);"x";"")
    la formule COLONNES(plage) renvoie le nombre de colonnes dans la plage passée en argument et ainsi tu ne dois plus faire le calcul. Celui devient donc dynamique.

    Au départ, je voulais suivre le même principe que dans la feuille "Suivi" : en effet, j'ai sur celle-ci autre un code pour calculer une échéance mais je n'y suis pas parvenue, voici comment elle se présente :
    Il y a trop de lignes de code à lire et tu mélanges du code qui a fonctionné avec celui qui pose problème et sans nous dire ce qui ne va pas.
    Dans cette partie du code qu tu as mis en rouge, le calcul renvoyé est faux, un message d'erreur apparaît, quel est le problème ?
    Au lieu de vérifier Cells(i, 12) n'est pas vide, il serait déjà préférable de vérifier si c'est une date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Cells(i, 12) <> "" Then
              Cells(i, 13) = Application.WorksheetFunction.EoMonth(Cells(i, 12), -1)
            Else
              Cells(i, 13) = ""
    Ton classeur est trop important que tu n'utilises pas les formules natives d'excel directement dans les feuilles de calculs ?

    Je voulais vous mettre le fichier mais cela n'a pas fonctionné j'ignore pourquoi, c'est un fichier xlsm de 615 ko.
    A ce stade de la discussion et en ce qui me concerne, il n'y a aucune raison d'avoir un classeur en téléchargement.
    Quand l'explication est claire, la réponse peut l'être aussi.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour Philippe, le forum,

    Je te remercie pour l'explication sur les valeurs constantes et dynamiques, je saisie mieux la différence

    Il y a trop de lignes de code à lire et tu mélanges du code qui a fonctionné avec celui qui pose problème et sans nous dire ce qui ne va pas.
    Dans cette partie du code qu tu as mis en rouge, le calcul renvoyé est faux, un message d'erreur apparaît, quel est le problème ?
    Au lieu de vérifier Cells(i, 12) n'est pas vide, il serait déjà préférable de vérifier si c'est une date.
    En fait le code que j'ai mis dans ce cas en rouge fonctionne très bien, c'était pour vous montrer comment j'avais adapté une formule pour calculer une échéance selon une date. J'ai bien mon résultat et le envoie ce fait bien de la feuille source vers la feuille "base" et vice et versa.

    Mon classeur contient plusieurs feuilles, et chacune reprend des infos communes, tels que le nom, prénom tel, nom du CT, ainsi que des dates et autres infos etc....

    Donc afin que toutes les lignes soient renvoyées sans risque de décalage ou pertes de données, une feuille "base" (la dernière) a été créée.

    L'enregistrement dans le tableau se fait dans un premier temps dans cet ordre:
    feuille 1 : enregistrement des infos de la personne : un tri automatique se fait sur le NOM puis un id également affecté via la feuille base automatiquement. Donc si je vais dans la feuille base je retrouve toutes mes infos. Elle contient également les autres infos des autres feuilles , ce qui fait que toute modification faite sur l'une des feuilles sera mise à jour automatiquement sur toutes les autres.

    Donc pour en revenir à la formule que je souhaiterais mettre : celle que tu m'as donnée et qui a fonctionné sur un autre de mes fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub t()
     Dim sht As Worksheet, r As Long
     Set sht = ThisWorkbook.Worksheets("OCT")
     For r = 2 To 350
      With sht
      .Range("D6" & r) = IIf(Application.WorksheetFunction.CountA(.Range("E" & r & ":BX" & r)), "", "X")
      .Calculate
      End With
     Next
     End Sub
    Or je n'arrive pas à l'adapter dans mon autre classeur (celui avec la feuille base). J'ai fait un essai en ne la mettant que sur la feuille "base" cela a fonctionné au départ mais en rafraichissant mon classeur le code vba disparait.
    J'ai encore refait des essais ce matin, mais je bloque pour l'instant au niveau des End if, End with, Next... j'ai du mal encore à comprendre à quel moment il en faut ou non (j'ai noté en rouge le code que tu m'avais transmis).
    Voici mon code et l'erreur ici est sur End with mais je pense que ce n'est pas la seule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Sub Worksheet_Activate()
    Application.DisplayAlerts = 0: Application.EnableEvents = 0
    'A l'activation de la feuille
      'On cherche la dernière ligne pleine pour supprimer les données
       j = [A65536].End(xlUp).Row
      If j > 4 Then Rows("5:" & j).ClearContents
      With Sheets("Base")
      'Pour toutes les lignes de "Base"
      For j = 3 To .[A65536].End(xlUp).Row
        If .Cells(j, 2) <> "" Then
          'On copie les données de Base dans la feuille activée
          i = [A65536].End(xlUp)(2).Row
          Cells(i, 1).Resize(, 5).Value = .Cells(j, 1).Resize(, 5).Value
          Cells(i, 6) = .Cells(j, 25)
          Cells(i, 7) = .Cells(j, 28)
          Cells(i, 8) = .Cells(j, 29)
          Cells(i, 9) = .Cells(j, 808)
          Cells(i, 10) = .Cells(j, 809)
          Cells(i, 11).Resize(, 4).Value = .Cells(j, 810).Resize(, 4).Value
          Cells(i, 15).Resize(, 17).Value = .Cells(j, 814).Resize(, 17).Value
          End If
            Next
      End With
         Dim sht As Worksheet, r As Long
     Set sht = ThisWorkbook.Worksheets("Base")
     For r = 3 To 350
      With sht
       .Range("AEC" & r) = IIf(Application.WorksheetFunction.CountA(.Range("AEH" & r & ":AEX" & r)), "", "X")
       End With
     Next
     End With
     End If
      j = [A65536].End(xlUp).Row
      If j > 4 Then Range("A5:AE" & [D65536].End(xlUp).Row).Sort [D5], xlAscending, [E5], , xlAscending, , , xlNo
    Application.DisplayAlerts = -1: Application.EnableEvents = -1
    End Sub
    Je n'ai pas mis que le worksheet Change mais il faudra que je fasse de même.

    J'espère que c'est plus clair.

    Merci d'avance pour votre aide.

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mon classeur contient plusieurs feuilles, et chacune reprend des infos communes, tels que le nom, prénom tel, nom du CT, ainsi que des dates et autres infos etc....
    J'avoue ne pas bien comprendre l'organisation de tes données et je me demande si tu ne ferais pas bien de travailler avec Access mais là n'est pas le propos.
    Si j'ai bien compris tes explications et surtout si tu utilises des ID pourquoi ne travailles tu pas avec les fonctions de la catégorie Recherche et Matrices comme RECHERCHEV, INDEX et EQUIV ?
    Tu pourrais t'inspirer ou même utiliser la fonction que j'ai publiée dans cette contribution LookupLabelRange - Ajouter une colonne à une liste de données
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Pour Acces, nous n'utilisons pas ce programme malheureusement.

    Le fichier Excel actuel est en effet complexe mais fonctionne, je souhaitais simplement introduire ce calcul directement dans le code mais bon si ce n'est pas possible, je laisserais comme tel, à moi de vérifier régulièrement que la formule a bien été recopiée sur toutes les lignes.

    Je viens d'aller voir ton lien et j'ai téléchargé ton fichier démo, je vais regarder cela de plus près pour voir comment cela fonctionne.

    Merci encore pour ton aide.

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Dans la dernière partie de ton dernier code publié ici, il me semble que le 'End With' de la ligne 31 de la procédure est en trop et le 'End If' de la ligne 32 il me semble également mais je n'ai pas regardé tout le code car il n'est pas complètement indenté.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  13. #13
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci infiniment Philippe ! Ca fonctionne parfaitement

    J'aimerais bien ceci dit comprendre cette logique, comment repérer à quel moment il faut terminer une boucle, le nombre de End, de With etc... Jusqu'à présent j'avoue que j'ai pu trouver parfois la solution en faisant un peu au hasard mais je suis consciente que ce n'est pas la solution.

    Si un tuto expliquant les bases existe ça m'intéresserait, car j'en ai trouvé mais c'est déjà trop compliqué pour moi

    Encore merci pour ton aide.

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'aimerais bien ceci dit comprendre cette logique, comment repérer à quel moment il faut terminer une boucle, le nombre de End, de With etc.
    C'est relativement simple à comprendre
    Pour les If
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If <Condition> then
         '  Le code si la condition est remplie 
      Else
        ' Le code sinon
    End If
    Pour le bloc With...End With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Dim cel As Range
     Set cel = ThisWorkbook.Worksheets("Feuil1").Range("A2:A11")
     With cel
     .Interior.Color = vbYellow
     .Value = "Excel "
     End With
    On peut aussi imbriquer un bloc With dans un autre bloc With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Dim cel As Range
     Set cel = ThisWorkbook.Worksheets("Feuil1").Range("B1:B5")
     With cel
     .HorizontalAlignment = xlCenter
     .Interior = vbYellow
      With .Font
      .Bold = True
      .Color = vbRed
      End With
    Pour ce qui est des tutoriels pour débuter, je te conseille
    Formation Excel - VBA débutant
    Excel et Visual Basic : Tutoriel
    Vos premiers pas dans l'éditeur de macros Excel suivi de Visual Basic Editor
    La gestion des erreurs dans Excel
    Indispensable pour bien trouver ses erreurs dans la programmation
    Le débogage sous Visual Basic 6 (1ère partie)
    et puis consulter la FAQ Excel et Les meilleurs cours et tutoriels pour Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  15. #15
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    et bien j'ai parlé trop vite, il va vraiment falloir que je me penche sur cette histoire, car en voulant rentrer une donnée dans une cellule j'ai l'erreur suivante : erreur de compilation For sans Next

    Ces lignes concerne la partie WorksheetChange (j: concerne les cellules de la feuille "base" et i : celles où je rentre mes données)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.DisplayAlerts = 0: Application.EnableEvents = 0
    i = Target.Row
    If Cells(i, 1) = "" Then Application.EnableEvents = -1: Exit Sub
    'Récupération de l'Identifiant de la ligne modifiée
    Id = Cells(i, 1)
      'On cherche l'Id dans la colonne A de Base
      'Si on le trouve
      If Not IsError(Application.Match(Id, Sheets("Base").Columns(1), 0)) Then
      'Mise en majuscule et nom propre des Nom et Prénom
      Cells(i, 4) = StrConv(Cells(i, 4), 1)
       With Sheets("Base")
        'Si l'Id est trouvé
        If Not IsError(Application.Match(Id, .Columns(1), 0)) Then
          j = Application.Match(Id, .Columns(1), 0)
          'on copie les données modifiée dans Base
          .Cells(j, 2).Resize(, 4).Value = Cells(i, 2).Resize(, 4).Value
          .Cells(j, 25) = Cells(i, 6)
          .Cells(j, 28) = Cells(i, 7)
          .Cells(j, 29) = Cells(i, 8)
          .Cells(j, 808) = Cells(i, 9)
          .Cells(j, 810).Resize(, 4).Value = Cells(i, 11).Resize(, 4).Value
          .Cells(j, 814).Resize(, 17).Value = Cells(i, 15).Resize(, 17).Value
        End If
     
      End With
         Dim sht As Worksheet, r As Long
     Set sht = ThisWorkbook.Worksheets("Base")
     For r = 3 To 350
      With sht
       .Range("AEC" & r) = IIf(Application.WorksheetFunction.CountA(.Range("AEH" & r & ":AEX" & r)), "", "X")
       End With
    Application.DisplayAlerts = -1: Application.EnableEvents = -1
    Application.Calculate
    End Sub
    Je ne comprends pas ce message car jusqu'ici je ne l'ai jamais eu, et ça fonctionnait et je ne vois pas le rapport avec les nouvelles lignes que j'ai rajoutées.

    J'avais une autre question, j'ai remarqué dans la plupart de mes fichiers les calculs des formules ne se faisaient pas instantanément, l faut que je fasse à chaque fois enregistrer. Je suis allée dans Option et j'ai coché "calcul du classeur automatique" mais ça ne reste pas.

    Je te remercie aussi pour toutes tes explications, c'est bien clair, les bases je comprends là où j'ai plus de mal c'est lorsque c'est imbriqué, tes différents liens et tutos vont m'être très utiles.

  16. #16
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il est impossible de t'aider si tu ne déclares pas tes variables systématiquement.
    Pour les modules déjà écrits, tu dois placer en tête de module Option Explicit et parallèlement à cela, tu dois aller dans les options de l'éditeur (Outils/Options... onglet [Editeur]) et cocher Déclaration des variables obligatoire.
    Cela t'obligera à déclarer toutes tes variable et cela facilitera grandement le travail de débogage.
    En bas de ton code, il te manque le Next (Mis en rouge) et de plus il est préférable de déclarer ses variables en tête de procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          Dim sht As Worksheet, r As Long
      Set sht = ThisWorkbook.Worksheets("Base")
      For r = 3 To 350
       With sht
        .Range("AEC" & r) = IIf(Application.WorksheetFunction.CountA(.Range("AEH" & r & ":AEX" & r)), "", "X")
       End With
      Next r
     Application.DisplayAlerts = -1: Application.EnableEvents = -1
     Application.Calculate
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  17. #17
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Effectivement pour la ligne "Option Explicit" je l'avais mise sur les autres feuilles mais par sur celle-ci ainsi qu'une autre. L'option "Déclarer des variables obligatoires" n'était pas non plus cochée.

    J'ai rajouté Next comme tu me l'a conseillée, et j'ai eu un autre message avec les bloc if mais j'ai enfin réussi à comprendre ce qui n'allait pas.

    Et bien je pense que tout fonctionne à présent, j'ai encore appris des choses aujourd'hui je vais pouvoir avancer et m'améliorer j'espère.

    Encore merci pour tout.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/01/2011, 17h55
  2. Question sur petite formule
    Par nicolav dans le forum Excel
    Réponses: 5
    Dernier message: 16/07/2009, 23h01
  3. question sur la formulation d'une requete
    Par moha_alnif dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/05/2009, 14h32
  4. Question sur un élément d'une formule
    Par Tigris94 dans le forum Formules
    Réponses: 1
    Dernier message: 06/05/2009, 13h36
  5. Réponses: 2
    Dernier message: 31/08/2007, 11h33

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