Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et synchro

patapock

XLDnaute Nouveau
Soit,

  • dans la feuille "Scope", un tableau nomme "SM
  • dans la feuille "TEST", un tableau nomme "SM2"

Je souhaiterai que (par exemple):

-la "Colonne1" de SM_2 soit l'identique de la "Colone3" de SM
-la "Colonne2" de SM_2 soit l'identique de la "Colone1" de SM
-la "Colonne3" de SM_2 soit l'identique de la "Colone2" de SM

et que les mises a jours des données, ou l'ajout ou la suppression d'une ligne, se synchronisent automatiquement entre SM et SM_2. La cerise sur le gâteau serait que la synchronisation soit bidirectionnelle: une cellule modifiée dans une des feuilles, se répercute instantanément dans l'autre.
 

Pièces jointes

  • Test.xls
    40 KB · Affichages: 28
  • Test.xls
    40 KB · Affichages: 29
  • Test.xls
    40 KB · Affichages: 29

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Bonjour patapok,

Le problème nécessite des précisions.

En effet SM_2 a plus de colonnes que SM, que fait-on des données des colonnes excédentaires ? On n'y touche pas ?

A+
 

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Re,

Si l'on ne s'occupe pas des autres colonnes, macro dans la feuille "TEST" :
Code:
Private Sub Worksheet_Activate()
Dim dercel As Range, P As Range
Application.ScreenUpdating = False
Range("A5:C" & Rows.Count).ClearContents
With Sheets("Scope")
  Set dercel = .[A:C].Find("*", , xlValues, , xlByRows, xlPrevious)
  If dercel Is Nothing Then Exit Sub
  If dercel.Row < 3 Then Exit Sub
  Set P = .Range("A3:C" & dercel.Row)
End With
[A5].Resize(P.Rows.Count) = P.Columns(3).Value
[B5].Resize(P.Rows.Count) = P.Columns(1).Value
[C5].Resize(P.Rows.Count) = P.Columns(2).Value
End Sub
Et dans la feuille "Scope" :
Code:
Private Sub Worksheet_Activate()
Dim dercel As Range, P As Range
Application.ScreenUpdating = False
Range("A3:C" & Rows.Count).ClearContents
With Sheets("TEST")
  Set dercel = .[A:C].Find("*", , xlValues, , xlByRows, xlPrevious)
  If dercel Is Nothing Then Exit Sub
  If dercel.Row < 5 Then Exit Sub
  Set P = .Range("A5:C" & dercel.Row)
End With
[A3].Resize(P.Rows.Count) = P.Columns(2).Value
[B3].Resize(P.Rows.Count) = P.Columns(3).Value
[C3].Resize(P.Rows.Count) = P.Columns(1).Value
End Sub
Chacune se déclenche quand on active la feuille.

Fichier joint.

A+
 

Pièces jointes

  • Test(1).xls
    49 KB · Affichages: 33
  • Test(1).xls
    49 KB · Affichages: 33
  • Test(1).xls
    49 KB · Affichages: 33
Dernière édition:

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Re,

J'ai essayé de faire quelque chose pour le cas où les tableaux sont filtrés, mais je n'y suis pas arrivé.

Les macros précédentes ne fonctionnent que si les tableaux ne sont pas filtrés.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Re,

Ce que je peux faire c'est empêcher de quitter la feuille tant que toutes les lignes ne sont pas affichées.

Dans la feuille "TEST" :
Code:
Private Sub Worksheet_Deactivate()
If Range("A5:A" & Rows.Count).SpecialCells(xlCellTypeVisible).Count _
  < Rows.Count - 4 Then
  MsgBox "Affichez toutes les lignes..."
  Application.EnableEvents = False
  Me.Activate
  Application.EnableEvents = True
End If
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Test(2).xls
    40 KB · Affichages: 26
  • Test(2).xls
    40 KB · Affichages: 28
  • Test(2).xls
    40 KB · Affichages: 26
Dernière édition:

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Bonjour patapock, le forum,

Une autre solution qui empêche toute modification quand il y a filtrage.

Dans la feuille TEST :
Code:
Private Sub Worksheet_Activate()
If flag Then Exit Sub
Dim dercel As Range, P As Range
Application.ScreenUpdating = False
Range("A5:C" & Rows.Count).ClearContents
With Sheets("Scope")
  Set dercel = .[A:C].Find("*", , xlValues, , xlByRows, xlPrevious)
  If dercel Is Nothing Then Exit Sub
  If dercel.Row < 3 Then Exit Sub
  Set P = .Range("A3:C" & dercel.Row)
