Votre question

XL 2003 : VBA / comparer cellules + couper/coller lignes

Tags :
  • Mise à jour
  • Programmation
  • VB
Dernière réponse : dans Programmation
1 Août 2011 09:35:41

Bonjour,
J'espère que certains pourront venir à mon aide, je suis débutant en VBA (je pars de zéro mais avec des bases en C et fortran) et je dois absolument réaliser une maccro VBA.

Voila j'explique mon problème un peu plus en détails.

J'ai deux fichiers excel : "A_valider_calculs" et "Priorites".
Le fichier "A_valider_calculs" contient une feuille "Clos" et le fichier "Priorites" contient 3 feuilles : "Bidos", "Non_Bidos" et "Clos_Priorites".

Le but de la maccro VBA est de comparer la colonne A de "A_valider_calculs/Clos" avec respectivement "Priorites/Bidos" et "Priorites/Non_Bidos".
Si le contenu des cellules est le meme pour une ligne, il faut que je colorie en vert la ligne correspondante dans "Priorites/Bidos" ou "Priorites/Non_Bidos" et que je coupe cette même ligne pour la coller dans "Priorites/Clos_Priorites", sachant que ce fichier contient déjà des lignes à la base.

Petite chose en plus, Il faudrait également que cette maccro s'effectue à l'aide d'un "bouton" mise à jour qui se situerait dans la première cellule de "Priorites/Bidos" et qui afficherait la dernière date à laquelle on a cliqué dessus.

Je remercie tous ceux qui auront le temps de lire mon problème et qui m'apporteront de l'aide sachant que je galère dessus depuis pas mal de jour.

Bonne journée

Autres pages sur : 2003 vba comparer cellules couper coller lignes

a b L Programmation
1 Août 2011 10:03:36

Salut,

Eh, bien sûr que nous pouvons t'aider. !
Tu as trois amis. Google, qui t'a amené ici, l'enregistreur de macro d'Excel qui va écrire pour toi un code épouvantable mais dont nous allons nous servir de base pour découvrir VBA/Excel et zeb, un petit tyran sur le forum PPC, qui va t'aider à faire du code de l'enregistreur une belle macro capable de résoudre ton problème. :) 

Comme je ne vais pas faire ton boulot à ta place, c'est à toi de commencer. Publie donc une ébauche de code, on va faire en sorte qu'à la fin, ça marche ;) 
m
0
l
1 Août 2011 10:14:10

Je n'ai malheureusement pas encore de code, je suis en train d'éplucher les tuto pour voir comment se nomme les différentes fonctions, mais j'ai à peu près écris l'algorithme en langage... humain :) 

ca donne ca :

