Macro excel

Résolu
seb76 -  
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous, je voudrai réaliser un outil de gestion via excel, jusque la pour le tableau pas de problème mais pour la macro aïe....

Je vous le donne en français si quelqu'un pouvais me le traduire en VBA parceque la je rame et c'est assez urgent.

j'ai deux feuilles l'une qui sera rempli par les personnes concernées et l'autre pour archiver qui sera en lecture seule sauf pour la macro bien sur.

Ce que je souhaiterai c'est une macro qui quand elle apercois dans la feuille 1 le mot "achevée" dans la colonne M mais sur n'importe quelle ligne
copie la ligne dans l'autre feuille sur la première ligne vide disponible, supprime la ligne dans la feuille numéro 1, puis inscrit la date de modification dans la colonne N de la 2ème feuille

il y'a une autre condition aussi les colonnes de la feuille 2 ne coresponde pas exactement à la feuille 1 c'est a dire il faut qu'elle copie: colonne I vers G; J vers H; K vers I; L vers J; N vers K; O vers L; P vers M puis ajoute la date de modification dans la colonne N. De A à F les deux feuilles ont les même colonnes.

Voilà j'espère que ce sera assez compréhensible pour vous je débute dans excel et j'ai beau regarder sur les forum je n'arrive pas à trouver la solution peux être aussi ce n'est pas possible mais je ne suis pas convaincu. Si c'est le cas merci de m'avertir.

Merci d'avance pour votre aide elle m'a souvent été précieuse.
A voir également:

23 réponses

gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 724
 
bonjour

Tu as demandé une macro, alors la voici, il faut la placer dans ta feuille 1.
Si tu as changé le nom de ta "feuil2" il faut la changer dans la macro aussi
Option Explicit
Private Sub Worksheet_Change(ByVal sel As Range)
If Cells(sel.Row, 13).Value = "achevée" Then
Dim lig As Long
With Sheets("feuil2")  ' nom à changer éventuellement
    lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
    .Cells(lig, 1).Resize(1, 6).Value = Cells(sel.Row, 1).Resize(1, 6).Value
    .Cells(lig, 7).Resize(1, 4).Value = Cells(sel.Row, 9).Resize(1, 4).Value
    .Cells(lig, 11).Resize(1, 3).Value = Cells(sel.Row, 14).Resize(1, 3).Value
    .Cells(lig, 14).Resize(1, 3).Value = Date
    Cells(sel.Row, 1).EntireRow.Delete
End With
End If
End Sub

Il y a copie des valeurs, sans les formules, sur les bonnes colonnes de la feuille 2, comme indiqué sur la demande,en rassemblant par "resize" les blocs de colonnes contiguës.

Cette macro se déclenche chaque fois qu'il y a une saisie clavier et effectue l'archivage dès que la colonne M de la ligne mise à jour est correctement valorisée même si c'est le résultat d'une formule.

Si tu as des lignes déjà valorisées il suffit de faire semblant d'une modification (F2 puis entrée) sur n'importe qu'elle colonne de la ligne à archiver.

Si tu veux interdire les modifications sur la feuille 2, il faut mettre un mot de passe et dans ce cas il sera nécessaire de rajouter sa gestion dans la macro et comme n'importe qui de compétent pourra le trouver et l'utiliser la protection est assez illusoire. Une gestion des suivis de modifications par chaque intervenant me paraît plus judicieux mais c'est toi qui décide.
1
spidag
 
Bonjour,
ton truc n'est pas compliqué.
Reflechis juste aux conditions d'arret ...
Si tu ne trouves pas sur les forum, c'est peu etre par ce que ton problème est simple.
Puis si tu débutes, alors faut prendre le temps de s'y mettre sur ta macro ...
Le but du forum est d'aider en cas de problème, pas de developper une application à ta place.
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
je sais que ce ne doit pas etre compliqué mais pour les personnes qui connaissent les bases du vb pas pour un mec qui part de 0 et tout ces forums ou on te pond la soluce sans rien expliquer et pour des problèmes qui n'ont rien a voir avec le mien ca c enervant enfin ca fait pas loin d'une semaine que je suis sur cette outil et du temps j'en ai déjà trop pris c'est pour ca que j'ai demandé le script direct si j'avais demander comment ca fonctionne et tout on m'aurai donné un lien sur l'un des nombreux sites de lecon d'excel ceux qui te mette une tête grosse comme une citrouille (si je dis ca c'est que j'en ai lu beaucoup avant de poster cette discussion
mais merci quand même de ta suggestion et désolé pour les fautes d'orthographe mais comme je t'ai dis je n'ai vraiment pas le temps
à tchuss
0
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Bonjour,

