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

Staple1600

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

Re

Job75
Je parlais juste de la possiblité qu'offre l'emploi des affichages personnalisés pour enregistrer le résultat d'un filtre.
Tu es d'accord pour dire que cela est possible?
Maintenant, si tu pressens que le customview n'est pas utile ici, je ne vais pas commettre la folie d'aller tâter du CustomView en vba pour des nèfles ;)
 

job75

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

Re,

Eh bien bravo job, j'ai perdu mon temps et je vous ai fait perdre le vôtre.

En effet le filtrage ne posait aucun problème sur le fichier de mon post #3, il suffisait de définir correctement la plage P.

Feuille "TEST" :
Code:
Private Sub Worksheet_Activate()
Dim 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
  [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 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 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
  [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 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

  • On repart à zéro(1).xls
    42.5 KB · Affichages: 26

Staple1600

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

Re

Job75
Eh bien bravo job, j'ai perdu mon temps et je vous ai fait perdre le vôtre.
Outch! Job75, mon précédent message ne veut aucunement désobligeant à ton égard ;)
1) Je voulais informer le lecteur qu'on peut enregistrer le résultat d'un filtre avec l'affichage personnalisé.
2) Ensuite comme tu penses que cette fonctionnalité n'est pas utile ici, je me range à ton jugement.
C'est tout ce que voulait dire ma phrase ponctuée par un clin d'oeil dans le précédent message.
 

job75

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

Annulé car sans intérêt.

Le copier-coller se fait aussi bien que le transfert de valeurs avec la méthode du post #17.
 
Dernière édition:

patapock

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

Alors la, Chapeau Bas!
Merci a tous les deux.

Il va me falloir un peu de temps pour comprendre et digérer ce code afin de pouvoir m'en inspirer pour ce que je souhaite faire, mais c'est ça!

Job75,
en jouant avec ton fichier joint, je constate que si je déplace une ligne par un "couper" puis "insérer les cellules coupées", la mise a jour se fait dans les deux feuilles. Logique, mais, dans mon projet, la feuille "Scope" est constitue d'un empilement de tableaux. Le nombre de colonnes ne change pas, et certaines de ces colonnes, sont reproduites dans un autre ordre, dans la feuille "Test".

Mon idée finale, est de pouvoir, dans test, déplacer périodiquement certaines lignes de la feuille "test" (pour les mettre dans un ordre vertical différent:

En tête de feuille, après quelques lignes de "décoration", je place les lignes des personnels actuellement en fonction, et j’envoie cette liste sous format PDF. Quand les personnels sont en congé, je re-deplace les lignes plus bas, dans une rubrique "en congé". Je le ferai par un tri en fonction de dates d’entrée et sortie, qui seront renseignées dans le tableau

Il faudrait, en plus de ce que fait déjà ton code, que si je remonte ou descende une des lignes de "Test", ceci ne vienne cette fois plus, affecter la mise en page de "Scope" ou test (sauf en cas de suppression).

Hors Sujet: Comment as tu acquis ton savoir?
 

job75

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

Bonjour patapock, le forum,

J'y ai été un peu fort mais vous avez pris mon post #21 avec l'humour qu'il fallait.

En remerciement voici un complément important pour la feuille "TEST" :

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

Private Sub Worksheet_Activate()
Dim t, nlig&, ncol%, P As Range, source, dest(), x$, i&, j&, k%
Application.ScreenUpdating = False
t = Intersect(Me.UsedRange, Rows("4:" & Rows.Count)) 'mémorise
nlig = UBound(t)
ncol = UBound(t, 2)
Rows("5:" & Rows.Count).ClearContents 'RAZ
With Sheets("Scope")
  Set P = Intersect(.UsedRange, .Range("A3:C" & .Rows.Count))
End With
If Not P Is Nothing Then
  source = P
  ReDim dest(1 To UBound(source), 1 To ncol)
  For i = 1 To UBound(dest)
    dest(i, 1) = source(i, 3)
    dest(i, 2) = source(i, 1)
    dest(i, 3) = source(i, 2)
    x = dest(i, 2) & dest(i, 3) 'nom + prénom
    For j = 1 To nlig
      If t(j, 2) & t(j, 3) = x Then
        For k = 4 To ncol
          dest(i, k) = t(j, k)
        Next k
        Exit For
      End If
    Next j
  Next i
  [A5].Resize(UBound(dest), ncol) = dest
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
Si le nom + prénom de la feuille "Scope" existaient en feuille "TEST", les colonnes suivantes sont restituées, sinon elles sont vides.

Malgré les 3 boucles la macro est rapide car on utilise des tableaux VBA (matrices).

Fichier (2).

Edit : j'ai ajouté Option Compare Text pour que la casse soit ignorée dans la comparaison avec x.

A+
 

Pièces jointes

  • On repart à zéro(2).xls
    54.5 KB · Affichages: 31
Dernière édition:

job75

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

Bonjour patapock,

Je n'avais pas testé sur Excel 2003, cette ligne beugue si une cellule du tableau est sélectionnée :

Code:
Rows(P.Rows(i).Row + 1 & ":" & Rows.Count - 1).Delete
Il faut donc d'abord désélectionner :

Code:
[A1].Select 'désélection du tableau pour Excel 2003
Rows(P.Rows(i).Row + 1 & ":" & Rows.Count - 1).Delete
Fichier (3).

A+
 

Pièces jointes

  • On repart à zéro(3).xls
    53.5 KB · Affichages: 27

patapock

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

Me revoilà.

Je tenais a tous vous remercier, et en particulier Job75.
J'ai réussi a analyser et intégrer le code présente, et mon projet a fait un grand bond en avant grâce a vous.

Je marquerai bien cette discussion "Résolu", mais je ne trouve pas le lien?
 

Discussions similaires

Statistiques des forums

Discussions
312 502
Messages
2 089 049
Membres
104 012
dernier inscrit
baffyt2