Remplissage automatique d'un tableau

momo

XLDnaute Occasionnel
Bonjour a tous!

Je sollicite votre aide afin de savoir si il était possible de remplir automatiquement un tableau dès lors qu'on met à jour la base de données.

J'ai bien essayé de le remplir via des formules (Matricielles); mais vu que le fichier était lourd il a commencé a ramer un peu

Si vous pouvez me proposer un solution via macro que je pourrais utiliser sur mon exemple et aussi pourquoi pas l'adapter a différentes situation je vous en serais grandement reconnaissant..

Merci d'avance
 

Pièces jointes

  • Remplissage automatique d'un tableau.xlsx
    80.6 KB · Affichages: 49
  • Remplissage automatique d'un tableau.xlsx
    80.6 KB · Affichages: 53

job75

XLDnaute Barbatruc
Re : Remplissage automatique d'un tableau

Bonsoir momo,

Excel n'est pas devin et nous non plus.

Faites au moins en sorte que les en-têtes de colonnes du 2ème tableau se retrouvent dans le 1er.

Et si elles sont dans le même ordre ce sera simple : il suffira de copier le 1er tableau, puis de supprimer des colonnes.

Bonne soirée.
 

momo

XLDnaute Occasionnel
Re : Remplissage automatique d'un tableau

Bonsoir Job,

Effectivement vous ne pouvez pas deviner les entêtes.. Je pensais qu'en mettant les information ça aurait simplifier la donne... Je mets à jour le tableau..

Par contre dans le fichier originel la tableau est dessiné comme ça, donc je me suis dis que si je supprimais les colonnes ou si je les mettais les uns a la suite des autres la solution VBA aurait tenu compte de cet ordre là et il m'aurait été difficile d'adapter plus tard la macro au tableau réel.

J'ai mis en couleur les entêtes de colonnes qui sont identiques dans les deux tableau
 

Pièces jointes

  • Remplissage automatique d'un tableau.xlsx
    80.6 KB · Affichages: 82
  • Remplissage automatique d'un tableau.xlsx
    80.6 KB · Affichages: 54
Dernière édition:

job75

XLDnaute Barbatruc
Re : Remplissage automatique d'un tableau

Re,

En fait il n'est pas indispensable qu'il y ait une correspondance exacte des en-têtes de colonnes.

Il suffit dans la macro de faire correspondre correctement les numéros de colonnes :

Code:
Private Sub Worksheet_activate()
Dim t, t1, rest(), i&, lig As Variant, j%
t = Sheets("Base").UsedRange.Offset(1)
t1 = Me.UsedRange.Offset(1)
ReDim rest(1 To Application.Max(UBound(t), UBound(t1)), 1 To UBound(t1, 2))
For i = 1 To UBound(t)
  '---copie des colonnes communes---
  rest(i, 1) = t(i, 1)
  rest(i, 2) = t(i, 5)
  rest(i, 9) = t(i, 3)
  rest(i, 15) = t(i, 4)
  rest(i, 16) = t(i, 16)
  rest(i, 17) = t(i, 15)
  rest(i, 18) = t(i, 14)
  rest(i, 19) = t(i, 10)
  rest(i, 20) = t(i, 12)
  rest(i, 24) = t(i, 7)
  rest(i, 29) = t(i, 6)
  rest(i, 30) = t(i, 7)
  rest(i, 31) = t(i, 11)
  '---copie des colonnes remplies manuellement---
  lig = Application.Match(t(i, 4), Application.Index(t1, 0, 15), 0)
  If IsNumeric(lig) Then
    For j = 3 To 8
      rest(i, j) = t1(lig, j)
    Next j
    For j = 10 To 14
      rest(i, j) = t1(lig, j)
    Next j
    For j = 21 To 23
      rest(i, j) = t1(lig, j)
    Next j
    For j = 25 To 28
      rest(i, j) = t1(lig, j)
    Next j
  End If
Next i
'---restitution---
On Error Resume Next
Me.ShowAllData 'si la feuille est filtrée
[A2].Resize(UBound(rest), UBound(rest, 2)) = rest
End Sub
La macro est dans la feuille "Tableau à remplir" et se déclenche quand on active cette feuille.

Elle est très rapide car elle traite des tableaux VBA.

