problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Hizaack

XLDnaute Nouveau
Bonjour,


Je sollicite votre aide car je ne comprend pas pourquoi je n'arrive pas à mon résultat escompté. Je souhaite compter le nombre de cellules non vides dans la colonne A de la feuille 1 et dans la colonne A de la feuille 2, mais le tout défini par des variables.


J'ai réalisé la macro suivante, mais celle-ci compte toujours le nombre de cellules non vide dans la feuille qui a été sélectionnée par un clic manuel. Il y a un nombre différent de données dans les deux feuilles. Si vous voulez le fichier, je l'envoie ce soir car il est filtré au travail.


Quelles sont mes erreurs?


Code:
Sub ComptageTest()

Dim SheetClient As Worksheet
Dim SheetSource As Worksheet
Dim ComptCellNonVide1 As Integer
Dim ComptCellNonVide2 As Integer
Dim myRange As Range


ComptCellNonVide1 = 0
ComptCellNonVide2 = 0
Set SheetClient = ThisWorkbook.Worksheets(1)
Set SheetSource = ThisWorkbook.Worksheets(2)
Set myRange = Range("A:A")
SheetClient.Activate
SheetSource.Activate


    With SheetClient
        .Select
        ComptCellNonVide1 = Application.WorksheetFunction.CountA(myRange) - 1 '-1 Car en tête au début du tableau
        MsgBox ComptCellNonVide1 & " Personnes comptées en liste client"
    End With
    
    With SheetSource
        .Select
        ComptCellNonVide2 = Application.WorksheetFunction.CountA(myRange) - 1 '-1 Car en tête au début du tableau
        MsgBox ComptCellNonVide2 & " Personnes comptées en liste source"
    End With

End Sub



Merci d'avance pour votre précieuse aide,


Bien cordialement,
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Bonsoir Hizaack,

Lorsque vous lancez la macro (qui doit sans doute se trouver dans un module de code et non de feuille) vous avez une feuille de votre classeur qui est active. Lorsque vous exécuter l'instruction Set myRange = Range("A:A"), le range est défini pour cette feuille active. Par la suite myRange fera donc toujours référence au range("A:A") de cette feuille active.

Il faut donc redéfinir pour chaque feuille le bon range. Pour cela, vous pouvez remplacer le premier et deuxième select par Set myRange = .Range("A:A") - non testé -

VB:
    With SheetClient
        Set myRange = .Range("A:A")
        ComptCellNonVide1 = Application.WorksheetFunction.CountA(myRange) - 1 '-1 Car en tête au début du tableau
        MsgBox ComptCellNonVide1 & " Personnes comptées en liste client"
    End With
    
    With SheetSource
        Set myRange = .Range("A:A")
        ComptCellNonVide2 = Application.WorksheetFunction.CountA(myRange) - 1 '-1 Car en tête au début du tableau
        MsgBox ComptCellNonVide2 & " Personnes comptées en liste source"
    End With
 

Hizaack

XLDnaute Nouveau
Re : problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Bonjour mapomme,


Effectivement, vous avez trouvez l'origine l'origine de mon problème, et votre code fonctionne à merveille.

Mais par curiosité, je me demandais s'il n’étais pas possible d'éviter de sélectionner le range à chaque fois qu'on sélectionne la feuille. Faire quelque chose du genre :

Code:
Set myRange1 = Worksheets(1).Range("A:A")
Set myRange2 = Worksheets(2).Range("A:A")

With Ws
        .Select
        ComptCellNonVide1 = Application.WorksheetFunction.CountA(myRange1) - 1 '-1 Car en tête au début du tableau
        MsgBox ComptCellNonVide1 & " Personnes comptées en liste client"
    End With
    
    With Wc
        .Select
        ComptCellNonVide2 = Application.WorksheetFunction.CountA(myRange2) - 1 '-1 Car en tête au début du tableau
        MsgBox ComptCellNonVide2 & " Personnes comptées en liste source"
    End With


Ne peut-on pas attribuer un range avec une feuille dans une variable? Ou faire même :

Code:
Application.WorksheetFunction.CountA(Worksheets(1).myRange1)
Application.WorksheetFunction.CountA(Worksheets(2).myRange1)


