Comparaison de colonnes et lignes entre deux feuilles
Bonjour !
Je me permets de revenir (encore) vous embêter.
J'avance doucement sur mon projet mais je bloque sur une étape.
Contexte du projet rapidement :
Je récupère via une base de données Oracle le statut de différentes applications, selon le statut, je colorise la case associée à l'application d'une certaine couleur selon le mois en cours.
Côté connexion à la base de données et fonction pour coloriser, tout est bon. En revanche, je n'arrive pas à comparer les valeurs retournées par la requête par rapport aux applications présentes sur mon fichier.
Pour plus de visibilité, voici un fichier avec les principaux éléments.
En gros :
Feuil1 : J'ai la liste de mes applications et les mois de l'année.
Feuille "Résultat" : liste des applications retournées par ma requête sur la BDD avec leur état.
Le but :
Comparer la liste des applications sur la feuille 1 et la feuille "Résultat" et coloriser la case correspondante SI les deux applications sont présentes des deux côtés.
En effet, il y a des applications qui sont retournées par la BDD que je ne gère pas et qui n'apparaissent donc pas sur la feuille 1. Egalement, les applications ne sont pas forcément dans le même ordre sur les deux feuilles.
Avec mon code actuel j'ai une erreur sur la ligne :
Select Case Sheets("Resultat").Range("D" & ligne) And Sheets("Resultat").Range("C" & ligne) = Sheets("Feuil1").Columns("F" & ligne)Erreur d'exécution '1004' : Erreur définie par l'application ou par l'objet.
Une idée ?
Merci !
Bonjour,
Essayez ceci:
Sub Colorisation()
Dim f1 As Worksheet, f2 As Worksheet
Set f1 = Sheets("Feuil1")
Set f2 = Sheets("Résultat")
Dim DerLig_f1 As Long, DerLig_f2 As Long, Lig_f1 As Long
Dim Mois As Integer
DerLig_f1 = f1.Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne de la base de données
DerLig_f2 = f2.Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne de l"Résultat"
f2.Range("A2:A" & DerLig_f2).Interior.ColorIndex = xlNone 'Effacement des couleurs existantes
Mois = Month(Date)
'Enregistrement des données dans le tableau + Colorisation de la cellule associée
For Lig_f1 = 2 To DerLig_f1
Appli = f1.Cells(Lig_f1, "A")
With f2.Range("A1:A" & DerLig_f2)
Set A = .Find(Appli, lookat:=xlWhole)
If Not A Is Nothing Then
f1.Cells(Lig_f1, "A").Interior.Color = RGB(0, 176, 240)
f2.Cells(A.Row, "A").Interior.Color = RGB(0, 176, 240)
Select Case f2.Range("B" & A.Row)
Case "TERMINE"
f1.Cells(Lig_f1, Mois + 1).Interior.Color = RGB(0, 128, 0)
Case "EN ERREUR"
f1.Cells(Lig_f1, Mois + 1).Interior.Color = RGB(255, 0, 0)
Case "EN COURS"
f1.Cells(Lig_f1, Mois + 1).Interior.Color = RGB(0, 255, 255)
Case "A VENIR"
f1.Cells(Lig_f1, Mois + 1).Interior.Color = RGB(255, 255, 0)
Case "DEPLANIFIEE"
f1.Cells(Lig_f1, Mois + 1).Interior.Color = RGB(128, 128, 128)
Case "NON PLANIFIEE"
f1.Cells(Lig_f1, Mois + 1).Interior.Color = RGB(222, 184, 135)
End Select
End If
End With
Next Lig_f1
'libération de la mémoire
Set A = Nothing
Set f1 = Nothing
Set f2 = Nothing
End SubComme je vois que vous avez fait beaucoup d'erreurs de saisie dans la liste des états comparées à la liste du "Select case" dans le code, j'ai ajouté la feuille "Liste" avec la liste des états possibles, et crée les validations dans la feuille "Résultat", ainsi toute erreur de saisie est impossible.
Cdlt
Merci pour ton retour !
Au final j'ai trouvé une solution plus simple. Plutôt que de récupérer toutes les données de la BDD puis de trier sur Excel, j'ai effectué le tri lors de la récupération des données via la requête pour gagner du temps.