Fichier joint pour tester.

Edit : ajouté Me.ShowAllData au cas où la feuille serait filtrée.

Bonne nuit.
 

Pièces jointes

  • Remplissage automatique d'un tableau(1).xlsm
    87.4 KB · Affichages: 48
Dernière édition:

momo

XLDnaute Occasionnel
Re : Remplissage automatique d'un tableau

Vraiment Merci Job... Vous avez toujours solution à mes nombreuses questions....Je vous en remercie infiniment

Ps: Est ce qu'il serait possible d'automatiser si on veut les colonnes qui aujourd'hui sont manuellement remplies?

Bonne nuit
 

job75

XLDnaute Barbatruc
Re : Remplissage automatique d'un tableau

Bonjour momo, le forum,

Ps: Est ce qu'il serait possible d'automatiser si on veut les colonnes qui aujourd'hui sont manuellement remplies?
Soit les colonnes sont communes aux 2 feuilles, soit elles sont remplies manuellement.

Si on modifie le type ou l'ordre de ces colonnes il faut revoir les colonnes des tableaux dans la macro.

Maintenant voici une version (2) qui améliore la rapidité d'exécution.

Dans la version (1) la détermination de lig par Application.Match prend du temps.

Avec les 2 tableaux triés c'est nettement plus rapide :

Code:
Option Compare Text 'la casse est ignorée

Private Sub Worksheet_Activate()
Dim base As Range, dest As Range, t, t1, rest(), ub&, deb&, i&, lig&, x, j%
Application.ScreenUpdating = False
On Error Resume Next
Set base = Sheets("Base").UsedRange.Offset(1)
base.Parent.ShowAllData 'si la feuille est filtrée
base.Sort base.Columns(4), xlAscending, Header:=xlNo 'tri sur PO number
Set dest = Me.UsedRange.Offset(1)
Me.ShowAllData 'si la feuille est filtrée
dest.Sort dest.Columns(15), xlAscending, Header:=xlNo 'tri sur PO number
On Error GoTo 0
t = base 'matrices, plus rapide
t1 = dest
ReDim rest(1 To Application.Max(UBound(t), UBound(t1)), 1 To UBound(t1, 2))
ub = UBound(t1)
deb = 1
For i = 1 To UBound(t)
  '---copie des colonnes communes---
  rest(i, 1) = t(i, 1)
  rest(i, 2) = t(i, 5)
  rest(i, 9) = t(i, 3)
  rest(i, 15) = t(i, 4)
  rest(i, 16) = t(i, 16)
  rest(i, 17) = t(i, 15)
  rest(i, 18) = t(i, 14)
  rest(i, 19) = t(i, 10)
  rest(i, 20) = t(i, 12)
  rest(i, 24) = t(i, 7)
  rest(i, 29) = t(i, 6)
  rest(i, 30) = t(i, 7)
  rest(i, 31) = t(i, 11)
  '---détermination de lig---
  lig = 0
  x = t(i, 4) 'PO number à rechercher
  For deb = deb To ub
    If t1(deb, 15) = x Then lig = deb: deb = deb + 1: Exit For
    If t1(deb, 15) > x Then Exit For
  Next deb
  '---copie des colonnes remplies manuellement---
  If lig Then
    For j = 3 To 8
      rest(i, j) = t1(lig, j)
    Next j
    For j = 10 To 14
      rest(i, j) = t1(lig, j)
    Next j
    For j = 21 To 23
      rest(i, j) = t1(lig, j)
    Next j
    For j = 25 To 28
      rest(i, j) = t1(lig, j)
    Next j
  End If
Next i
'---restitution---
dest.Resize(UBound(rest), UBound(rest, 2)) = rest
End Sub
Bonne journée.
 

Pièces jointes

  • Remplissage automatique d'un tableau(2).xlsm
    88.7 KB · Affichages: 52
Dernière édition:

job75

XLDnaute Barbatruc
Re : Remplissage automatique d'un tableau

Re,

Effectivement, à cause de Application.Match, la version (1) est très lente.

Chez moi sur 4207 lignes il faut 156 secondes.

Et cela avec les cellules "manuelles" vides.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 102
Membres
103 117
dernier inscrit
augustin.morille