Incrémentattion d'un tableau en fonction des données collées
Bonjour les rois d'Excel. Je suis nouveau sur ce forum et je viens de m'inscrire car en essayant d'apprendre les codes VBA par moi-même, je rame à certains moments. J'ai été impressionné par le niveau des réponses de ce forum, que j'ai trouvé par hasard via google; c'est pourquoi j'aimerai vous soumettre mon problème.
Pour le boulot, j'essaie de mettre au point un fichier Excel qui répertorie les productions que nous avons à faire pour nos clients, avec plusieurs feuilles par fichier, chacune représentant un jour de production dans le mois courant. Nous faisons des copier/coller de colonnes de données à partir d'autres applications dans ce fichier Excel. Sachant que les colonnes indissociables de référence sont les colonnes B et E, voici ce que je désire réaliser :
- Sachant que la ligne 4 doit toujours avoir des bordures (par case), je dois coller une liste de données "clients" dans la cellule B4, et, en rapport avec chacun d'entre eux, une liste de données de même taille en E4 .Les bordures des lignes remplies s'affichent automatiquement (cette partie fonctionne). Les autres colonnes sont remplies avec des données annexe d'import.
- Si l'utilisateur est amené à supprimer des entrées dans les colonnes de référence B et E, les bordures des lignes se suppriment également (ça marche). Le problème est que je voudrais que les autres cellules de ces lignes supprimées se vident de leur contenu. Hors la ligne que j'ai ajoutée "ActiveSheet.Rows(ActiveCell.Row).EntireRow.Delete" ne fonctionne pas correctement. Elle est lente et si on fait de la suppression en masse, il reste des formats de bordure.
- De plus, il faudrait que la ligne 4 garde ses bordures en permanence pour le collé initial des données. Hors avec une suppression en masse, elle disparait (j'ai pourtant défini un "Range("A5:I65536")" qui ne sert à rien). La cerise sur le gâteau serait d'avoir en plus une ligne avec bordure en dessous de la dernière ligne de données en cas d'ajout d'une nouvelle série de données.
Désolé si l'explication est longue, mais je n'étais pas sur de me faire comprendre. Je joins mon fichier, un peu épuré afin de garder sa confidentialité de données professionnelles.
Merci d'avance à ceux qui pourraient me suggérer quelque chose ...
Oups ... j'ai oublié de signaler que je fais mes tests de macro en copiant les données de la feuil3 de B2 à B9 et de E2 à E9
Bonjour
En bousculant un peu ce qui était prévu
Pour effacer (supprimer les lignes) il faut effacer la colonne B et la colonne E
Macro à tester
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Lig As Long
If Not Application.Intersect(Target, Range("A4:I65536")) Is Nothing Then
' Si la saisie est faite sur les cellules des colonnes 2 (B) ou 5 (E)
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
For Lig = Target.Row + Target.Rows.Count - 1 To Target.Row Step -1
If Range("B" & Lig) <> "" Or Range("E" & Lig) <> "" Then
Range("A" & Lig & ":I" & Lig).Borders.LineStyle = xlContinuous
ElseIf Range("B" & Lig) = "" And Range("E" & Lig) = "" Then
Rows(Lig).Delete
End If
Next Lig
Application.EnableEvents = True
End If
End SubA dire si cela convient
Pas testé à fond : En cas d'erreur(s) notes la démarche à suivre afin de la(es) reproduire
Bonjour Filomène,
Je peux te proposer une autre méthode -qui me paraît plus simple- fondée sur la propriété CurrentRegion, qui correspond à la sélection "CTRL *" (CTRL + étoile). Voir l'aide VisualBasic à ce sujet.
La CurrentRegion d'une cellule est la plage des cellules adjacentes, jusqu'à la première colonne vide et/ou la première ligne vide.
Il me semble que ta feuille de données est compacte (sans ligne vide ni colonne vide ni total ni formule) et que donc la CurrentRegion de A3 est la totalité de tes données.
Renseigne les cellules de titre vides de la ligne 3, colle une ou 2 fois des données en colonne B et E, puis sélectionne A3 et tape CTRL * . Cela devrait sélectionner les cellules de titre et celles de données.
Alors donc, je propose que l'évènement Worksheet_Change implique :
- la suppression de toutes les bordures de la feuille
- le formatage en bordure simple de Range("A3").CurrentRegion
- le formatage en bordure grasse de Range("A3:I3")
Je te laisse essayer. Je ne l'ai pas fait personnellement, mais j'y suis prêt si tu le souhaites.
A plusse,
Lazade
Merci Banzai64 et Lazade, je n'espérerais pas des réponses aussi vite, quelles réactivités !!!
J'ai eu le temps de tester la solution de Banzai64 et la partie suppression fonctionne à merveille par rapport à la mienne qui "ramait" et qui ne supprimer pas les bordures proprement en cas de suppression de données en masse.
J'ai toujours par contre le soucis pour garder les bordures sur la ligne 4 (en cas d'effacement des données sur cette ligne) afin que les utilisateurs partent de cette ligne pour démarrer leurs copier/coller.
Le plus dur également sera d'avoir toujours une ligne vierge de données mais avec des bordures, en dessous d'un 1er copier/coller en cas d'ajout ultérieur de données. Je vais y travailler.
Merci également pour ta proposition Lazade, je vais l'étudier demain et essayer donc de l'appliquer par moi-même. Si je n'y arrive pas, je te le ferais savoir ... mais je vais faire l'effort de trouver le moyen d'utiliser ta solution car c'est le meilleur moyen de m'améliorer. Car les programmes en VBA, c'est passionnant !
Bonsoir
Filomene a écrit :J'ai toujours par contre le soucis pour garder les bordures sur la ligne 4 (en cas d'effacement des données sur cette ligne) afin que les utilisateurs partent de cette ligne pour démarrer leurs copier/coller.
Pa important car la macro reconstruit les bordures à partir de la ligne 4
Effaces toutes tes données et écris en B4 ou E4
Je te laisse tester
Filomene a écrit :Le plus dur également sera d'avoir toujours une ligne vierge de données mais avec des bordures, en dessous d'un 1er copier/coller en cas d'ajout ultérieur de données.
Modifies la fin de la macro (lignes surlignées)
Next Lig
Lig = Columns("A:I").Find(what:="*", searchdirection:=xlPrevious, SearchOrder:=xlByRows).Row + 1
Range("A" & Lig & ":I" & Lig).Borders.LineStyle = xlContinuous
Application.EnableEvents = True
End If
End SubGénial Banzai54 !!! Ces deux dernières lignes ajoutées sont exactement ce que je cherchais à obtenir.
J'avais pourtant essayé plusieurs solutions sans succès.
Je ne clôture pas encore cette requête car je veux, par curiosité, par politesse et pour ma culture personnelle, tester la solution de Lazade; et j'aurais besoin de son aide si je n'y arrive point.
En tout cas, merci BEAUCOUP Banzai64. Tu me reverras certainement dans le forum demander de l'aide car cette macro n'est qu'une partie du fichier que je dois implémenter ...
Il me semble que ta feuille de données est compacte (sans ligne vide ni colonne vide ni total ni formule) et que donc la CurrentRegion de A3 est la totalité de tes données.
Renseigne les cellules de titre vides de la ligne 3, colle une ou 2 fois des données en colonne B et E, puis sélectionne A3 et tape CTRL * . Cela devrait sélectionner les cellules de titre et celles de données.
Bonjour Lazade,
Ce que tu avais noté ci-dessus, j'ai pu le faire sans problème, mais ensuite ? ... Comment l'inerpréter et l'intégrer dans mon Worksheet_Change ? ...
Bonjour,
Il suffit de formater la Current.Region à chaque événement Worksheet_Change
Voici ma solution.
Attention à ne pas avoir de ligne vide.
A+
Olivier
Bonjour Lazade,
J'ai consulté le code de ta macro et je comprends mieux maintenant comment on peut utiliser l'option CurrentRegion qui peut s'avérer fort utile. Je vais me le garder de côté car il pourra mettre précieux ultérieurement. Dans le cas présent, j'ai utilisé le code de Banzai64 que j'ai pu adapter à mes besoins.
Merci pour tes conseils et à très bientôt je l'espère sur le forum ...