Macro pour modifier automatiquement des éléments sur deux feuilles différentes

Nicolas Lepauvre

XLDnaute Junior
Bonjour à tous !
Je souhaite faire la chose suivante.
Si on effectue une modification dans l’une des colonnes B, C, D ou E de la feuille1, elle s‘actualise automatiquement sur la feuille2.
De même si on effectue une modification dans l’une des colonnes E ou D de la feuille2, elle devrait s‘actualiser automatiquement sur la feuille1. En plus si on fait une nouvelle inscription sur la feuille2 elle devrait apparaître sur la feuille1.
J’ai écrit un code dans un module mais il ne se passe rien.
De ce fait je sollicite vos aides précieuses.
Je vous remercie d’avance.
 

Pièces jointes

  • Feuil1_vs_Feuil2.xlsm
    20.7 KB · Affichages: 41

job75

XLDnaute Barbatruc
Bonjour Nicolas,

Les nouvelles macros :
Code:
Sub feuille1_vers_feuille2()
Dim P As Range, t, d As Object, i&, existe As Boolean, s, a, b, rest()
Set P = Tabelle2.[A1].CurrentRegion.Resize(, 6)
t = P 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 2 To UBound(t)
  d(t(i, 1)) = t(i, 2) & Chr(1) & t(i, 3) & Chr(1) & t(i, 4) & Chr(1) & t(i, 5) & Chr(1) & t(i, 6)
Next
t = Tabelle1.[A1].CurrentRegion.Resize(, 9) 'matrice, plus rapide
For i = 2 To UBound(t)
  existe = d.exists(t(i, 1))
  If existe And t(i, 9) <> "" Or t(i, 9) = "" Then
    If existe Then
      s = Split(d(t(i, 1)), Chr(1))
      s(1) = t(i, 8): s(2) = t(i, 6): s(4) = t(i, 7)
      d(t(i, 1)) = Join(s, Chr(1))
    Else
      d(t(i, 1)) = Chr(1) & t(i, 8) & Chr(1) & t(i, 6) & Chr(1) & Chr(1) & t(i, 7)
    End If
  End If
Next
If d.Count Then
  a = d.keys: b = d.items
  ReDim rest(UBound(a), 5) 'base 0
  For i = 0 To UBound(a)
    rest(i, 0) = a(i)
    s = Split(b(i), Chr(1))
    rest(i, 1) = s(0): rest(i, 2) = s(1): rest(i, 3) = s(2): rest(i, 4) = s(3): rest(i, 5) = s(4)
  Next
  '---restitution---
  If P.Parent.FilterMode Then P.Parent.ShowAllData 'si la feuille est filtrée
  If P.SpecialCells(xlCellTypeVisible).Count < P.Count Then _
    P.AutoFilter: P.AutoFilter 'défiltrage si tableau Excel
  P(2, 1).Resize(d.Count, 6) = rest
End If
P.Parent.Activate 'facultatif
End Sub

Sub feuille2_vers_feuille1()
Dim P As Range, t, d As Object, i&, s, a, b, rest()
Set P = Tabelle1.[A1].CurrentRegion.Resize(, 8)
t = P 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 2 To UBound(t)
  d(t(i, 1)) = t(i, 2) & Chr(1) & t(i, 3) & Chr(1) & t(i, 4) & Chr(1) & t(i, 5) & Chr(1) & t(i, 6) & Chr(1) & t(i, 7) & Chr(1) & t(i, 8)
Next
t = Tabelle2.[A1].CurrentRegion.Resize(, 6) 'matrice, plus rapide
For i = 2 To UBound(t)
  If d.exists(t(i, 1)) Then
    s = Split(d(t(i, 1)), Chr(1))
    s(4) = t(i, 4): s(5) = t(i, 6): s(6) = t(i, 3) 'remplacement
    d(t(i, 1)) = Join(s, Chr(1))
  Else
    d(t(i, 1)) = Chr(1) & Chr(1) & Chr(1) & Chr(1) & t(i, 4) & Chr(1) & t(i, 6) & Chr(1) & t(i, 3)
  End If
