Demande d'exemple pour compiler avec une boucle des données dans une autre feuille

zephir94

XLDnaute Impliqué
Bonjour à tous,

Ayant bien avancé dans le monde du vba je voudrais passer à l'étape suivante en récupérant des données d'une feuille pour les trier dans un tableau d'une autre.
J'ai fourni un fichier exemple, si l'un d'entre vous pouvez me détailler le code je l'en remercie par avance
 

Pièces jointes

  • Classeur1.xls
    21.5 KB · Affichages: 63
  • Classeur1.xls
    21.5 KB · Affichages: 72
  • Classeur1.xls
    21.5 KB · Affichages: 66

job75

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Bonjour zephir94,

C'est typiquement le genre de problème pour lequel VBA est inutile.

Formule en Feuil2!B2 à tirer à droite et vers le bas :

Code:
=SOMMEPROD((MOIS(Feuil1!$A$2:$A$100)=LIGNE()-1)*(Feuil1!B$2:B$100<>""))
Et bien sûr masquer les valeurs zéro, soit de la feuille, soit du tableau.

A+
 

zephir94

XLDnaute Impliqué
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Bonsoir Job75,
Je voudrais en VBA car je continu mon auto formation ;) et cet exemple si je le digère va me permettre d'zller plus loin dans beaucoup de mes projets !
 

job75

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Re,

Bon alors dans le code de Feuil2 :

Code:
Private Sub Worksheet_Activate()
With [B2:F13]
  .Formula = "=IFERROR(1/(1/SUMPRODUCT((MONTH(Feuil1!R2C1:R100C1)=ROW()-1)*(Feuil1!R2C:R100C<>""""))),"""")"
  .Value = .Value
End With
End Sub
J'utilise SIERREUR puisque vous êtes sur Excel 2007.

La macro s'exécute quand on active la feuille.

A+
 

zephir94

XLDnaute Impliqué
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Merci Job75

Serait 'il possible entièrement en vba et sans une once de formule ?
Je désire vraiment apprendre le mécanisme en vba
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Re,

Quand on traite des tableaux Excel le mieux (le plus rapide) est d'utiliser des tableaux VBA.

Ici les tableaux base et t :

Code:
Private Sub Worksheet_Activate()
Dim base, nligbase&, ncol%, t, i&, j%, k&
base = Feuil1.UsedRange 'tableau, CodeName de la feuille
nligbase = UBound(base)
With [B2:F13]
  ncol = .Columns.Count
  ReDim t(1 To .Rows.Count, 1 To ncol) 'tableau base 1
  For i = 1 To UBound(t)
    For j = 1 To ncol
      For k = 2 To nligbase
        If IsDate(base(k, 1)) Then If Month(base(k, 1)) = i Then _
          If base(k, j + 1) <> "" Then t(i, j) = t(i, j) + 1 'comptage
      Next k
    Next j
  Next i
  .Value = t 'restitution dans la feuille
End With
End Sub
Bonne fin de soirée.
 

job75

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Bonjour zephir94, le forum,

Pour s'assurer que le tableau base a un nombre suffisant de colonnes utiliser :

Code:
Private Sub Worksheet_Activate()
Dim ncol%, base, nligbase&, t, i&, j%, k&
With [B2:F13]
  ncol = .Columns.Count
  base = Feuil1.UsedRange.Resize(, ncol + 1) 'tableau, CodeName
  nligbase = UBound(base)
  ReDim t(1 To .Rows.Count, 1 To ncol) 'tableau base 1
  For i = 1 To UBound(t)
    For j = 1 To ncol
      For k = 2 To nligbase
        If IsDate(base(k, 1)) Then If Month(base(k, 1)) = i Then _
          If base(k, j + 1) <> "" Then t(i, j) = t(i, j) + 1 'comptage
      Next k
    Next j
  Next i
  .Value = t 'restitution dans la feuille
  .Cells(0, 0).Resize(, ncol + 1) = Application.Index(base, 1, 0) 'titres
End With
End Sub
De plus à la fin les valeurs de la ligne 1 (titres) sont copiées.

Bonne journée.
 

zephir94

XLDnaute Impliqué
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Bonjour Job75,

je suis en train d'essayer de comprendre le code et sa construction,
pourquoi les variables sont sous cette forme ?
Dim ncol%, base, nligbase&, t, i&, j%, k&

J'ai pas mal de soucis de compréhension :confused:

mais mon objectif est de commencer à comprendre et manipuler ce genre de tri de données.
N'y a t'il pas plus simple dans le cadre de mon fichier exemple à fin d'avoir une compréhension progressive ?
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Re,

Pour la déclaration des variables :

https://www.excel-downloads.com/thr...sieurs-variables-dun-meme-type-en-vba.167453/

Pour le reste ma macro est très simple, il n'y a guère de difficultés pour la comprendre.

Bien sûr il faut savoir ce que signifie chaque mot du code, quand on ne sait pas on va voir l'aide VBA ou l'on fait une recherche sur le web/Forum.

