Mise a jour d'un tabeau

Salut,

Ce que tu me racontes là me semble impossible.

Si à un certain moment donné i vaut 5 et DerLig vaut 20, l’instruction

.Range("B" & i & ":I" & i).Copy Range("B" & DerLig)

réalise ceci : elle copie la plage B5:I5 (y compris la cellule D5) de la feuille X et la colle sur la feuille Y, dans une plage de même dimension dont la première cellule est la B20.

Le problème doit dont venir d’ailleurs. Peux-tu me fournir un fichier présentant le problème avant le lancement de la macro en me précisant quelle ligne fait problème ?

A te relire.

cos81 a écrit :

Re,

Désolé de t’embêter encore et encore sur le même projet!!

Encore merci pour tous.

Mais pas tu tout, tu me m’embête pas.

J’avais compris que si une ligne existait déjà, seul le prix devait être actualisé. Dans la partie de code ci-dessous :

    k = Application.WorksheetFunction.Match(.Range("B" & i), Range("B:B"), 0)
    If k > 0 Then
        Range("I" & k) = .Range("I" & i)
    Else
        DerLig = Range("B" & Rows.Count).End(xlUp).Row + 1 
        .Range("B" & i & ":I" & i).Copy Range("B" & DerLig) 
    End If

la ligne k = Application…….

recherche si un symbole existe. Si oui, k est plus grand que 0 et on passe donc par la ligne

Range("I" & k) = .Range("I" & i) ( Alors seule la colonne I est modifiée)

Autrement les cellules de la plage Bi:Ii sont copiées et collées.

Donc si tu veux actualiser à chaque fois toutes les cellules de chaque ligne, il faut modifier le code en conséquence.

Mais si pour chaque ligne, tu veux modifier non seulement le prix, mais toutes les autres données, alors autant faire un copier-coller de l’entièreté de ton tableau ‘Données à jour’ et de le coller en une seule fois sur la feuille ‘Base de données’, non ?

A te relire.

Merci,

En faite ce que je voudrais, c'est que le prix et le conditionnement se mettent à jour!!

Donc, sur le fichier actuel, tout est bon sauf le conditionnement, qui devrait avoir les même condition que le prix.

Les autres données ne doivent surtout pas être modifié.

Et merci beaucoup pour tes explications, ça devient de plus en plus clair!! J'avoue que ça l'est pas encore à 100%, mais ça vient!

Est ce qu'il faudrait mettre

Range("I" & "D" & k) = .Range("I" & "D" & i)

A bientôt.

Non, pas tout à fait