Tu as besoin de ça dans quel cadre ?
0
seb76250
 
Sub Worksheet_Change()
If Cells(sel.Row, 13).Value = "achevée" Then
Dim lig As Long
With Sheets("archive des commandes cloturées")
lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
.Cells(lig, 1).Resize(1, 6).Value = Cells(sel.Row, 1).Resize(1, 6).Value
.Cells(lig, 7).Resize(1, 4).Value = Cells(sel.Row, 9).Resize(1, 4).Value
.Cells(lig, 11).Resize(1, 3).Value = Cells(sel.Row, 14).Resize(1, 3).Value
.Cells(lig, 14).Resize(1, 3).Value = Date
Cells(sel.Row, 1).EntireRow.Delete
End With
End If
End Sub


j'ai copié ca et l'execution s'arrete sur la 2ème ligne "erreur d'execution 424":objet requis

ca fait deux heure que je cherche l'erreur pas trouvé si tu pouvais me mettre sur la voie ce serait sympas merci beaucoup
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Bonjour,

le début doit plutôt ressembler à ça:
Private Sub Worksheet_Change(ByVal Target As Range)
If Cells(Target.Row, 13).Value = "achevée" Then

eric
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
très bien alors je ne demande qu'à comprendre ça me fait pareil:
alors d'abord quand je crée une macro via VBA il lui faut un nom je dois mettre ce que je veux ou "Worksheet_Change"?
en gros à quoi corespond la première ligne que tu me donnes? c'est quoi private?
quand je rentre un nom VBA me met automatiquement la première ligne "Sub nom de la macro ()" est ce que je dois la remplacer par la tienne?
Trop de question et malheuresement pas de réponse sur les forums je sais que ca doit etre simple mais cette macro je ne l'ai trouvé exposer dans aucun forum et pourtant j'ai cherché.
Merci encore pour votre aide
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
c'est bon j'ai compris déjà pourquoi je galéré je ne rentré pas le code au bon endroit maintenant j'ai fait ca:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Cells(Target.Row, 17).Value = "ok" Then
Dim lig As Long
With Sheets("archive")
lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
.Cells(lig, 1).Resize(1, 6).Value = Cells(sel.Row, 1).Resize(1, 6).Value
.Cells(lig, 7).Resize(1, 4).Value = Cells(sel.Row, 9).Resize(1, 4).Value
.Cells(lig, 11).Resize(1, 3).Value = Cells(sel.Row, 14).Resize(1, 3).Value
.Cells(lig, 14).Resize(1, 3).Value = Date
Cells(sel.Row, 1).EntireRow.Delete
End With
End If
End Sub

Donc quand je l'essai j'ai un message d'erreur "erreur de compilation: variable non définie"
je fais ok la ligne private...... se met en jaune et sur la ligne .Cell(lig,1)....... sel est sélectionné
j'espère que j'ai été clair et que quelqu'un pourra m'aidé aussi
merci
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Tu as remplacé sel par target, il faut le remplacer partout
eric
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
y'à du nouveau c'est ok pour pratiquement toute la commande seulement il me copie bien la date dans la colonne N mais il me la mais aussi sur la O et la P ca ne me serre pas a grand chose d'avoir trois fois la date lol
ensuite j'aurai voulu que la feuille sois protéger en écriture mais pas pour la macro c'est possible?
Merci Eric et gbinforme pour votre aide, vous assurez!!!
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
ah oui j'ai oublié la commande me copie bien la ligne sur une ligne vierge mais a chaque fois il y'a un saut d'une ligne
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
rectification il ne saute pas une ligne à chaque fois mais il le fais pour la première ligne que j'archive?
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
je vous redonne le code actuel:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Cells(Target.Row, 17).Value = "ok" Then
Dim lig As Long
With Sheets("archive")
lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
.Cells(lig, 1).Resize(1, 6).Value = Cells(Target.Row, 1).Resize(1, 6).Value
.Cells(lig, 7).Resize(1, 4).Value = Cells(Target.Row, 9).Resize(1, 4).Value
.Cells(lig, 11).Resize(1, 3).Value = Cells(Target.Row, 14).Resize(1, 3).Value
.Cells(lig, 14).Resize(1, 3).Value = Date
Cells(Target.Row, 1).EntireRow.Delete
End With
End If
End Sub
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Bonjour,