A+
 

job75

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Re,

Une autre manière de construire le tableau mais pas plus simple :

Code:
Private Sub Worksheet_Activate()
Dim deb As Range, ncol%, base, nligbase&, t(), i&, j%, k&
Set deb = [A1] '1ère cellule, à adapter
ncol = 6 'nombre de colonnes du tableau, à adapter
base = Feuil1.UsedRange.Resize(, ncol) 'tableau, CodeName de la feuille
nligbase = UBound(base)
ReDim t(1 To 12, 1 To ncol - 1) 'tableau base 1
For i = 1 To 12
  For j = 1 To ncol - 1
    For k = 2 To nligbase
      If IsDate(base(k, 1)) Then If Month(base(k, 1)) = i Then _
        If base(k, j + 1) <> "" Then t(i, j) = t(i, j) + 1 'comptage
Next k, j, i
deb(2, 2).Resize(12, ncol - 1) = t 'restitution dans la feuille
'---titres---
deb.Resize(, ncol) = Application.Index(base, 1, 0)
deb(2).Resize(12).FormulaArray = "=UPPER(TEXT(""1/""&ROW(1:12),""mmm""))"
deb(2).Resize(12) = deb(2).Resize(12).Value
End Sub
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Re,

Allez une dernière solution qui intègre les titres dans le tableau t :

Code:
Private Sub Worksheet_Activate()
Dim deb As Range, ncol%, base, nligbase&, t(), i&, j%, k&
Set deb = [A1] '1ère cellule, à adapter
ncol = 6 'nombre de colonnes du tableau, à adapter
base = Feuil1.UsedRange.Resize(, ncol) 'tableau, CodeName de la feuille
nligbase = UBound(base)
ReDim t(1 To 13, 1 To ncol) 'tableau base 1
For i = 1 To 13
  For j = 1 To ncol
    If i = 1 Then
      t(1, j) = base(1, j) 'titres en 1ère ligne
    ElseIf j = 1 Then
      t(i, 1) = UCase(Format("1/" & i - 1, "mmm")) 'titres en 1ère colonne
    Else
      For k = 2 To nligbase
        If IsDate(base(k, 1)) Then If Month(base(k, 1)) = i - 1 Then _
          If base(k, j) <> "" Then t(i, j) = t(i, j) + 1 'comptage
      Next k
    End If
Next j, i
deb.Resize(13, ncol) = t 'restitution dans la feuille
End Sub
A+
 

zephir94

XLDnaute Impliqué
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

Bonjour Job75,

LA fonction UBound m'a fait découvrir les tableaux, je suis entrain de lire des tutos mais pour l'instant je reste dans l'ombre !
Il n'y a qu'avec l'utilisation d'un tableau ?
 
Dernière édition:

zephir94

XLDnaute Impliqué
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

En fouillant un peu sur le web j'ai trouvé cet exemple qui sauf erreur de ma part ne fonctionne pas avec un tableau ?
Code:
Sub test2()
  Range("A49:A57").ClearContents
 On Error Resume Next
  For Each Cell In Feuil1.Columns(2).SpecialCells(xlCellTypeConstants)
    If UCase(Cell.Value) = UCase(Nom) Then
      Mois = Month(Cell.Offset(0, - 2).Value)
      lgNom = Cell.Row
      For Each Cel In Feuil12.Range("E" & lgNom & ":AA" & lgNom).SpecialCells(xlCellTypeConstants)
        Set lgPoste = Feuil4.Range("A49:A57").Find(Cel.Value, LookIn:=xlValues, lookat:=xlWhole)
        Feuil4.Cells(lgPoste.Row, Mois + 1) = Feuil2.Cells(lgPoste.Row, Mois + 1) + 1
      Next Cel
    End If
  Next Cell
 

End Sub

Même si je ne maitrise pas la totalité du code il me semble qu'il travail en deux dimension en recherchant dans les lignes et les colonnes les valeurs non ?
 
Dernière édition:

Si...

XLDnaute Barbatruc
Re : Demande d'exemple pour compiler avec une boucle des données dans une autre feuil

salut

dans le dernier code, il n'y a pas de tableau et le travail se fait sur 2 boucles.
En voici un autre (fichier à partir du fichier donné et avec quelques explications)
VB:
Private Sub Worksheet_Activate()
  Dim R As Range, L As Byte, C As Byte
  [B2:F13] = ""
  With Feuil1
    For Each R In .[A2:A6]
      L = Month(R) + 1
      For C = 2 To 6
        If .Cells(R.Row, C) = "x" Then Cells(L, C) = Cells(L, C) + 1
      Next
    Next
  End With
End Sub

Nota : les lignes de titre des 2 plages sont identiques. Dans le cas contraire, les choses se compliquent
 

Pièces jointes

  • VBA Boucles.xlsm
    21.4 KB · Affichages: 36

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof