Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA - Compter les cellules non vide de plusieurs onglet

loic.zambon

XLDnaute Nouveau
Bonjour,

J'ai différents onglet qui sont rempli tout au long de l'année.
Ces onglets répertories des interventions selon des régions.

A la fin de l'année je copie toutes les donnes dans un tableau pour les traiter et en sortir un rapport et des graphiques via un autre fichier Excel et des Macros.
Pour ce faire, j'ai besoin du nombre de lignes remplies dans chaque onglet.
J'ai le bon résultat pour le 1er onglet mais pas pour les suivants (ils me retournent celui du 1er onglet)

J'ai 430 lignes dans l'onglet MOB, 43 dans l'onglet ZL, 116 dans l'onglet MVR-P, ...


VB:
'Fichier et onglet de mon fichier qui fait l'analyse
Set oWBAna = ThisWorkbook


Set oShData = oWBAna.Worksheets("Data")
Set oShUpd = oWBAna.Worksheets("Update")

' le chemin provient d'un champs qui s'adapte après le choix du fichier via une macro
pathFile = oShUpd.Cells(2, 2).Value

'Fichier et onglets du fichier qui contient les données
Set oWBDer = Workbooks.Open(pathFile)

Set oShMOB = oWBDer.Worksheets("MOB")
Set oShZL = oWBDer.Worksheets("ZL")
Set oShMVRP = oWBDer.Worksheets("MVR-P")
Set oShMVRN = oWBDer.Worksheets("MVR-N")
Set oShBC = oWBDer.Worksheets("BC")
Set oShVCP = oWBDer.Worksheets("VCP")
Set oShLAS = oWBDer.Worksheets("LAS")
Set oShTG = oWBDer.Worksheets("TG")

nbLiMOB = oShMOB.Application.WorksheetFunction.CountA(Columns(2))
nbLiZL = oShZL.Application.WorksheetFunction.CountA(Columns(2))
nbLiMVRP = oShMVRP.Application.WorksheetFunction.CountA(Columns(2))
nbLiMVRN = oShMVRN.Application.WorksheetFunction.CountA(Columns(2))
nbLiBC = oShBC.Application.WorksheetFunction.CountA(Columns(2))
nbLiVCP = oShVCP.Application.WorksheetFunction.CountA(Columns(2))
nbLiLAS = oShLAS.Application.WorksheetFunction.CountA(Columns(2))
nbLiTG = oShTG.Application.WorksheetFunction.CountA(Columns(2))

Je compte sur la 2ème colonne car la 1ère contient une ID qui peut aller plus loin que le nombre d'interventions enregistrées
J'ai essayé de vérifier ce que contenait mon champs B2 sur chaque onglet via mes variables oSHxxx et toutes retournent bien ce que j'ai.


Bonne journée,
Cordialement,
Loïc
 

Pièces jointes

  • SourceExemple.xlsx
    497.7 KB · Affichages: 19

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

M'est avis que le traitement de fin d'année de vos fichier est tout indiquer pour PowerQuery, inclus dans votre version excel.
Le nom du fichier peut être paramétrer !

Dans le fichier joint j'ai extrait toutes les lignes du classeurExemples.xlsx que vous nous avez donné avec en prime une colonne contenant le nom du tableau d'origine.
cliquez dans le tableau puis sur l'onglet 'Outils de requête' affiché sur le ruban et enfin sur le bouton 'Modifier' à gauche du ruban.

Dans l'étape nommée 'Source' de la requête, modifiez le chemin vers le fichier.
Ce chemin pourra être extrait d'une cellule ultérieurement'.

Cordialement
 

Pièces jointes

  • extraction-SourceExemple.xlsx
    35.3 KB · Affichages: 2

loic.zambon

XLDnaute Nouveau
Bonjour,

Je vous remercie tous pour vos réponses.

@Roblochon, je ne maitrise pas du tout PowerQuery, je vais essayer de m'y mettre voir ce que je peux ressortir comme analyse de mon document.

@Phil69970, c'est exactement ce que je cherchais. C'est bluffant comme c'est simple de récupéré ces lignes. C'est là que je vois mes grandes lacunes.