Next
If d.Count Then
  a = d.keys: b = d.items
  ReDim rest(UBound(a), 7) 'base 0
  For i = 0 To UBound(a)
    rest(i, 0) = a(i)
    s = Split(b(i), Chr(1))
    rest(i, 1) = s(0): rest(i, 2) = s(1): rest(i, 3) = s(2): rest(i, 4) = s(3): rest(i, 5) = s(4): rest(i, 6) = s(5): rest(i, 7) = s(6)
  Next
  '---restitution---
  If P.Parent.FilterMode Then P.Parent.ShowAllData 'si la feuille est filtrée
  If P.SpecialCells(xlCellTypeVisible).Count < P.Count Then _
    P.AutoFilter: P.AutoFilter 'défiltrage si tableau Excel
  P(2, 1).Resize(d.Count, 8) = rest
End If
P.Parent.Activate 'facultatif
End Sub
Fichier (7).

Nota : je viens de corriger une coquille au fichier (6) du post #27, il manquait un Chr(1).

A+
 

Pièces jointes

  • Feuil1_vs_Feuil2(7).xlsm
    36 KB · Affichages: 32

Nicolas Lepauvre

XLDnaute Junior
Bonjour Nicolas,

Les nouvelles macros :
Code:
Sub feuille1_vers_feuille2()
Dim P As Range, t, d As Object, i&, existe As Boolean, s, a, b, rest()
Set P = Tabelle2.[A1].CurrentRegion.Resize(, 6)
t = P 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 2 To UBound(t)
  d(t(i, 1)) = t(i, 2) & Chr(1) & t(i, 3) & Chr(1) & t(i, 4) & Chr(1) & t(i, 5) & Chr(1) & t(i, 6)
Next
t = Tabelle1.[A1].CurrentRegion.Resize(, 9) 'matrice, plus rapide
For i = 2 To UBound(t)
  existe = d.exists(t(i, 1))
  If existe And t(i, 9) <> "" Or t(i, 9) = "" Then
    If existe Then
      s = Split(d(t(i, 1)), Chr(1))
      s(1) = t(i, 8): s(2) = t(i, 6): s(4) = t(i, 7)
      d(t(i, 1)) = Join(s, Chr(1))
    Else
      d(t(i, 1)) = Chr(1) & t(i, 8) & Chr(1) & t(i, 6) & Chr(1) & Chr(1) & t(i, 7)
    End If
  End If
Next
If d.Count Then
  a = d.keys: b = d.items
  ReDim rest(UBound(a), 5) 'base 0
  For i = 0 To UBound(a)
    rest(i, 0) = a(i)
    s = Split(b(i), Chr(1))
    rest(i, 1) = s(0): rest(i, 2) = s(1): rest(i, 3) = s(2): rest(i, 4) = s(3): rest(i, 5) = s(4)
  Next
  '---restitution---
  If P.Parent.FilterMode Then P.Parent.ShowAllData 'si la feuille est filtrée
  If P.SpecialCells(xlCellTypeVisible).Count < P.Count Then _
    P.AutoFilter: P.AutoFilter 'défiltrage si tableau Excel
  P(2, 1).Resize(d.Count, 6) = rest
End If
P.Parent.Activate 'facultatif
End Sub

Sub feuille2_vers_feuille1()
Dim P As Range, t, d As Object, i&, s, a, b, rest()
Set P = Tabelle1.[A1].CurrentRegion.Resize(, 8)
t = P 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 2 To UBound(t)
  d(t(i, 1)) = t(i, 2) & Chr(1) & t(i, 3) & Chr(1) & t(i, 4) & Chr(1) & t(i, 5) & Chr(1) & t(i, 6) & Chr(1) & t(i, 7) & Chr(1) & t(i, 8)
Next
t = Tabelle2.[A1].CurrentRegion.Resize(, 6) 'matrice, plus rapide
For i = 2 To UBound(t)
  If d.exists(t(i, 1)) Then
    s = Split(d(t(i, 1)), Chr(1))
    s(4) = t(i, 4): s(5) = t(i, 6): s(6) = t(i, 3) 'remplacement
    d(t(i, 1)) = Join(s, Chr(1))
  Else
    d(t(i, 1)) = Chr(1) & Chr(1) & Chr(1) & Chr(1) & t(i, 4) & Chr(1) & t(i, 6) & Chr(1) & t(i, 3)
  End If