Merci d'avance pour la réponse apportée à ces questions, ce qui permettra d'éclaircir un humble débutant VBA ^^
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Bonsoir Hizaack,

Mais par curiosité, je me demandais s'il n’étais pas possible d'éviter de sélectionner le range à chaque fois qu'on sélectionne la feuille.
je ne comprends pas ce que vous entendez par 'sélectionner le range'. Pour ce qui de l'instruction 'Select', il est la plupart du temps possible de s'en passer.
Pour ce qui est de l'instruction 'set myRange1 = Worksheets(1).range("A:A")', on ne sélectionne pas sur la feuille Worksheets(1) la zone A:A. On définit simplement une propriété de la variable objet myRange1 (variable déclarée de type range).

Sinon pour votre cas vous pouvez écrire:
VB:
Sub ComptageTest()
Dim ComptCellNonVide1 As Long, ComptCellNonVide2 As Long

ComptCellNonVide1 = Application.WorksheetFunction.CountA(Worksheets(1).Range("a:a")) - 1
MsgBox ComptCellNonVide1 & " Personnes comptées en liste client"

ComptCellNonVide2 = Application.WorksheetFunction.CountA(Worksheets(2).Range("a:a")) - 1
MsgBox ComptCellNonVide2 & " Personnes comptées en liste source"
End Sub

Ne peut-on pas attribuer un range avec une feuille dans une variable? Ou faire même :
Application.WorksheetFunction.CountA(Worksheets(1).myRange1)
Application.WorksheetFunction.CountA(Worksheets(2).myRange1)
Ceci me semble-t-il devrait provoquer une erreur. En effet si vous avez défini myRange1 comme:
set myRange1 = Worksheets(1).range("A:A") alors Worksheets(1).myRange1 reviendrait à écrire
Worksheets(1).Worksheets(1).range("A:A") or l'objet worksheet n'a pas de propriété de type "worksheet".

Mais le plus simple est d'essayer les différentes possibilités par soi-même et de voir si les résultats sont justes ou si VBA vous lance des "insultes".
 
Dernière édition:

Hizaack

XLDnaute Nouveau
Re : problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Bonjour mapomme,


Merci de ces quelques explications.

J'ai une dernière demande, car en fait le but de cette manipulation était de créer une sous fonction de comptage des cellules non vide qui prend en paramètre la feuille et le colonne. J'avais donc pensé au départ à cela, avec le problème de ce fil de discussion :


Code:
Dim SheetClient As Worksheet
Set SheetClient = Sheets(1)
Dim ColonneNomClient As Range
Set ColonneNomClient = Range("A:A")

NbrNomClient = ComptCellNonVide(SheetClient, ColonneNomClient)
------------------------------------------------------------------


Function ComptCellNonVide(Feuille As Worksheet, Colonne As Range) As Integer
    
    'Feuille.Select
    
    With Feuille
        .Select
        ComptCellNonVide = Application.WorksheetFunction.CountA(Colonne) - 1 '-1 Car en tête au début du tableau
    End With
    
End Function


Mais vu que j'ai ma colonne en parametre, je ne peux pas faire de Set var = .Range().


Comment puis-je corriger cette macro avec une variable en parametre, en m'inspirant de votre modèle?


Merci d'avance,


Bien cordialement,
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Bonjour Hizaack,

Un essai de code pour la fonction (dans module1 de Classeur1.xls):
VB:
Sub testA()
  'Pour les feuilles du classeur où se trouve cette macro
  MsgBox ComptCellNonVideA(ThisWorkbook.Worksheets(1), 1)
  MsgBox ComptCellNonVideA(ThisWorkbook.Worksheets("BBB"), 3)
  MsgBox ComptCellNonVideA(ThisWorkbook.Worksheets("CCC"), Columns("F").Column)
  'Pour les feuilles d'un autre classeur
  MsgBox ComptCellNonVideA(Workbooks("Classeur2.xls").Worksheets("AAA"), 1)
End Sub

Function ComptCellNonVideA(Feuille As Worksheet, Colonne As Integer) As Integer
  ComptCellNonVideA = Application.WorksheetFunction.CountA(Feuille.Columns(Colonne)) - 1
End Function
 