@cp4, je ne peux que dire merci . Le but final étant de tout copier dans un fichier pour faire les analyses c'est exactement ce que je devais faire. Il va me falloir un peu de temps pour tout comprendre mais ça viendra.


Merci à vous 3.
Vous m'avez été de grande aide.

Bonne journée,
Loïc
 

loic.zambon

XLDnaute Nouveau
Bonsoir,

Je l'ai fait, à toi de voir si ça te convient.

Bonne soirée.

Hello,

J'aurais encore une question pour toi.

J'aimerais remplacer le contenu de la colonne 1 par le nom de l'onglet actif.
Ca me permet de connaître le nombre de cas par onglet pour les statistiques.

Est-ce qu'il y a un moyen d'inclure ça dans ton bout de code ?

VB:
   For Each Ws In Workbooks(ClasseurSource1).Worksheets
      If Ws.Name <> "Listes" Then
         dlg = Workbooks(ClasseurGlobal).Sheets("feuil1").Range("A" & Rows.Count).End(xlUp).Row
         dls = IIf(dlg = 1, 1, dlg + 1)
         Dim n As Byte
         n = IIf(dlg = 1, 1, 2)
         Ws.Range("A" & n & ":V" & Ws.Range("A" & Rows.Count).End(xlUp).Row).Copy Workbooks(ClasseurGlobal).Sheets(1).Range("A" & dls)
      End If
   Next Ws

J'ai voulu utilisé le .replace avant de faire la copie. Mais je ne peux pas "tout" remplacer par une valeur et ça modifierait le fichier d'origine.

Code:
Ws.Range("A" & n & ":A" & Ws.Range("A" & Rows.Count).End(xlUp).Row). what:=*, Replacement:=Ws.Name

ou ne pas copier la colonne A et juste la remplir par après selon le nom de l'onglet

Code:
Ws.Range("B" & n & ":V" & Ws.Range("A" & Rows.Count).End(xlUp).Row).Copy Workbooks(ClasseurGlobal).Sheets(1).Range("B" & dls)

Je sais que j'ai toute les infos. Qu'avec le dfs (si j'ai bien compris indique le nombre de ligne + 1 afin d'écrire à la suite) je sais que je devrais pouvoir faire ces modifications.

J'ai presque réussis en ajoutant une for, mais le nombre de lignes retournée intervient lorsqu'on passe à l'onglet suivant. Donc j'ai tout qui est décalé.

Onglet 1 : 1 ligne
Onglet 2 : 432 lignes (j'en ai besoin lors du passage sur l'onglet 1 si je veux modifier le tout avec ws.Name)
...


Bonne journée,
Loïc
 
Dernière édition:

loic.zambon

XLDnaute Nouveau
@cp4, J'y suis finalement arrivé en me basant sur ce que tu avais fait pour copier les données.
J'ai pu remplacer chaque ID par le nom de l'onglet d'origine, après je n'ai pas réussis à changer le nom de la colonne, mais comme je ne travaille pas dessus c'est sans importance.

VB:
    For Each Ws In Workbooks(fileN).Worksheets
        If Ws.Name <> "Listes" And Ws.Name <> "Lieu&DiDok" Then
            ' nombre de ligne dans l'onglet Data
            dlg = oShData.Range("A" & Rows.Count).End(xlUp).Row
            ' Position pour l'écriture du prochain onglet
            dls = IIf(dlg = 1, 1, dlg + 1)
            ' Position pour la modification de l'ID par le nom d'onglet
            dlm = IIf(dlg = 1, dls - 1, dlg - 1)
            
            Dim n As Byte
            n = IIf(dlg = 1, 1, 2)
            
            'Copie le contenu de l'onglet source à la suite dans l'onglet de travail
            Ws.Range("A" & n & ":V" & Ws.Range("A" & Rows.Count).End(xlUp).Row).Copy oShData.Range("A" & dls)
            'Modifie la numérotation par le nom de l'onglet source
            oShData.Range("A" & dlg + 1 & ":A" & dlm + Ws.Range("A" & Rows.Count).End(xlUp).Row).Value = Ws.Name
        End If
    Next Ws


Encore merci,
Bonne journée,
 

Discussions similaires

Réponses
12
Affichages
545
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…