Next
If d.Count Then
  a = d.keys: b = d.items
  ReDim rest(UBound(a), 7) 'base 0
  For i = 0 To UBound(a)
    rest(i, 0) = a(i)
    s = Split(b(i), Chr(1))
    rest(i, 1) = s(0): rest(i, 2) = s(1): rest(i, 3) = s(2): rest(i, 4) = s(3): rest(i, 5) = s(4): rest(i, 6) = s(5): rest(i, 7) = s(6)
  Next
  '---restitution---
  If P.Parent.FilterMode Then P.Parent.ShowAllData 'si la feuille est filtrée
  If P.SpecialCells(xlCellTypeVisible).Count < P.Count Then _
    P.AutoFilter: P.AutoFilter 'défiltrage si tableau Excel
  P(2, 1).Resize(d.Count, 8) = rest
End If
P.Parent.Activate 'facultatif
End Sub
Fichier (7).

Nota : je viens de corriger une coquille au fichier (6) du post #27, il manquait un Chr(1).

A+
Enorme MERCI!
 

Nicolas Lepauvre

XLDnaute Junior
Bonjour Nicolas,

Les nouvelles macros :
Code:
Sub feuille1_vers_feuille2()
Dim P As Range, t, d As Object, i&, existe As Boolean, s, a, b, rest()
Set P = Tabelle2.[A1].CurrentRegion.Resize(, 6)
t = P 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 2 To UBound(t)
  d(t(i, 1)) = t(i, 2) & Chr(1) & t(i, 3) & Chr(1) & t(i, 4) & Chr(1) & t(i, 5) & Chr(1) & t(i, 6)
Next
t = Tabelle1.[A1].CurrentRegion.Resize(, 9) 'matrice, plus rapide
For i = 2 To UBound(t)
  existe = d.exists(t(i, 1))
  If existe And t(i, 9) <> "" Or t(i, 9) = "" Then
    If existe Then
      s = Split(d(t(i, 1)), Chr(1))
      s(1) = t(i, 8): s(2) = t(i, 6): s(4) = t(i, 7)
      d(t(i, 1)) = Join(s, Chr(1))
    Else
      d(t(i, 1)) = Chr(1) & t(i, 8) & Chr(1) & t(i, 6) & Chr(1) & Chr(1) & t(i, 7)
    End If
  End If
Next
If d.Count Then
  a = d.keys: b = d.items
  ReDim rest(UBound(a), 5) 'base 0
  For i = 0 To UBound(a)
    rest(i, 0) = a(i)
    s = Split(b(i), Chr(1))
    rest(i, 1) = s(0): rest(i, 2) = s(1): rest(i, 3) = s(2): rest(i, 4) = s(3): rest(i, 5) = s(4)
  Next
  '---restitution---
  If P.Parent.FilterMode Then P.Parent.ShowAllData 'si la feuille est filtrée
  If P.SpecialCells(xlCellTypeVisible).Count < P.Count Then _
    P.AutoFilter: P.AutoFilter 'défiltrage si tableau Excel
  P(2, 1).Resize(d.Count, 6) = rest
End If
P.Parent.Activate 'facultatif
End Sub

Sub feuille2_vers_feuille1()
Dim P As Range, t, d As Object, i&, s, a, b, rest()
Set P = Tabelle1.[A1].CurrentRegion.Resize(, 8)
t = P 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 2 To UBound(t)
  d(t(i, 1)) = t(i, 2) & Chr(1) & t(i, 3) & Chr(1) & t(i, 4) & Chr(1) & t(i, 5) & Chr(1) & t(i, 6) & Chr(1) & t(i, 7) & Chr(1) & t(i, 8)
Next
t = Tabelle2.[A1].CurrentRegion.Resize(, 6) 'matrice, plus rapide
For i = 2 To UBound(t)
  If d.exists(t(i, 1)) Then
    s = Split(d(t(i, 1)), Chr(1))
    s(4) = t(i, 4): s(5) = t(i, 6): s(6) = t(i, 3) 'remplacement
    d(t(i, 1)) = Join(s, Chr(1))
  Else
    d(t(i, 1)) = Chr(1) & Chr(1) & Chr(1) & Chr(1) & t(i, 4) & Chr(1) & t(i, 6) & Chr(1) & t(i, 3)
  End If
Next
If d.Count Then
  a = d.keys: b = d.items
  ReDim rest(UBound(a), 7) 'base 0
  For i = 0 To UBound(a)
    rest(i, 0) = a(i)
    s = Split(b(i), Chr(1))
    rest(i, 1) = s(0): rest(i, 2) = s(1): rest(i, 3) = s(2): rest(i, 4) = s(3): rest(i, 5) = s(4): rest(i, 6) = s(5): rest(i, 7) = s(6)
  Next
  '---restitution---
  If P.Parent.FilterMode Then P.Parent.ShowAllData 'si la feuille est filtrée
  If P.SpecialCells(xlCellTypeVisible).Count < P.Count Then _
    P.AutoFilter: P.AutoFilter 'défiltrage si tableau Excel
  P(2, 1).Resize(d.Count, 8) = rest