Pièces jointes

  • Classeur1.xls
    28.5 KB · Affichages: 67
  • Classeur2.xls
    18 KB · Affichages: 46
  • Classeur1.xls
    28.5 KB · Affichages: 71
  • Classeur2.xls
    18 KB · Affichages: 51
  • Classeur1.xls
    28.5 KB · Affichages: 75
  • Classeur2.xls
    18 KB · Affichages: 54

Hizaack

XLDnaute Nouveau
Re : problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Bonjour mapomme,


Merci de ta contribution, ça va beaucoup m'aider pour la suite.

Comme je ne peux pas télécharger un classeur avec macro au travail, j'ai repris ton code, merci de l'avoir copié sur le forum.


Les 3 premières MsgBox fonctionne correctement, quelque soit l'onglet activé manuellement.

La MsgBox qui va chercher la colonne dans le le Classeur 2 ne fonctionne pas, j'ai un message de type : Erreur d'exécution numero 9 : L'indice n'appartient pas à la sélection.

Je pense qu'il faut ouvrir le classeur et activer les feuilles avant. Mais ce n'est pas mon but ici.


Je vais refaire ma fonction complète avec vos exemple pour voir ce qui me c orrespond le mieux, et vous dire si ca fonctionne correctement.



Merci beaucoup pour les réponses.


Bien cordialement,
 

Hizaack

XLDnaute Nouveau
Re : problème Macro comptage cellules non vide sur 2 feuilles => meme résultat

Bonjour,


J'ai apporté les modifications nécessaires, et tout fonctionne correctement grâce à vous. Je partage mon code ainsi que les différentes sous fonctions :

Code:
Sub Mise_à_jour()

Application.ScreenUpdating = False 'Gèle l'écran

    'Je déclare mes variables
    Dim SheetClient As Worksheet
    Dim SheetSource As Worksheet
    Dim ColonneNomClient As String
    Dim ColonneNomSource As String
    Dim ColonneFinDonnéesSource As String
    Dim NbrNomClient As Integer
    Dim NbrNomSource As Integer
     
    'J'initialise mes variables
    'Feuilles
    Set SheetClient = ThisWorkbook.Worksheets(1)
    Set SheetSource = ThisWorkbook.Worksheets(2)
    'Autres
    ColonneNomClient = "A:A"
    ColonneNomSource = "A:A"
    ColonneFinDonnéesSource = "D:D"
    
    'On compte le nombre de personnes en source
    NbrNomSource = ComptCellNonVideA(SheetSource, Columns(ColonneNomClient).Column)
    MsgBox NbrNomSource & " Personnes comptées en liste source"
    
    'On compte le nombre de personnes en client
    NbrNomClient = ComptCellNonVideA(SheetClient, Columns(ColonneNomSource).Column)
    MsgBox NbrNomClient & " Personnes comptées en liste client"
    
    'On insère une colonnes temporaires après les données
    InsertColonneApres SheetSource, ColonneFinDonnéesSource, 1
    
    'Comparaison des données
    'Comparer SheetSource, SheetClient, ColonneNomSource, ColonneNomClient, ColonneFinDonnéesSource + 1, 1, NbrNomSource

          
Application.ScreenUpdating = True 'DéGèle l'écran
       
End Sub

Code:
Private Sub InsertColonneApres(Feuille As Worksheet, NumColonne As String, NbrColonnes As Integer)

Dim i As Integer

    With Feuille
        For i = 1 To NbrColonnes
          Feuille.Columns(Columns(NumColonne).Column + 1).EntireColumn.Insert Shift:=xlToRight
        Next i
    End With
    
End Sub

Code:
Function ComptCellNonVideA(Feuille As Worksheet, Colonne As Integer) As Integer
         ComptCellNonVideA = Application.WorksheetFunction.CountA(Feuille.Columns(Colonne)) - 1 '-1 Car en tête au début du tableau
End Function



Merci beaucoup pour l'aide!

Bien cordialement,


P.S : N'hésitez pas à me signaler toute erreur de syntaxe ou améliorations possibles, merci.
 

Discussions similaires

Réponses
3
Affichages
457

Statistiques des forums

Discussions
311 709
Messages
2 081 756
Membres
101 812
dernier inscrit
trufu