Creation d'une matrice de notation en marché public
Bonjour,
Je cherche à réaliser une matrice de notation des appels d'offre utile dans mon métier d'acheteur public. Le principe consiste à créer une feuille ou onglet qui est configurée pour afficher des critères de choix qui se ventilent en sous critères, eux mêmes pondérés selon des points et qui affiche des colonnes correspondantes au nombre de candidats qui ont répondu à l'appel d'offre. Bref cette première partie, j'ai réussi à la réaliser avec l'aide d'une A.I. Donc cela fonctionne !. Par contre, le problème devient insoluble lorsque je souhaite dupliquer l'onglet ou feuil2 en plusieurs onglets ou lots avec une configuration de ces onglets différentes de la Feuil2 qui a servi de modèle. En fait, la matrice intitulée "Sub CreerMatriceNotation(ws As Worksheet)" ne s'exécute pas sur les nouveaux onglets ou lots crées ?. J'ai essayé pas mal de possibilités, sans succès :-(... Bref, je fais appel à quelqu'un d'expert en VBA qui pourrait me donner un coup de main pour finaliser la macro et la faire fonctionner, étant certain que je touche au but
. Merci par avance pour votre aide !! :-)
Bonjour,
Votre problème vient du fait que vous supprimez la feuille que vous venez de créer avant d'en créer une autre "
wsNew.Deletej'ai mis cette ligne en remarque dans le code.
******************************************************************************************************************************************************
Voici votre code modifié, j'ai aussi incorporé une macro pour supprimer toutes les feuilles "Lot N° " existantes dès le lancement de la macro de création des lots.
Toutes les macros du module 1:
Dim wsSource As Worksheet
Dim wsNew As Worksheet
Sub CreerMatriceNotation(wsNew As Worksheet)
Dim nombreCriteres As Integer
Dim nombreSousCriteres As Integer
Dim nombreCandidats As Integer
Dim i As Integer, j As Integer, k As Integer
Dim ligneDepart As Integer
Dim colonneDepart As Integer
Dim message As String
Dim erreur As Boolean
erreur = False
message = "Veuillez corriger les erreurs suivantes :" & vbCrLf
' Récupérer le nombre de critères
nombreCriteres = wsNew.Range("B2").Value
' Récupérer le nombre de candidats
nombreCandidats = wsNew.Range("E2").Value
' Vérifier les sous-critères et les pondérations
For i = 1 To nombreCriteres
If wsNew.Cells(i + 1, 3).Value = "" Then
erreur = True
message = message & "- Le critère " & i & " n'a pas de sous-critères définis." & vbCrLf
End If
If wsNew.Cells(i + 1, 4).Value = "" Then
erreur = True
message = message & "- Le critère " & i & " n'a pas de pondération définie." & vbCrLf
End If
Next i
' Afficher un message d'avertissement si des erreurs sont détectées
If erreur Then
MsgBox message, vbExclamation, "Erreur de Saisie"
Exit Sub
End If
' Si tout est correct, continuer avec la création de la matrice
ligneDepart = 15 ' Commence à la ligne 15 pour les réponses
colonneDepart = 4 ' Colonne D pour la première colonne de réponse prestataire
' Effacer les anciennes données
wsNew.Range("A12:Z100").Clear
' Ajouter les en-têtes pour chaque candidat
For k = 0 To nombreCandidats - 1
wsNew.Cells(14, colonneDepart + 3 * k).Value = "Réponse Prestataire " & (k + 1)
wsNew.Cells(14, colonneDepart + 3 * k + 1).Value = "Commentaire Client Interne " & (k + 1)
wsNew.Cells(14, colonneDepart + 3 * k + 2).Value = "Notation " & (k + 1)
Next k
' Boucle pour ajouter les critères et sous-critères
For i = 1 To nombreCriteres
' Indiquer le critère
wsNew.Cells(ligneDepart, 1).Value = "Critère " & i
' Récupérer le nombre de sous-critères pour chaque critère
nombreSousCriteres = wsNew.Cells(i + 1, 3).Value
For j = 1 To nombreSousCriteres
wsNew.Cells(ligneDepart + j, 2).Value = "Sous-Critère " & i & "." & j
' Appliquer la validation des données pour la notation pour chaque candidat
For k = 0 To nombreCandidats - 1
With wsNew.Cells(ligneDepart + j, colonneDepart + 3 * k + 2).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="1,2,3,4"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = True
End With
Next k
Next j
' Ajouter une ligne de totalisation pondérée pour chaque candidat
For k = 0 To nombreCandidats - 1
Dim totalCell As Range
Set totalCell = wsNew.Cells(ligneDepart + nombreSousCriteres + 1, colonneDepart + 3 * k + 2)
wsNew.Cells(ligneDepart + nombreSousCriteres + 1, colonneDepart + 3 * k + 1).Value = "Total Critère " & i
totalCell.Formula = "=SUM(" & wsNew.Cells(ligneDepart + 1, colonneDepart + 3 * k + 2).Address & ":" & wsNew.Cells(ligneDepart + nombreSousCriteres, colonneDepart + 3 * k + 2).Address & ") / (" & nombreSousCriteres & " * 4) * " & wsNew.Cells(i + 1, 4).Value
Next k
' Passer à la ligne suivante pour le prochain critère
ligneDepart = ligneDepart + nombreSousCriteres + 2 ' Laisser une ligne vide entre les critères
Next i
End Sub
Sub CreerOngletsEtExecuterMacro()
Dim nombreLots As Integer
Dim i As Integer
Application.ScreenUpdating = False
Suppression_des_onglets_Lot 'suppression des onglets "Lot" existants
' Définir la feuille source
Set wsSource = ThisWorkbook.Sheets("Feuil2")
' Récupérer le nombre de lots à partir de la cellule F2
nombreLots = wsSource.Range("F2").Value
' Boucle pour créer des copies de Feuil1 pour chaque lot
For i = 1 To nombreLots
' Vérifier si l'onglet existe déjà, si oui, le supprimer
On Error Resume Next
Set wsNew = ThisWorkbook.Sheets("Lot N°" & i)
If Not wsNew Is Nothing Then
Application.DisplayAlerts = False
'wsNew.Delete
Application.DisplayAlerts = True
End If
On Error GoTo 0
' Copier Feuil1
wsSource.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set wsNew = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
wsNew.Name = "Lot N°" & i
' Exécuter la macro sur le nouvel onglet
CreerMatriceNotation wsNew ' Appel direct de la macro
Next i
End Sub
Sub Suppression_des_onglets_Lot()
Application.DisplayAlerts = False
For i = Sheets.Count To 1 Step -1
If Left(Sheets(i).Name, 3) = "Lot" Then Sheets(i).Delete
Next i
End Sub
Sub CreerMatriceNotationLot(ws As Worksheet)
' Exemple de code à exécuter sur chaque nouvel onglet
wsNew.Range("A1").Value = "Exécution réussie sur " & wsNew.Name
' Ajoutez ici le code spécifique que vous souhaitez exécuter
End SubCdlt
Mille merci pour votre réponse qui apporte une solution à la création des lots !
Bonjour,
Pas sûr d'avoir tout compris, voici quand même une proposition, si cela ne correspond pas à vos attentes, joindre un fichier avec le résultat attendu.
CDlt
Bonjour Arturo,
Suite à la présentation .PPT que j'ai été obligé de convertir en .jpg , voici la macro en question qui génère une erreur exprimée dans la slide ci dessus.
C'est vraiment super de pouvoir compter sur votre aide, je vous en remercie. J'espère avoir été clair sur les étapes de création d'une matrice de notation à laquelle je pense depuis de nombreuses années. J'espère y parvenir avec votre concours.
Sub CreerEtConfigurerLots()
Dim wsSource As Worksheet
Dim wsNew As Worksheet
Dim nombreLots As Integer
Dim i As Integer
' Définir la feuille source
Set wsSource = ThisWorkbook.Sheets("Feuil2") ' Assurez-vous que le nom est correct
' Récupérer le nombre de lots à partir de la cellule F5
nombreLots = wsSource.Range("F5").Value
' Boucle pour créer des copies de Feuil2 pour chaque lot
For i = 1 To nombreLots
' Vérifier si l'onglet existe déjà, si oui, le supprimer
On Error Resume Next
Set wsNew = ThisWorkbook.Sheets("Lot No" & i)
If Not wsNew Is Nothing Then
Application.DisplayAlerts = False
wsNew.Delete
Application.DisplayAlerts = True
End If
On Error GoTo 0
' Copier Feuil2
wsSource.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set wsNew = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
wsNew.Name = "Lot No" & i
' Effacer les cellules F1 et F2 dans le nouvel onglet
wsNew.Range("F1:F5").ClearContents
' Configurer le lot
ConfigurerLot wsNew
Next i
End Sub
Utiliser la macro ConfigurerLot(ws As Worksheet) pour configurer chaque lot :
Sub ConfigurerLot(ws As Worksheet)
Dim nombreCriteres As Integer
Dim nombreSousCriteres As Integer
Dim nombreCandidats As Integer
Dim i As Integer, j As Integer, k As Integer
Dim ligneDepart As Integer
Dim colonneDepart As Integer
' Récupérer le nombre de critères et de candidats
nombreCriteres = ws.Range("B2").Value
nombreCandidats = ws.Range("E2").Value
' Configurer la matrice
ligneDepart = 15
colonneDepart = 4
' Effacer les anciennes données
ws.Range("A12:Z100").Clear
' Ajouter les en-têtes pour chaque candidat
For k = 0 To nombreCandidats - 1
ws.Cells(14, colonneDepart + 3 * k).Value = "Réponse Prestataire " & (k + 1)
ws.Cells(14, colonneDepart + 3 * k + 1).Value = "Commentaire Client Interne " & (k + 1)
ws.Cells(14, colonneDepart + 3 * k + 2).Value = "Notation " & (k + 1)
Next k
' Boucle pour ajouter les critères et sous-critères
For i = 1 To nombreCriteres
ws.Cells(ligneDepart, 1).Value = "Critère " & i
nombreSousCriteres = ws.Cells(i + 1, 3).Value
For j = 1 To nombreSousCriteres
ws.Cells(ligneDepart + j, 2).Value = "Sous-Critère " & i & "." & j
' Appliquer la validation des données pour la notation
For k = 0 To nombreCandidats - 1
With ws.Cells(ligneDepart + j, colonneDepart + 3 * k + 2).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="1,2,3,4"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = True
End With
Next k
Next j
' Ajouter une ligne de totalisation pondérée pour chaque candidat
For k = 0 To nombreCandidats - 1
Dim totalCell As Range
Set totalCell = ws.Cells(ligneDepart + nombreSousCriteres + 1, colonneDepart + 3 * k + 2)
ws.Cells(ligneDepart + nombreSousCriteres + 1, colonneDepart + 3 * k + 1).Value = "Total Critère " & i
totalCell.Formula = "=SUM(" & ws.Cells(ligneDepart + 1, colonneDepart + 3 * k + 2).Address & ":" & _ ws.Cells(ligneDepart + nombreSousCriteres, colonneDepart + 3 * k + 2).Address & _ ") / (" & nombreSousCriteres & " * 4) * " & ws.Cells(i + 1, 4).Value
Next k
ligneDepart = ligneDepart + nombreSousCriteres + 2
Next i
End Sub
J'ai progressé, mais j'expérimente toujours un problème d'affichage des lots crées :
Par exemple, j'indique en cellule "F2" de "FEUIL 1" le chiffre 3 qui
correspond à la création de 3 lots. La macro s'exécute et me demande le
nombre de candidats pour le 1er lot, je renseigne cette information,
puis, ensuite la macro ne fait pas apparaitre l'onglet lot N°1?, vient
ensuite le tour du 2nd lot, même question à laquelle je saisis le nombre
de candidats, et même chose, l'onglet N°2 n'est pas crée ?. Seul le lot
N°3 apparait le dernier , qui fait l'objet d'une création ? En pièce jointe le code complet.
Merci pour votre aide précieuse!.
Sub CreerEtConfigurerLots()
Dim wsSource As Worksheet
Dim wsNew As Worksheet
Dim nombreLots As Integer
Dim i As Integer
Dim nombreCandidats As Integer
' Définir la feuille source
Set wsSource = ThisWorkbook.Sheets("Feuil1") ' Assurez-vous que le nom est correct
' Récupérer le nombre de lots à partir de la cellule F2
nombreLots = wsSource.Range("F2").Value
' Boucle pour créer des copies de Feuil2 pour chaque lot
For i = 1 To nombreLots
' Vérifier si l'onglet existe déjà, si oui, le supprimer
On Error Resume Next
Set wsNew = ThisWorkbook.Sheets("Lot No" & i)
If Not wsNew Is Nothing Then
Application.DisplayAlerts = False
wsNew.Delete
Application.DisplayAlerts = True
End If
On Error GoTo 0
' Copier Feuil2
wsSource.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set wsNew = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
wsNew.Name = "Lot No" & i
' Effacer les cellules F1 et F2 dans le nouvel onglet
wsNew.Range("F1:F5").ClearContents
' Demander le nombre de candidats pour ce lot
nombreCandidats = Application.InputBox("Entrez le nombre de candidats pour le Lot No" & i, "Nombre de Candidats", Type:=1)
' Vérifier si l'utilisateur a annulé ou entré une valeur invalide
If nombreCandidats <= 0 Then
MsgBox "Nombre de candidats invalide. Le lot ne sera pas configuré.", vbExclamation
wsNew.Delete ' Supprimer l'onglet si le nombre de candidats est invalide
Else
' Enregistrer le nombre de candidats dans la cellule E2
wsNew.Range("E2").Value = nombreCandidats
' Configurer le lot
ConfigurerLot wsNew
End If
Next i
End Sub
Sub ConfigurerLot(ws As Worksheet)
Dim nombreCriteres As Integer
Dim nombreSousCriteres As Integer
Dim nombreCandidats As Integer
Dim i As Integer, j As Integer, k As Integer
Dim ligneDepart As Integer
Dim colonneDepart As Integer
' Récupérer le nombre de critères et de candidats
nombreCriteres = ws.Range("B2").Value
nombreCandidats = ws.Range("E2").Value
' Configurer la matrice
ligneDepart = 15
colonneDepart = 4
' Effacer les anciennes données
ws.Range("A12:Z100").Clear
' Ajouter les en-têtes pour chaque candidat
For k = 0 To nombreCandidats - 1
ws.Cells(14, colonneDepart + 3 * k).Value = "Réponse Prestataire " & (k + 1)
ws.Cells(14, colonneDepart + 3 * k + 1).Value = "Commentaire Client Interne " & (k + 1)
ws.Cells(14, colonneDepart + 3 * k + 2).Value = "Notation " & (k + 1)
Next k
' Boucle pour ajouter les critères et sous-critères
For i = 1 To nombreCriteres
ws.Cells(ligneDepart, 1).Value = "Critère " & i
nombreSousCriteres = ws.Cells(i + 1, 3).Value
For j = 1 To nombreSousCriteres
ws.Cells(ligneDepart + j, 2).Value = "Sous-Critère " & i & "." & j
' Appliquer la validation des données pour la notation pour chaque candidat
For k = 0 To nombreCandidats - 1
With ws.Cells(ligneDepart + j, colonneDepart + 3 * k + 2).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="1,2,3,4"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = True
End With
Next k
Next j
' Ajouter une ligne de totalisation pondérée pour chaque candidat
For k = 0 To nombreCandidats - 1
Dim totalCell As Range
Set totalCell = ws.Cells(ligneDepart + nombreSousCriteres + 1, colonneDepart + 3 * k + 2)
ws.Cells(ligneDepart + nombreSousCriteres + 1, colonneDepart + 3 * k + 1).Value = "Total Critère " & i
totalCell.Formula = "=SUM(" & ws.Cells(ligneDepart + 1, colonneDepart + 3 * k + 2).Address & ":" & _
ws.Cells(ligneDepart + nombreSousCriteres, colonneDepart + 3 * k + 2).Address & _
") / (" & nombreSousCriteres & " * 4) * " & ws.Cells(i + 1, 4).Value
Next k
' Passer à la ligne suivante pour le prochain critère
ligneDepart = ligneDepart + nombreSousCriteres + 2 ' Laisser une ligne vide entre les critères
Next i
End Sub
Sub Suppression_des_onglets_Lot()
Application.DisplayAlerts = False
For i = Sheets.Count To 1 Step -1
If Left(Sheets(i).Name, 3) = "Lot" Then Sheets(i).Delete
Next i
End SubCe message pour vous aviser que j'ai réussi à obtenir le résultat attendu, avec l'affichage de tous les lots requis sans suppression de ces derniers.
Suis très satisfait et vous remercie pour votre aide.
Très cordialement,
Richard