End If
P.Parent.Activate 'facultatif
End Sub
Fichier (7).

Nota : je viens de corriger une coquille au fichier (6) du post #27, il manquait un Chr(1).

A+
Pouvez vous s’il vous plait m’expliquer porquoi après le <<Else>> du post 27 on a 4 fois <<Chr(1)>> et après le <<Else>> du post 35 on a 6 f0is <<Chr(1)>>?
Merci


Extrait du post 27
t = Tabelle2.[A1].CurrentRegion.Resize(, 4) 'matrice, plus rapide
For i = 2 To UBound(t)
If d.exists(t(i, 1)) Then
s = Split(d(t(i, 1)), Chr(1))
s(1) = t(i, 4): s(2) = t(i, 3): s(3) = t(i, 2) 'remplacement
d(t(i, 1)) = Join(s, Chr(1))
Else
d(t(i, 1)) = Chr(1) & Chr(1) & t(i, 4) & Chr(1) & t(i, 3) & Chr(1) & t(i, 2)
End If
Next

Extrait du post 35
t = Tabelle2.[A1].CurrentRegion.Resize(, 6) 'matrice, plus rapide
For i = 2 To UBound(t)
If d.exists(t(i, 1)) Then
s = Split(d(t(i, 1)), Chr(1))
s(4) = t(i, 4): s(5) = t(i, 6): s(6) = t(i, 3) 'remplacement
d(t(i, 1)) = Join(s, Chr(1))
Else
d(t(i, 1)) = Chr(1) & Chr(1) & Chr(1) & Chr(1) & t(i, 4) & Chr(1) & t(i, 6) & Chr(1) & t(i, 3)
End If
Next
 

job75

XLDnaute Barbatruc
Bonjour Nicolas, le forum,

Très bonne remarque Nicolas, ça prouve que vous suivez et essayez de comprendre.

Au fichier (7) du post #35 les 6 séparateurs Chr(1) concatènent les 7 colonnes B à H en Feuil1.

Par contre au fichier (6) du post #27 il n'y a que les 4 colonnes B à E à concaténer.

Il faut donc 3 séparateurs et non pas 4 après le Else.

Je corrige donc une nouvelle fois ce fichier (6).

Bonne journée.

A+
 

Nicolas Lepauvre

XLDnaute Junior
Bonjour Nicolas, le forum,

Très bonne remarque Nicolas, ça prouve que vous suivez et essayez de comprendre.

Au fichier (7) du post #35 les 6 séparateurs Chr(1) concatènent les 7 colonnes B à H en Feuil1.

Par contre au fichier (6) du post #27 il n'y a que les 4 colonnes B à E à concaténer.

Il faut donc 3 séparateurs et non pas 4 après le Else.

Je corrige donc une nouvelle fois ce fichier (6).

Bonne journée.

A+
Bien reçu! Merci
 

Nicolas Lepauvre

XLDnaute Junior
Bonjour Nicolas, le forum,

Très bonne remarque Nicolas, ça prouve que vous suivez et essayez de comprendre.

Au fichier (7) du post #35 les 6 séparateurs Chr(1) concatènent les 7 colonnes B à H en Feuil1.

Par contre au fichier (6) du post #27 il n'y a que les 4 colonnes B à E à concaténer.

Il faut donc 3 séparateurs et non pas 4 après le Else.

Je corrige donc une nouvelle fois ce fichier (6).

Bonne journée.

A+
Rebonjour Job75, bonjour le Forum
Au fichier (7) du post #35
Dans la boucle For les Chr(1) sont mis entre deux colonnes. Jusqu’ici je crois suivre.
Ce qui me dépasse : Pourquoi mettez vous après le Else 4 fois le Ch(1) avant la colonne t(i,4) ?
Merci


