Mise a jour d'un tableau par macro

DRILL

XLDnaute Occasionnel
Bonjour a tous,

Dans le fichier test ci-joint; J'ai un tableau dans la feuille "Report" ou l'on entre manuellement les valeurs des deux dernieres colonnes AT et AU.
Dans la feuille "IMP" se trouve une mise a jour du tableau importee (sauf colonnes AT et AU)

Le bute est de metre a jour le tableau de la feuille "Report" tout en laissant les colonnes AT et AU intactes.

Info: Les seules valeurs qui ne changent pas d'un tableau a l'autre sont celles des colonnes A, B et C, toutes les autres valeurs sont succeptibles de changer.

J'ai bien fait un essaie avec une macro de remplissage du style LookIn:=xlValues, Lookat:=xlWhole, mais ne ciblant que la colonne B... c'est la cata.

Merci pour votre aide.
Salutations
DRILL
 

Pièces jointes

  • Test.xls
    47 KB · Affichages: 44
  • Test.xls
    47 KB · Affichages: 49
  • Test.xls
    47 KB · Affichages: 47

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

J'ai nome les feuilles dans votre code comme ci-dessous
comme vous voulez, mais pourquoi ne pas renommer directement les CodeName des feuilles à ce compte là ?
Pour les textes trop long je ne sais pas trop quoi vous dire: j'ai mis en IMP!I21 ="ONE FITTER "&REPT("x";1600),
J'ai lancé la macro, et bien retrouvé dans la cellule un texte constant de 1611 caractères avec ma version d'Excel.
Mettez un point d'arrêt ou une instruction Stop et vérifiez si le texte n'est pas déjà perdu au Copy Destination:=
Si c'est le cas, voyez si ça passe mieux en l'écrivant comme ça:
VB:
With Feuil2.Range("A2:AS" & Feuil2.[A65536].End(xlUp).Row)
   Feuil1.[A65536].End(xlUp).Offset(1).Resize(.Rows.Count, .Columns.Count).Value = .Value
   End With
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

frangy,

je viens de me rendre compte que j'ai oublier un une action a rajouter a ton code.

Si l'on a des lignes supplementaires dans "IMP" (non existante dans "Report", raprochement colonnes B+C) il faudrait que cela les les copies dans "Report" (Cells A a AS)

Apres cela la mise a jour de la feuille "Report" est complete.

Slts
Drill
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Dranred,

La copie des lignes ce passe bien.

Ci-joint le fichier avec la macro et les lignes qui posent probleme.

Note: J'ai efface le contenu des cellules E a AS dans la feuille "Report" pour test.

Slts
DRILL
 

Pièces jointes

  • Test.xls
    140.5 KB · Affichages: 35
  • Test.xls
    140.5 KB · Affichages: 29
  • Test.xls
    140.5 KB · Affichages: 30
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

Je confirme que chez moi ça passe très bien, et je ne sais pas ce qui passerait mieux chez vous.
Peut être en mettant en commentaire le Copy, le remplaçant par une affectation de Value à Value:
VB:
'WsS.Range("A2:AS" & WsS.[A65536].End(xlUp).Row).Copy _
'   Destination:=WsC.[A65536].End(xlUp).Offset(1)
With WsS.Range("A2:AS" & WsS.[A65536].End(xlUp).Row)
   WsC.[A65536].End(xlUp).Offset(1).Resize(.Rows.Count, .Columns.Count).Value = .Value
   End With
Mais attention: ça pose un problème: Il faut d'abord harmoniser les types de données des deux cotés:
Mettez un format Texte sur les colonnes B et C, puis une formule tout à droite propagée sur deux colonnes et l'ensemble des lignes:
Code:
=B2&""
Copiez ces 2 colonnes, sélectionner B2, Collage spécial par valeur.

P.S. Pourquoi ne modifiez vous pas la propriété Name des modules de feuilles en des noms explicites pour éviter d'avoir besoin de déclarer des variables Worksheet dans le code ?
À +
 
Dernière édition:

frangy

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Ci-dessous le code après adaptation
Code:
Option Explicit
Sub Bulk()
Dim WsS As Worksheet, WsC As Worksheet
Dim C As Range, Cel As Range, PlageS As Range
Dim firstAddress As String
Dim LigneAjout As Long
Dim NouvLigne As Boolean
    Application.ScreenUpdating = False
    Set WsS = Sheets("IMP") 'Feuille source (IMP)
    Set WsC = Sheets("Report") 'Feuille cible (Report)
    Set PlageS = WsS.Range("B2:B" & WsS.Range("B2").End(xlDown).Row)
    For Each C In PlageS
        NouvLigne = True
        Set Cel = WsC.Columns("B:B").Find(C.Value, LookIn:=xlValues, Lookat:=xlWhole)
        If Not Cel Is Nothing Then
            firstAddress = Cel.Address
            Do
                'Si les valeurs dans les colonnes C sont identiques _
                on effectue la mise à jour
                If Cel.Offset(0, 1) = C.Offset(0, 1) Then
                    C.Offset(0, 2).Resize(1, 42).Copy Cel.Offset(0, 2)
                    NouvLigne = False
                    Exit Do
                End If
                Set Cel = WsC.Columns("B:B").FindNext(Cel)
            Loop While Not Cel Is Nothing And Cel.Address <> firstAddress
        End If
        If NouvLigne Then
            LigneAjout = WsC.Range("B2").End(xlDown).Row + 1
            C.Offset(0, -1).Resize(1, 45).Copy WsC.Range("A" & LigneAjout)
        End If
    Next C
    Set Cel = Nothing: Set PlageS = Nothing: Set WsC = Nothing: Set WsS = Nothing
    Application.ScreenUpdating = True
End Sub

A+
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Dranred,

Je cherche desesperement ce qui fait que cela marche chez vous et pas ici....
hormis le fait que je sois en version anglaise... je ne vois pas et ne comprend pas pourquoi cela poserai probleme.

J'ai prefere declarer les worksheet en variable dans le code car cela me permet de les renomer plus facilement... je ne pense pas que cela pose de probleme dans le code.

Comme je l'explique a frangy, je souhaite avoir un format permanent dans la feuille1 "Report" qui de plus est different de celui de l'importation en feuille "IMP"

Slts
Drill
 

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

Si ça peut aider, trouvé ça dans l'aide "Limites et spécifications Excel". Avez vous la même chose ?
Longueur du contenu des cellules (texte)32 767 caractères. Affichage de 1 024 uniquement dans une cellule et 32 767 dans la barre de formule.

J'ai prefere declarer les worksheet en variable dans le code … je ne pense pas que cela pose de probleme dans le code.
Non. En effet.
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Dranred,

Pas de doute quand je retire 2,99 dictionaires et l'annuaire pour etre au dessous de 1024 caracteres... la macro marche parfaitement.

Mais cela ne m'explique pas pourquoi cela fonctione de votre cote.... est ce que quand vous executez la macro l'integralite des cellules comprenant plus de 1024 caracteres sont copier dans les cellules cibles? Il y aurait peut etre un setting d'excel qui permet de passer par dessus cette erreur en squisant tout ce qui au dessus de 1024 caractere...

Slts
Drill
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

frangy,

je vais rajouter a la fin du code une mise en forme des colonnes ... comme l'on dit a bord.. not a big deal.

Comme cela les utilisateurs finaux pouront toujours trouver un numero de telephone en region parisienne...

Slts
Drill
 

Dranreb

XLDnaute Barbatruc
Re : Mise a jour d'un tableau par macro

À vrai dire j'ai fait un =NBCAR(La cellule) pour trouver qu'elle contenait les 1600 et quelque caractères, mais je n'ai peut être pas vérifié, ni dans vos autres données, s'ils étaient tous visibles dans la cellule. Je pense qu'il faut partir du principe qu'il n'est pas raisonnable d'y mettre des textes aussi grands et étudier comment vous pourriez, à la source, les séparer en plusieurs descriptions de catégories différentes. Vous y gagneriez aussi en rigueur dans l'organisation de la réalité représentée.
Cordialement.
 

DRILL

XLDnaute Occasionnel
Re : Mise a jour d'un tableau par macro

Dranred,

L'importation dans IMP est faite d'un systeme ERP, il s'agit des lignes d'item de commandes passees dans ce systeme et je n'ai aucun control sur ce qui est saisi dans cette colonne qui est la description de l'item et n'est pas limite en caractere.

Celle-ci peut etre reduite par la suite car l'information complete n'est pas necessaire au suivi du processus de la commande.
Si lors de la copie on peut dans le code specifier qu'il faut copier qu'uniquement les 100 premiers caracteres des cellules ... cela suffit amplement.

Mais ne vous cassez pas la tete la dessus. Je pense qu'avec le code de frangy je devrai m'en sortir.

En tout cas un grand merci pour votre aide et votre patience.

Slts
DRILL
 

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 337
Membres
102 865
dernier inscrit
FreyaSalander