-> Ouvrir le fichier "A_Valider_Calculs"
-> Ouvrir la feuille "Clos"
-> Ouvrir le fichier "Priorites"
-> Ouvrir les feuilles "Bidos", "Non_Bidos" et "Clos_Priorites"
-> Lire les valeurs de la colonne A de "A_Valider_Calculs/Clos"
-> Lire les valeurs de la colonne A de "Priorites/Bidos" (ou de "Priorites/Non_Bidos)
-> Comparer toutes ces valeurs entre elles
-> Si des valeurs sont égales, sélectionner la ligne correspondante dans "Priorites/Bidos)
-> Colorier la ligne en vert
-> Couper la ligne
-> Sélectionner la première ligne vide dans la feuille "Priorites/Clos_Priorites"
-> Coller à cet endroit la ligne coupée provenant de "Priorites/Bidos"
-> Afficher l'heure+date de la dernière utilisation de la maccro à coter du bouton de mise à jour
-> Fermer le fichier "A_Valider_Calculs"

je suis en train de faire une ébauche de code, je poste ca des que finit.
merci de l'aide
m
0
l
Contenus similaires
a b L Programmation
1 Août 2011 10:21:00

[:glublutz:25]

Ouh que cet algorithme est laid ! C'est moche quand tu écris : Couper ... Coller.

De quel droit te permets-tu de te servir du presse-papier comme variable temporaire ?
C'est comme ça que tu programmais en C ou en Fortran ? Je ne pense pas.

Imagine que plusieurs programmes ou macros en fassent autant, et en même temps !
Quelle pagaille.

Il faudra donc trouver une solution alternative.
m
0
l
1 Août 2011 11:08:39

Sub Maccro()
Dim i, j As Integer 'Je définis mes variables
 
 
'Je déclare les fichiers d'entrées
Workbooks.Open A_Valider_Calcul:="C:\A_Valider_Calcul.xls"
Workbooks.Open Priorites:="C:\Priorites.xls"
Workbooks("A_Valider_Calcul.xls").Activate
Workbooks("Priorites.xls").Activate
Set wk0 = Workbooks("A_Valider_Calcul.xls")
Set wk1 = Workbooks("Priorites.xls")
 
'Je sélectionne mes feuilles dans les fichiers
wk0.Sheets("Clos").Select
wk1.Sheets("Bidos").Select
wk1.Sheets("Non_Bidos").Select
wk1.Sheets("Clos_Priorites").Select
 
'Je sélectionne les colonnes/lignes/cellules qui m'intéressent
wk0.Sheets("Clos").Columns("A:A").Select
wk1.Sheets("Bidos").Columns("A:ZZ").Select
wk1.Sheets("Non_Bidos").Columns("A:ZZ").Select
 
'Je fais une double boucle pour comparer chaque valeur de la colonne A
'de "A_Valider_Calcul/Clos" avec chaque valeur de la colonne A de "Priories/Bidos ou Non_Bidos"
 
For i = 1 To 1000
For j = 1 To 1000
If wk0.Sheets("Clos").Cells(j, 1) = wk1.Sheets("Bidos").Cells(i, 1) Then wk1.Sheets("Bidos").Range("Ai:ZZi").Select
' Cells(j,1) correspond bien à la cellule (ligne=i, colonne=1)?
'La je ne sais pas comment colorier la cellule en vert ni comment la déplacer dans la feuille "Priorites/Clos_Priorites"
End If
 
If wk0.Sheets("Clos").Cells(j, 1) = wk1.Sheets("Non_Bidos").Cells(i, 1) Then wk1.Sheets("Non_Bidos").Range("Ai:ZZi").Select
End If
 
Next
Next
 
End Sub
m
0
l
1 Août 2011 11:08:48

Sub Maccro()
Dim i, j As Integer 'Je définis mes variables
 
 
'Je déclare les fichiers d'entrées
Workbooks.Open A_Valider_Calcul:="C:\A_Valider_Calcul.xls"
Workbooks.Open Priorites:="C:\Priorites.xls"
Workbooks("A_Valider_Calcul.xls").Activate
Workbooks("Priorites.xls").Activate
Set wk0 = Workbooks("A_Valider_Calcul.xls")
Set wk1 = Workbooks("Priorites.xls")
 
'Je sélectionne mes feuilles dans les fichiers
wk0.Sheets("Clos").Select
wk1.Sheets("Bidos").Select
wk1.Sheets("Non_Bidos").Select
wk1.Sheets("Clos_Priorites").Select
 
'Je sélectionne les colonnes/lignes/cellules qui m'intéressent
wk0.Sheets("Clos").Columns("A:A").Select
wk1.Sheets("Bidos").Columns("A:ZZ").Select
wk1.Sheets("Non_Bidos").Columns("A:ZZ").Select
 
'Je fais une double boucle pour comparer chaque valeur de la colonne A
'de "A_Valider_Calcul/Clos" avec chaque valeur de la colonne A de "Priories/Bidos ou Non_Bidos"
 
For i = 1 To 1000
For j = 1 To 1000
If wk0.Sheets("Clos").Cells(j, 1) = wk1.Sheets("Bidos").Cells(i, 1) Then wk1.Sheets("Bidos").Range("Ai:ZZi").Select
' Cells(j,1) correspond bien à la cellule (ligne=i, colonne=1)?
'La je ne sais pas comment colorier la cellule en vert ni comment la déplacer dans la feuille "Priorites/Clos_Priorites"
End If
 
If wk0.Sheets("Clos").Cells(j, 1) = wk1.Sheets("Non_Bidos").Cells(i, 1) Then wk1.Sheets("Non_Bidos").Range("Ai:ZZi").Select
End If
 
Next
Next
 
End Sub
m
0
l
2 Août 2011 09:25:25

Merci pour votre aide, j'ai finalement trouvé la solution à mon problème après moultes essais et bcp d'aides.

Pour ceux que ça intéresse voici mon code :

  1. Sub maccro()
  2. 'Définition des variables
  3. Dim i As Long, j As Long, k As Long, wk0 As Workbook, wk1 As Workbook
  4.  
  5. 'Permet de ne pas afficher le message de fermeture de fichier
  6. Application.DisplayAlerts = False
  7.  
  8. On Error Resume Next 'Ouverture de la gestion de problème
  9. Workbooks.Open "C:\Doc1.xls"
  10. If Err <> 0 Then
  11. MsgBox ("Le fichier C:\Doc1.xls n'existe pas")
  12. Exit Sub 'Affichage d'un message d'erreur si le fichier n'existe pas
  13. End If
  14. On Error GoTo 0 'Fermeture de la gestion de problème
  15. Set wk0 = ActiveWorkbook
  16. Set wk1 = ThisWorkbook
  17.  
  18.  
  19. j = 2
  20. While wk0.Worksheets("Doc1_Feuille1").Cells(j, 1) <> ""
  21. On Error Resume Next
  22. i = WorksheetFunction.Match(wk0.Worksheets("Doc1_Feuille1").Cells(j, 1).Value, wk1.Worksheets("Doc2_Feuille1").Columns(1), 0) 'Comparaison de la valeur des colonnes A des différentes feuilles
  23. If Err Then i = 0
  24. On Error GoTo 0
  25. If i <> 0 Then
  26. wk1.Worksheets("Doc2_Feuille1").Rows(i).Interior.Color = RGB(153, 204, 0) 'Remplissage en vert de la ligne
  27. wk1.Worksheets("Doc2_Feuille1").Rows(i).Cut 'On coupe la ligne qui a passé le test de comparaison
  28. With wk1.Worksheets("Doc2_Feuille2")
  29. With .UsedRange: k = .Row + .Rows.Count
  30. .Rows(k).Insert 'On insert la ligne dans la feuille " Doc2_Feuille2"
  31. End With
  32. End With
  33. wk1.Worksheets("Doc2_Feuille1").Rows(i).Delete 'On supprime la ligne qu'on a déplacé et qui est maintenant vide
  34. End If
  35. j = j + 1 'On passe au traitement de la ligne suivante dans la feuille " Doc1_Feuille1" de Doc1
  36. Wend
  37.  
  38.  
  39. wk0.Close
  40.  
  41. 'Affichage de la date de dernière mise à jour dans la 1ère case de la feuille Doc2_Feuille1
  42. wk1.Worksheets("Doc2_Feuille1").Cells(1, 1) = " Mis à jour le " + Format(Date, "dd-mm-yyyy") + " à " + Format(Time, "hh:mm")
  43.  
  44. End Sub


Remarque : La maccro plante s'il y a des colonnes avec des cellules fusionnées.

Bonne journée
m
0
l