Extrait
For i = 2 To UBound(t)
d(t(i, 1)) = t(i, 2) & Chr(1) & t(i, 3) & Chr(1) & t(i, 4) & Chr(1) & t(i, 5) & Chr(1) & t(i, 6) & Chr(1) & t(i, 7) & Chr(1) & t(i, 8)
Next
t = Tabelle2.[A1].CurrentRegion.Resize(, 6) 'matrice, plus rapide
For i = 2 To UBound(t)
If d.exists(t(i, 1)) Then
s = Split(d(t(i, 1)), Chr(1))
s(4) = t(i, 4): s(5) = t(i, 6): s(6) = t(i, 3) 'remplacement
d(t(i, 1)) = Join(s, Chr(1))
Else
d(t(i, 1)) = Chr(1) & Chr(1) & Chr(1) & Chr(1) & t(i, 4) & Chr(1) & t(i, 6) & Chr(1) & t(i, 3)
End If
 

Nicolas Lepauvre

XLDnaute Junior
Bonjour Nicolas, le forum,

Très bonne remarque Nicolas, ça prouve que vous suivez et essayez de comprendre.

Au fichier (7) du post #35 les 6 séparateurs Chr(1) concatènent les 7 colonnes B à H en Feuil1.

Par contre au fichier (6) du post #27 il n'y a que les 4 colonnes B à E à concaténer.

Il faut donc 3 séparateurs et non pas 4 après le Else.

Je corrige donc une nouvelle fois ce fichier (6).

Bonne journée.

A+

Est-ce parce que les colonnes : <<Colonne B>>, <<Taille>>, <<Ville>>, et <<Tel>> de la feuille 1 ne sont pas demandées sur la Feuille2 ?
Merci
 

job75

XLDnaute Barbatruc
Re,

Oui c'est tout à fait ça, les 3 premiers Chr(1) concatènent 4 cellules qui doivent rester vides.

On pourrait remplacer Chr(1) & Chr(1) & Chr(1) par "" & Chr(1) & "" & Chr(1) & "" & Chr(1) & ""

mais c'est bien sûr inutile.

A+
 

Nicolas Lepauvre

XLDnaute Junior
Re,

Oui c'est tout à fait ça, les 3 premiers Chr(1) concatènent 4 cellules qui doivent rester vides.

On pourrait remplacer Chr(1) & Chr(1) & Chr(1) par "" & Chr(1) & "" & Chr(1) & "" & Chr(1) & ""

mais c'est bien sûr inutile.

A+

Bonjour Job75, bonjour le forum
1)Je veux mettre une apostroh de chaque element de cellule de la Feuille 1. Exemple : <‘NomA5>
2)Ce pendant si la cellule de la Feuille 1 est vide, il faut qu’il ait une apostrophe suivi d’un espace vide.
Exemple : <’ >
J’ai modifié votre code.
Pour le 1) c’est bon.
Pour le 2) pas.
Que puis je faire ?
Merci
 

Pièces jointes

  • Feuil1_vs_Feuil2(7).xlsm
    29.6 KB · Affichages: 18

job75

XLDnaute Barbatruc
Bonjour Nicolas,

Vous allez vous rendre vraiment malade à force de tripatouiller votre fichier.

Je vois que vous traitez les cellules une par une : très mauvaise méthode car c'est très lent.

Il faut agir sur le tableau VBA en ajoutant un espace (quel intérêt ?) quand le texte est vide :
Code:
  For i = 0 To UBound(a)
    rest(i, 0) = "'" & a(i)
    s = Split(b(i), Chr(1))
    For j = 0 To 6
      rest(i, j + 1) = "'" & IIf(s(j) = "", " ", s(j)) 'apostrophe + espace si vide
  Next j, i
Fichier (8).

A+
 

Pièces jointes

  • Feuil1_vs_Feuil2(8).xlsm
    33.9 KB · Affichages: 18

Nicolas Lepauvre

XLDnaute Junior
Bonjour Nicolas,

Vous allez vous rendre vraiment malade à force de tripatouiller votre fichier.

Je vois que vous traitez les cellules une par une : très mauvaise méthode car c'est très lent.

Il faut agir sur le tableau VBA en ajoutant un espace (quel intérêt ?) quand le texte est vide :
Code:
  For i = 0 To UBound(a)
    rest(i, 0) = "'" & a(i)
    s = Split(b(i), Chr(1))
    For j = 0 To 6
      rest(i, j + 1) = "'" & IIf(s(j) = "", " ", s(j)) 'apostrophe + espace si vide
  Next j, i
Fichier (8).

A+
Super! Je continue à étudier votre code.
 

Discussions similaires

Statistiques des forums

Discussions
312 083
Messages
2 085 188
Membres
102 809
dernier inscrit
Sandrine83