Après l’instruction (ou avant, on s'en fout )

Range("I" & k) = .Range("I" & i)

Place une ligne supplémentaire

Range("D" & k) = .Range("D" & i)

Le même passage que dans mon dernier message ainsi modifié doit donc être

    k = Application.WorksheetFunction.Match(.Range("B" & i), Range("B:B"), 0)
    If k > 0 Then
        Range("I" & k) = .Range("I" & i)
        Range("D" & k) = .Range("D" & i)
    Else
        DerLig = Range("B" & Rows.Count).End(xlUp).Row + 1 
        .Range("B" & i & ":I" & i).Copy Range("B" & DerLig) 
    End If

VARIANTE

    k = Application.WorksheetFunction.Match(.Range("B" & i), Range("B:B"), 0)
    If k > 0 Then
        Range("D" & k) = .Range("D" & i)
        Range("I" & k) = .Range("I" & i)
    Else
        DerLig = Range("B" & Rows.Count).End(xlUp).Row + 1 
        .Range("B" & i & ":I" & i).Copy Range("B" & DerLig) 
    End If

Amicalement.

Salut Yvouille,

Merci encore, j'y étais presque....

Maintenant j'ai modifié le code, mais ça tourne en boucle, j'ai attendu 10 minutes.

Ai je fais une erreur? Voila ce que j'ai mis:

Option Explicit

Sub Maj()
Dim i As Long, j As Long, k As Long, DerLig As Long

Application.ScreenUpdating = False
Application.EnableEvents = False

With Sheets("Données à jour")
j = .Range("B" & Rows.Count).End(xlUp).Row

If j = 7 Then 'Si la premiere ligne vide en partant du bas est la 7, alors msgbox
    MsgBox "Il n'y a aucune données à traiter sur la feuille 'Données à jour'"
    Exit Sub
End If
Range("D2").Formula = Now
Range("D2").NumberFormat = "dd/mm/yyyy" & " " & "à" & " " & "hh:mm"

For i = 8 To j
    On Error Resume Next
    k = Application.WorksheetFunction.Match(.Range("B" & i), Range("B:B"), 0)
    If k > 0 Then
        Range("D" & k) = .Range("D" & i)
        Range("I" & k) = .Range("I" & i)
    Else
        DerLig = Range("B" & Rows.Count).End(xlUp).Row + 1
        .Range("B" & i & ":I" & i).Copy Range("B" & DerLig)
    End If
    k = 0
Next i

    .Range("B8:I" & Rows.Count).ClearContents 'effacer toutes les données de B8 a i jusqu'a la ligne vide
End With

DerLig = Range("B" & Rows.Count).End(xlUp).Row 'Permet de rechercher de la dernière ligne du fichier en remontant jusqu'a trouver la premiere cellule non vide. xlup = recherche de bas en haut
Range("B8:I" & DerLig).Sort Key1:=Range("B7"), Order1:=xlAscending, Header:=xlYes 'Ceci est une version simplifiée d’un tri. Jusqu’à .Sort, la partie à trier. Key1 indique la cellule (la colonne) sur laquelle se fait le tri. Header indique s’il y a des titres ou non.
Application.EnableEvents = True
MsgBox "Les Données ont bien été mise à jour"

End Sub

@ +

Salut,

Là je suis au chalet et je n’ai pas le programme .rar à disposition ; je ne peux donc pas ouvrir aujourd’hui ton fichier reçu en privé pour essayer ton dernier code. D’ailleurs, afin de placer un fichier trop gros pour le site Excel-Pratique, tu devrais plutôt passer par le site C-Joint, éventuellement après avoir compressé ton fichier. C’est ainsi plus facile à les ouvrir-

c joint 2013

Mais pour répondre à ta question : si la seule instruction que tu as ajoutée est celle que je t’ai indiquée, c’est impossible que ça bloque soudainement le code. Cette instruction ne fait strictement rien d’autre – mais en parallèle – à son instruction jumelle.

N'as-tu vraiment strictement rien changé d’autre dans le code ? Dans le fichier ?

Pour t’en convaincre tu peux lancer ton code en ne supprimant que cette ligne.

Si ça ne va vraiment toujours pas, renvoie-moi ton nouveau fichier avec ta nouvelle macro en privé.

A te relire.

Salut Yvouille,

Je connais bien le site C-Joint, mais mon entreprise le bloque!! C'est pour ça que je ne l'utilise pas.

J'ai fait comme tu m'as dit, j'ai supprimé la ligne puis j'ai essayé la mise à jour, et la surprise, ça ne fonctionnait plus!

Donc j'ai repris une version plus ancienne de mon fichier qui fonctionnait, et j'ai rajouté la ligne qui sert à la copie de la colonne D.

Maintenant ça fonctionne à merveille!! OUFFF!! Je sais pas ce que j'ai fait au code!! mais bon, c'est pas grave, tout est fonctionnel maintenant!!

Je suis déjà sur un autre problème depuis quelques jours, j'essaye de me débrouiller, et si je n'arrive pas, je serais de retour sur le forum avec sujet comme celui-ci!!

Tout est comme je le souhaitais, je vais donc classer en résolue.

En tout cas, je te remercie infiniment pour ton implication. Heureusement qu'il y a des gens comme toi sur les forums!!

Bonne continuation à toi et au Forum.

Bonjour tout le monde et notement Yvouille,

J'ai quand meme encore un souci avec mon fichier!!!

J'ai ce code (code 1)en feuille 3:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 9 And Target.Count = 1 Then 'If = SI' 'Target.column=9 veut dire que le tri se fait une fois la conne 7 rempli + appuie sur entree.
   Nom = Target
   [B8:DT50000].Sort Key1:=[B8] ' =[_] correspond a la colonne a trier + le numero de ligne de départ'
  End If
End Sub

Puis, j'ai ce code en module 3 (code 2) activé par un bouton mise à jour:

Option Explicit

Sub Maj()
Dim i As Long, j As Long, k As Long, DerLig As Long

Application.ScreenUpdating = False
Application.EnableEvents = False

With Sheets("Données à jour")
j = .Range("B" & Rows.Count).End(xlUp).Row

If j = 7 Then
    MsgBox "Il n'y a aucune données à traiter sur la feuille 'Données à jour'"
    Exit Sub
End If
Range("D2").Formula = Now
Range("D2").NumberFormat = "dd/mm/yyyy" & " " & "à" & " " & "hh:mm"

For i = 8 To j
    On Error Resume Next
    k = Application.WorksheetFunction.Match(.Range("B" & i), Range("B:B"), 0)
    If k > 0 Then
        Range("D" & k) = .Range("D" & i)
        Range("I" & k) = .Range("I" & i)
    Else
        DerLig = Range("B" & Rows.Count).End(xlUp).Row + 1
        .Range("B" & i & ":I" & i).Copy Range("B" & DerLig)
    End If
    k = 0
Next i

    .Range("B8:I" & Rows.Count).ClearContents
End With

DerLig = Range("B" & Rows.Count).End(xlUp).Row
Range("B8:I" & DerLig).Sort Key1:=Range("B7"), Order1:=xlAscending, Header:=xlYes
Application.EnableEvents = True
MsgBox "Les Données ont bien été mise à jour"

End Sub

Le code (2) de mise a jour fonctionne uniquement lorsque le code (1) est annulé a l'aide de ' devant chaque ligne.

Si je ne desactive pas le code 1, le code 2 tourne infiniment!!

Je cherche donc une ligne à ajouter au debut du code 2 qui permet d'annuler le code 1 juste le temps de la macro (code 2) puis de rendre à nouveau le code 1 actif en fin de macro.

J'espere avoir été clair! Est ce possible SVP?

Je vous remercie d'avance.

Salut,

J’ai repris le fichier que tu m’as fourni le 5 mars à 9:41 AM en privé. Si j'y colle le dernier code que tu fournis ci-dessus avec ton dernier message (avec le passage Range("D" & k) = .Range("D" & i) en plus) et que je laisse le code Private Sub Worksheet_Change de la feuille ‘Base de données’ actif, la macro s’exécute en 95 secondes environ sur un PC assez lent.

Contrairement à ce que tu penses, la ligne Application.EnableEvents = False dans le code ‘Maj’ remplis donc complètement sa tâche et le code Private Sub Worksheet_Change n’est jamais déclenché durant le déroulement de Maj.

Si tu ne me crois pas, tu peux placer un point d’arrêt au tout début du code Private Sub Worksheet_Change – comme sur l’image ci-dessous - et lancer l’autre code par l’intermédiaire du bouton ; tu constateras alors que le code ne s’arrête jamais sur ton point d’arrêt. Si tu neutralises maintenant la ligne Application.EnableEvents = False dans le code Maj, le code va bloquer sur ton point d’arrêt (il y aura du jaune à la place du bordeaux sur la ligne, comme sur la deuxième image ci-dessous), ce qui voudra dire que cette fois il a été déclenché lors de l’évènement Worksheet_Change.

Je pense que ton problème vient donc d’ailleurs. As-tu modifié tes feuilles (modifications/ajout/suppression) ? Si nécessaire, renvoie-moi ton fichier actuel en privé (dans ce cas-là, évite de me fournir ton fichier en .rar, mais utilises la possibilité de m'envoyer un courriel en cliquant sur l'enveloppe sous mon avatar et envoi-moi un fichier Excel, s'il-te-plait).

A te relire.

point d arret blocage

Salut Yvouille,

Tu va trouver ça bizarre, mais essaye de modifier le code comme tu l'as fait ( range "D" & k...), effectivement, tu lances la mise à jour, ça fonctionne! Maintenant, tu enregistres le fichier puis tu le ferme, ensuite tu l'ouvres à nouveau et lances la mise à jour après avoir collé les données dans la feuille " données à jour". Surprise, ça ne fonctionne plus! Pourtant il n'y a eu aucun changement!

Ensuite, pour trouver d'où ça vient, j'ai annuler le code de tri sur la feuille "base de données" et la ça fonctionne.

C'est le constat que j'ai fait.

Je t'envoies le fichier actuel en privée dans la matinée.

Merci.

@ +

Re-bonjour,

J’ai pris le dernier fichier que tu m’as envoyé en privé ce matin et j’ai lancé le code. Après 20 secondes environ, j’ai interrompu le code par la touche ‘Esc’ et j’ai été voir par le débuggeur combien de boucles avaient déjà été effectuées : environ 100 à 200. On peut donc dire que ça rame terriblement. Par un point d’arrêt placé dans le code Private Sub Worksheet_Change de la feuille ‘Base de données’, je sais que ce code n’est pas lancé d’une manière non désirée.

J’ai ensuite essayé de neutraliser quand même le code Private Sub Worksheet_Change de la feuille ‘Base de données’ : ça ne change alors absolument rien, ça rame tout autant.

Puis j’ai réactivé le code Private Sub Worksheet_Change de la feuille ‘Base de données’ et j’ai neutralisé tous les codes de la feuille ‘Recherche’, ce qui change encore rien.

Puis j’ai carrément effacé la feuille ‘Recherche’ et mon code fonctionne parfaitement en 20 à 25 secondes environ (je suis maintenant sur un PC assez rapide au travail, hier à la maison ça durait environ 90 à 100 secondes).

Une fois le transfert effectué (la feuille ‘Données à jour’ est donc vidée), j’enregistre et je referme ce fichier. Je le rouvre, j’y colle de nouvelles données sur la feuille ‘Données à jour’ et je relance le code qui fonctionne à nouveau parfaitement.

Selon moi le problème vient clairement – comme je te l’avais déjà dit – des autres feuilles de ton fichier.

N’ayant pas l’envie de chercher plus loin pourquoi ce code ne fonctionne pas lorsque certaines feuilles sont en place, j’en reviens à une proposition que je t’ai déjà faite : Séparons la mise à jour des données de ton fichier de base !!!!!! Concrètement j’imagine un fichier ‘Mise à jour’ contenant cette macro mais qui effectuerait ceci en plus : elle ouvrirait d’une manière invisible ton fichier de base (sauf si c’est logique qu’il soit déjà ouvert à ce moment-là), elle déplacerait la feuille ‘Base de données’ dans le nouveau fichier ‘Mise à jour’, elle effectuerait la mise à jour actuelle – sur la base des données que tu aurais collées à cet endroit - et elle replacerait la feuille actualisée dans son fichier d’origine (fichier qui serait refermé automatiquement ou qui resterait ouvert).

Si cette proposition ne te convient pas, merci d’indiquer ce fil comme résolu et d’en recommencer un autre.

Bonnes salutations.

Re,

Oula, c'est tres compliqué tout ça! La solution que tu me proposes, m'irait tres bien!! Pour moi peut importe la facon de faire, l'important c'est le résultat.

Par contre, je ne saurais vraiment pas comment le faire!!

Merci encore à toi.

A bientôt

Salut,

Dans le fichier ci-joint, tu as un code qui comporte cette ligne :

Set Fichier_Cible = Workbooks("Xxx.xls")

Tu dois y remplacer le nom du fichier que j’ai utilisé pour mes essais "Xxx.xls" par le nom et l’extension de ton fichier à mettre à jour. Si tu préfères inscrire le nom de ce fichier sur la feuille Excel et que la macro aille le lire là, dis-le-moi et je modifie le code en conséquence.

Dans ton fichier à mettre à jour – qui doit être ouvert lors du lancement du code * - la feuille à actualiser doit s’appeler "Base de données" et elle doit avoir exactement la même structure que celles que nous avons utilisées jusqu’à maintenant. Ensuite tu colles tes données actualisées sur la feuille ‘Données à jour’ de mon nouveau fichier et tu lances la macro par le bouton en place sur cette feuille.

A la fin de la macro – qui dure environ 40 secondes sur mon PC au travail – le fichier à mettre à jour (et mis à jour) est affiché à l’écran et enregistré. Le fichier ‘Mise à jour’ quant à lui a sa feuille à nouveau vidée des données que tu y avais collé et enregistré, prêt à un nouvel emploi. Si tu préfères qu’il soit alors déjà refermé, merci de le faire savoir.

* Si tu ne désires pas devoir ouvrir ton fichier à mettre à jour au préalable, je dois modifier mon code.

A te relire.

5mise-a-jour-v1.zip (22.62 Ko)

Re,

Tu m'écris en privé :

DerLig = Range("B" & Rows.Count).End(xlUp).Row + 1

.Range("B" & i & ":I" & i).Copy Range("B" & DerLig)

End If

- Dans le code ci-dessus, la ligne "End if" était en jaune.

En fait, lorsqu'il y a ce problème, ton code tourne en boucle mais très lentement. Donc lorsque tu l’arrêtes, il peut être sur n’importe quelle instruction de la boucle, donc sur n’importe quelle ligne du passage ci-dessus. Ce qui serait donc plus intéressant à savoir, ce serait la valeur de i au moment où tu stoppes le code afin de voir s’il est très avancé dans les 20'000 boucles environ qu’il soit faire.

Mais bon, un code ou autre chose (on n’est toujours pas d’accord sur quoi) ralenti le tout et il faudrait y remédier.

Je te propose alors le nouveau fichier joint avec lequel le fichier "Test" est ouvert par le code (il faudrait donc maintenant que ce fichier soit fermé au début de la macro), la feuille "Base de données" est déplacée dans le fichier "Mise à jour", le fichier "Test" est refermé le temps des transferts afin de ne pas faire interférence (mais ta macro de tri est donc dans le fichier "Mise à jour", avec la feuille "Base de données"), à la fin des transferts, le fichier "Test" est à nouveau rouvert afin d’y transférer à nouveau la feuille "Base de données" actualisée, le fichier "Mise à jour" est enregistré et refermé et le fichier "Test" reste ouvert à l’écran, enregistré.

Telle que la macro est prévue, la seule contrainte complémentaire est que ces deux fichiers doivent se trouver maintenant dans le même dossier de ton arborescence.

Sur mon PC à la maison, ça dure 3 à 4 minutes, sur un PC un peu plus rapide, ça devrait durer la moitié de ce temps.

A toi de tester.

15mise-a-jour-v2.zip (22.85 Ko)

Salut Yvouille,

Merci pour tout le temps que tu as passé la dessus, mais ça ne fonctionne toujours pas!! la mise à jour s'arrete, et la feuille base de données a disparu de mon fichier d'origine. Elle est resté dans le fichier de mise à jour!!

Mais bon c'est pas grave, arrete de te casser la tête, je vais te laisser tranquille!! En plus ca devient trop complexe!!

Le premier fichier que j'ai, que tu avais fait, fonctionne tres bien quand j'annule le tri de la feuille "Base de données"!! Oui je sais que c'est bizarre, mais c'est le cas!!

J'ai une dernière question et je classe le sujet comme résolu une fois pour toute!!

Est ce qu'il y a un moyen d'annuler le "module 3" en début de mon code?? En fait, un code qui permet de désactiver la macro qui se trouve dans le "module 3". puis un autre code qui permet de la réactiver!

Merci encore pour tous!!

@ +

Salut,

Je remarque à l’instant que tu es sur Excel 2003 et j’espère que les problèmes ne viennent pas de là. Mais ça m’étonnerait un peu, car les codes qui créent problèmes d’une version à l’autre sont quand même connus.

A part ça, je ne sais plus que te conseiller ; les codes que je prétends qui fonctionnent chez moi fonctionnent vraiment chez moi !!!

Tu me demandes maintenant si tu peux annuler le module 3, mais tout d’abord on a tout plein de versions différentes et je ne sais pas de laquelle tu parles (tu vois donc l'avantage de numéroter correctement les versions). Par exemple dans les derniers fichiers que je t’ai fournis il n’y a pas de module 3, alors ….. (par contre les macros portent un nom et ce serait mieux d’y faire référence). Mais dans tous les cas je ne comprends pas ta question puisque je n’en vois absolument pas le but !

Si jamais tu arrives à être plus précis, je veux bien encore essayer de t’aider.

Amicalement.

Hello,

Oui effectivement, j'ai excel 2003 au boulot, mais c'est pire que ça, j'ai excel 2007 sur mon portable et 2010 sur mon fixe!!

Ne crois pas que je doute sur tes fichiers!! Ce n'est absolument pas le cas!! Et je me permettrais pas de te reprocher quoi que ce soit! Bien au contraire!!

Pour les versions, je suis entièrement d'accord avec toi, d'ailleurs, toutes mes "vrai" version de fichier son numéroté en version ainsi que la date du jour de chaque nouvel enregistrement.

Ce que je te demandais en fait, c'est juste une annulation du code qui se trouve sur la feuille "base de données" dans les fichier que je t'envois en privé! Par exemple, le dernier fichier test.

Comme je te l'ai expliqué, le code "maj" que tu m'avais fait marche super bien mais a la seule condition d'annuler le tri automatique sur la feuille "base de données" . Je ne sais pas pourquoi, mais quand je fais cela, ça fonctionne!

Donc je te demandais juste une ligne que je peux rajouter en début et fin du code "maj " qui annule au début et remet a la fin le code qui permet le tri automatique qui se trouve donc sur la feuille "base de données" .

Je te réponds avec mon téléphone, donc je n'ai pas le fichier a porté de main et donc pas le nom du code.

Si tu n'as pas compris , je pourrais de donner le nom exacte de la macro demain matin.

Bonne soirée.

@ +

Ah, d’accord,

Si tu en reviens à ta demande du 10 mars [ Tu as écrit : "Je cherche donc une ligne à ajouter au debut du code 2 qui permet d'annuler le code 1 juste le temps de la macro (code 2) puis de rendre à nouveau le code 1 actif en fin de macro" ] je ne peux que te répéter ma réponse du même jour : « Contrairement à ce que tu penses, la ligne Application.EnableEvents = False dans le code ‘Maj’ remplis donc complètement sa tâche et le code Private Sub Worksheet_Change n’est jamais déclenché durant le déroulement de Maj ».

Merci d’indiquer ce fil comme "Résolu" - en cliquant sur le petit V vert dans l'un de tes messages - et d’en recommencer un autre pour tes futures questions.

Bonnes salutations.

Salut,

OK, merci pour tout!!

Bonne journée et bonne continuation.

@ +

Rechercher des sujets similaires à "mise jour tabeau"