End With
[A5].Resize(P.Rows.Count) = P.Columns(3).Value
[B5].Resize(P.Rows.Count) = P.Columns(1).Value
[C5].Resize(P.Rows.Count) = P.Columns(2).Value
End Sub

Private Sub Worksheet_Deactivate()
If Range("A5:A" & Rows.Count).SpecialCells(xlCellTypeVisible).Count _
  < Rows.Count - 4 Then
  MsgBox "Affichez toutes les lignes...", , "STOP"
  flag = True: Me.Activate: Application.OnTime 1, "RAZ"
End If
End Sub
Dans Module1 :
Code:
Public flag As Boolean 'mémorisation

Sub RAZ()
flag = False
End Sub
Fichier (3).

A+
 

Pièces jointes

  • Test(3).xls
    56 KB · Affichages: 27
  • Test(3).xls
    56 KB · Affichages: 29
  • Test(3).xls
    56 KB · Affichages: 27

patapock

XLDnaute Nouveau
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

job75,

mille merci pour le temps passe a chercher "la meilleure solution possible".
(je pense que c'est le week-end pour toi)

Pas eu le loisir d'aller sur le forum plus tôt, du fait d'obligations professionnelles (Peace Keeping Air Operations) qui ne s’arrêtent hélas jamais.

Le problème nécessite des précisions.

En effet SM_2 a plus de colonnes que SM, que fait-on des données des colonnes excédentaires ? On n'y touche pas ?

Oui, les colonnes excédentaires n'importent pas dans le cas de cet exemple.

Je tache de décortiquer tes exemples au plus vite, et je reviens vers toi très vite.
Cordialement
 

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Re,

Avec les fichiers précédents, si l'on supprimait des lignes, il restait des bordures excédentaires dans l'autre tableau.

Ceci y remédie :
Code:
1 Set dercel = Cells.Find("*", , , , xlByRows, xlPrevious)
Rows(dercel.Row + 1 & ":" & Rows.Count - 1).Delete
Fichier (4).

A+
 

Pièces jointes

  • Test(4).xls
    56.5 KB · Affichages: 28
  • Test(4).xls
    56.5 KB · Affichages: 34
  • Test(4).xls
    56.5 KB · Affichages: 30

patapock

XLDnaute Nouveau
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Ok.
Je suis dans le code de ton dernier exemple pour essayer d'y voir plus clair.
Euh, j’exagère si je te demande de rajouter quelques commentaires dans le code?

En fait, le VBA était encore inconnu pour moi il y a une dizaine de jours (j'avais fait quelques essais il y a longtemps, mais abandonne, faute de temps).

La, je me force a aller au bout coute que coute car, vu la paperasse croissante que j'ai a traiter avec mes équipes, ce sera un vrai investissement.

Pour le coup des lignes masquées, j'ai épluché le web en quête d'une solution, mais en vain.
Je pense pouvoir contourner le problème: La saisie/modification des lignes du tableau se fera par formulaire, et pourquoi pas, inclure dans le code de celui-ci, une fonction pour identifier les lignes visibles, puis tout démasquer, et enfin re-filtrer après l'insertion de nouvelle ligne.
 

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Bonjour patapock, le forum,

Bien comprendre que sur les fichiers (3) et (4) 2 ou 3 événements sont créés quand on active une feuille :

- un événement Deactivate sur la feuille que l'on quitte

- un événement Activate sur la feuille que l'on active

- un événement Activate au retour sur la 1ère feuille, créé par la macro Deactivate, si la feuille est filtrée.

Pour neutraliser les 2 macros Activate la macro Deactivate passe la variable Public flag à True, la neutralisation se faisant par l'instruction If flag Then Exit Sub.

Avec Application.OnTime 1, "RAZ" la macro Deactivate lance la macro RAZ qui remet flag à False, l'exécution ayant lieu après que les 3 autres macros aient été exécutées.

Bonne journée et A+
 

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Re,

(...) et pourquoi pas, inclure dans le code de celui-ci, une fonction pour identifier les lignes visibles, puis tout démasquer, et enfin re-filtrer après l'insertion de nouvelle ligne.

N'y comptez pas, il est quasiment impossible - à moins peut-être de faire une usine à gaz - de mémoriser le filtrage d'un tableau.

Surtout avec les filtres complexes d'Excel 2007/2010.

C'est bien pour ça que j'empêche de quitter la feuille si le tableau est filtré.

A+
 

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Re,

Maintenant il y a une autre solution, c'est de traiter les cellules une par une.

Sur un grand tableau ce sera bien sûr beaucoup plus long.

Dans le code de la feuille "TEST" :
Code:
Private Sub Worksheet_Activate()
Dim P As Range, i&, j As Byte
Application.ScreenUpdating = False
Range("A5:C" & Rows.Count).ClearContents
With Sheets("Scope")
  Set P = Intersect(.UsedRange, .Range("A3:C" & .Rows.Count))
End With
If Not P Is Nothing Then
  For i = 1 To P.Rows.Count
    For j = 1 To 3
      [A5].Cells(i, j) = P(i, IIf(j = 1, 3, IIf(j = 2, 1, 2)))
    Next
  Next
End If
'---recherche de la dernière ligne---
Set P = Me.UsedRange
For i = P.Rows.Count To 1 Step -1
  If Application.CountA(P.Rows(i)) Then Exit For
Next
Rows(P.Rows(i).Row + 1 & ":" & Rows.Count - 1).Delete
End Sub
Dans le code de la feuille "Scope" :
Code:
Private Sub Worksheet_Activate()
Dim P As Range, i&, j As Byte
Application.ScreenUpdating = False
Range("A3:C" & Rows.Count).ClearContents
With Sheets("TEST")
  Set P = Intersect(.UsedRange, .Range("A5:C" & .Rows.Count))
End With
If Not P Is Nothing Then
  For i = 1 To P.Rows.Count
    For j = 1 To 3
      [A3].Cells(i, j) = P(i, IIf(j = 1, 2, IIf(j = 2, 3, 1)))
    Next
  Next
End If
'---recherche de la dernière ligne---
Set P = Me.UsedRange
For i = P.Rows.Count To 1 Step -1
  If Application.CountA(P.Rows(i)) Then Exit For
Next
Rows(P.Rows(i).Row + 1 & ":" & Rows.Count - 1).Delete
End Sub
Nouveau fichier joint.

A+
 

Pièces jointes

  • Test avec filtrage(1).xls
    51.5 KB · Affichages: 34

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Re,

Avec un tableau a de 3 éléments c'est quand même plus rapide.

Feuille "Test" :
Code:
Private Sub Worksheet_Activate()
Dim a(1 To 3), P As Range, i&
Application.ScreenUpdating = False
Range("A5:C" & Rows.Count).ClearContents
With Sheets("Scope")
  Set P = Intersect(.UsedRange, .Range("A3:C" & .Rows.Count))
End With
If Not P Is Nothing Then
  For i = 1 To P.Rows.Count
    a(1) = P(i, 3): a(2) = P(i, 1): a(3) = P(i, 2)
    [A5].Cells(i).Resize(, 3) = a
  Next
End If
'---recherche de la dernière ligne---
Set P = Me.UsedRange
For i = P.Rows.Count To 1 Step -1
  If Application.CountA(P.Rows(i)) Then Exit For
Next
Rows(P.Rows(i).Row + 1 & ":" & Rows.Count - 1).Delete
End Sub
Feuille "Scope" :
Code:
Private Sub Worksheet_Activate()
Dim a(1 To 3), P As Range, i&
Application.ScreenUpdating = False
Range("A3:C" & Rows.Count).ClearContents
With Sheets("TEST")
  Set P = Intersect(.UsedRange, .Range("A5:C" & .Rows.Count))
End With
If Not P Is Nothing Then
  For i = 1 To P.Rows.Count
    a(1) = P(i, 2): a(2) = P(i, 3): a(3) = P(i, 1)
    [A3].Cells(i).Resize(, 3) = a
  Next
End If
'---recherche de la dernière ligne---
Set P = Me.UsedRange
For i = P.Rows.Count To 1 Step -1
  If Application.CountA(P.Rows(i)) Then Exit For
Next
Rows(P.Rows(i).Row + 1 & ":" & Rows.Count - 1).Delete
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Test avec filtrage(2).xls
    52 KB · Affichages: 31

Staple1600

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Bonjour à tous


Job75

Re,
N'y comptez pas, il est quasiment impossible - à moins peut-être de faire une usine à gaz - de mémoriser le filtrage d'un tableau.
Je ne suis pas entièrement d'accord avec cela ;)
La mission n'est pas forcement impossible.
Créer, appliquer ou supprimer un affichage personnalisé - Excel
On peut jouer avec les CustomView en VBA, non ?
 

job75

XLDnaute Barbatruc
Re : Copie de cetraines colonnes d'un tableau dans un autre (ordre different) et sync

Bonjour Jean-Marie :)

Je ne vois pas trop comment utiliser ici un affichage personnalisé, je te laisse essayer.

Et mes solutions des posts #12 et #13 ne touchent pas aux filtrages.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 505
Messages
2 089 067
Membres
104 015
dernier inscrit
kkgk