.cells(ligne,colonne) te défini la position de la 1ere cellule concernée
.resize(ligne, colonne) te défini la taille de la zone. Par exemple .Resize(1, 4) te sélectionne 1 ligne sur 4 colonnes.
Adapte en fonction de tes besoin.

Pour la 1ère ligne sautée soit tu t'embetes à tester si c'est la 1ere sauvegarde et tu ne fais pas le +1 dans lig = ...., soit tu en profites pour mettre un nom en tete de colonne à chaque champ

eric
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
tu sais quoi tu m'a éclairer sur un bon point et dis comme ca ca vaut bien mieux que les cours qui nous embrouille sur le net
je suis parvenu a mes fin grace a vous les gars merci beaucoup et en plus grace a vos conseil je comprend un peu mieux le VB
il ne me manque plus que la dernière chose protéger en écriture la feuille2 sauf pour la macro est ce que c'est faisable?
je vais quand même me renseigner sur le net bien sur mais si vous avez la réponse n'hésiter pas
(désolé pour les fautes d'orthographe)
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Pour la protection:

en début de macro déprotèger la feuille :
ActiveSheet.Unprotect

en fin de macro re-protéger
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

Ces actions sont facile a retrouver en enregistrant une macro par 'outils / macro / nouvelle macro' sans oublier d'arreter l'enregistrement une fois les actions faites. Il suffit ensuite d'aller dans le module et recuperer les lignes interessantes

Comme ça tu peux retrouver comment rafraichir le TCD. Chez moi c'est : ActiveSheet.PivotTables("Tableau croisé dynamique4").PivotCache.Refresh (si tu reprends sur un classeur neuf le tien devrait s'appeler Tableau croisé dynamique1").
A mettre, après reflexion, dans l'evenement activate de ta feuille du TCD.
Clic-droit sur 'longlet de cette feuille, 'visualiser le code. En haut 2 listes déroulantes, celle de gauche choisir 'worksheet', celle de droite choisir 'activate' et coller la ligne ...refresh pour obtenir :
Private Sub Worksheet_Activate()
ActiveSheet.PivotTables("Tableau croisé dynamique4").PivotCache.Refresh
End Sub
en remplaçant 4 par le bon n°


eric
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
je vais essayé ca demain la j'ai pas d'excel sius la main, merci je vais essayé l'enregistrement parce que la dernière partie de ton message n'est pas très clair à mes yeux j'ai vraiment du mal avec le language informatique et l'anglais c'est pourquoi je me lance dans cet formation de technicien de maintenance informatique
je vais quand même essayé de comprendre ton message demain sur gogole mais comme j'ai déjà dit il y'à beaucoup trop de chose à lire pour rien alors qu'une simple explication de base corespondrai mieux aux attente de tous je sais pas si tu vois ce que je veux dire un site d'exemple le site du zero certe peu enrichie pour le moment mais c'est parceque la présentation est mal faite ce qu'il faut c'est un tuto pour les bases et des sous forum pour les à coté:"paramétrage, utilisation, problème fréquement rencontré, forum problème et forum discussion et ca classé par type comme dans "CCM" tu vois le genre
bon je te tiens au courant
A +
0
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Technicien de maintenance informatique n'est peut pas le bon choix pour faire du développement ... >>°^°<<
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
non mais je ne veux pas me spécialiser dans le développement mais dans la maintenance informatique pour aider les novices réparer les pc et tout
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
bonjour ericcc comment voit-on le numéro du tableau dynamique
0
seb76250 Messages postés 42 Date d'inscription   Statut Membre Dernière intervention  
 
j'ai réussi à l'intégrer dans le code ca donne:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Cells(Target.Row, 17).Value = "ok" Then
Dim lig As Long
Sheets("archive").Select
ActiveSheet.Unprotect
With Sheets("archive")
lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
.Cells(lig, 1).Resize(1, 6).Value = Cells(Target.Row, 1).Resize(1, 6).Value
.Cells(lig, 7).Resize(1, 4).Value = Cells(Target.Row, 9).Resize(1, 4).Value
.Cells(lig, 11).Resize(1, 3).Value = Cells(Target.Row, 14).Resize(1, 3).Value
.Cells(lig, 14).Resize(1, 1).Value = Date
Cells(Target.Row, 1).EntireRow.Delete
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowSorting:=True
End With
End If
End Sub

mais il demande le code pour dévérouiller mais pas pour vérouiller comment je peux faire pour qu'il rentre le code automatiquement?
0