XL 2016 Souci pour mettre un nombre dans une cellule en croisant colonne et ligne.

Xender

XLDnaute Nouveau
Bonjour,

Je me permet de venir vers vous car j'ai un souci avec mon code de programmation.

Voici un cahier des charges pour la rédaction du code VBA.

Dans la feuille « Demande chantier »,

_ Un CommandButton1 qui ouvre un Userform1 qui me permet de faire une demande initiale.

Lorsque mon UserForm1 s’ouvre,

_ Dans la TextBox1, la personne renseigne son nom.

_ Dans la ComboBox2, on peut choisir un nom de chantier, par exemple « VERSAILLES ».

_ Dans la ComboBox4, on peut choisir une semaine, par exemple « 5 ».

_ Dans la TextBox2, on écrit le nombre de personnes souhaité, par exemple « 10 »


Une fois que tout est remplie dans mon UserForm1, je clique sur le CommandButton1 qui est dans mon UserForm1 pour que la valeur renseignée dans la TextBox2 de mon UserForm1, soit renseigné dans la feuille nommé « Besoins 2023 ».

Dans la feuille « Besoins 2023 », mes chantiers sont renseignés dans la colonne D, et commence à partir de D9, mes semaines sont renseignées dans la ligne 5 à partir de la colonne H5.


La valeur de la TextBox2 doit être renseignée à l’intersection du chantier choisi dans la ComboBox2 et la semaine choisi dans la ComboBox4, dans la cellule du haut, car il y a deux cellules à l’intersection des chantiers et semaines.

Lorsque j'exécute mon programme :

VB:
Private Sub CommandButton1_Click()
    Dim chantier As String
    Dim semaine As String
    Dim demande As Integer

    chantier = UserForm1.ComboBox2.Value
    semaine = UserForm1.ComboBox4.Value
    demande = CInt(UserForm1.TextBox2.Value)

    ' Trouver la ligne correspondant au chantier
    Dim chantierRange As Range
    Set chantierRange = Sheets("Besoins 2023").Range("D9:D" & Sheets("Besoins 2023").Cells(Rows.Count, "D").End(xlUp).row).Find(chantier)

    ' Trouver la colonne correspondant à la semaine
    Dim semaineColumn As Long
    semaineColumn = Sheets("Besoins 2023").Cells(5, Columns.Count).End(xlToLeft).Column + 1

    ' Remplir la valeur dans la cellule appropriée
    Sheets("Besoins 2023").Cells(chantierRange.row, semaineColumn).Value = demande

    ' Fermer le UserForm1
    UserForm1.Hide
End Sub


Il m'affiche ceci :
Erreur 91.png


Puis me montre cette ligne de code :
ligne en cause.png


Je ne comprend absolument pas ce qu'il ce passe. Pour moi le code est claire dans ma tête et je n'arrive pas à me dépatouiller !

Je vous joint le fichier également.

J'éspère que quelqu'un auras une solution !

Merci par avance je reste à votre disposition si vous avez des questions.

Cordialement.

Xender
 

Pièces jointes

  • Planning pôle travaux 20231002-copie.xlsm
    400.7 KB · Affichages: 3
Dernière édition:
Solution
Bonjour sylvanu, je me permet de vous faire un retour.

J'ai réussi tant bien que mal à faire une boucle ^^

VB:
Dim semaineSelectionnee As Integer
        semaine2 = CInt(UserForm1.ComboBox5.Value)
    semaineSelectionnee = Application.Match(semaine2, Sheets("Besoins 2023").Range("5:5"), 0)

    ' Vérifie que ComboBox5 contient un chiffre
    If Not IsNumeric(semaineSelectionnee) Then
        MsgBox "Veuillez choisir un chiffre valide dans ComboBox5.", vbExclamation
        Exit Sub
    End If

    ' Parcours les cellules entre semaineColumn et semaineSelectionnee
    For i = semaineColumn To semaineSelectionnee
        Sheets("Besoins 2023").Cells(chantierRange, i).Value = demande
    Next i

Cela fonctionne parfaitement, encore...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
L'erreur n'est pas sur la ligne jaune mais en amont sur le calcul de chantierRange qui sort Nothing.
On le voit en faisant du pas à pas, le calcul de chantierRange ne donne aucun résultat.
J'ai remplacé ça :
VB:
chantierRange = Application.Match(chantier, Sheets("Besoins 2023").Range("D1:D" & Sheets("Besoins 2023").Cells(Rows.Count, "D").End(xlUp).Row), 0)
et
Sheets("Besoins 2023").Cells(chantierRange, semaineColumn).Value = demande
Au moins ça ne plante plus, Chantierrange donne le N° de ligne où se trouve "chantier"
Mais attention si "chantier" n'existe pas alors Match donnera une erreur à gérer.
 

Pièces jointes

  • Planning pôle travaux 20231002-copie.xlsm
    388.6 KB · Affichages: 4

Xender

XLDnaute Nouveau
Re bonjour,

Merci pour votre réponse rapide !!! C'est parfait cela fonctionne.

Je me frotte à un autre souci, mon programme s'aligne bien sur le chantier, mais j'ai un souci avec la colonne semaine.
Lorsque je rentre mes données dans l'userform,

Par exemple semaine avec "5" dedans.
userform.png


Au lieu de s'aligner avec la semaine "5" ici :
semaine 5 1.png


Il me met la valeur a coter du tableau ici :
semaine 5 2.png


Dans cet exemple j'ai pris comme chantier VERSAILLES et le semaine 5 avec 20 personnes.

J'avoue être encore novice en VBA et la je ne comprend pas trop ce qu'il fait.

Ma ligne de programmation pour trouver la semaine est :
VB:
' Trouver la colonne correspondant à la semaine
    Dim semaineColumn As Long
    semaineColumn = Sheets("Besoins 2023").Cells(5, Columns.Count).End(xlToLeft).Column + 1

Je pense que le VBA ne doit pas avoir toute les infos necessaire pour allez mettre la valeur dans la colonne de la semaine 5 quand je selectionne 5 dans mon UserfForm.

Une idée ?

Merci beaucoup.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
La même erreur que précédemment avec chantierRange, il vous faut faire un Match pour savoir où il est.
VB:
semaineColumn = Sheets("Besoins 2023").Cells(5, Columns.Count).End(xlToLeft).Column + 1
Ne peut pas vous donner le N° de colonne, puisque la variable "semaine" n'y ait pas présente.
En PJ quelques modifs :
Code:
Dim semaine As Integer ' car semaine est un nombre'
semaine = CInt(UserForm1.ComboBox4.Value) ' pour convertir la chaine de Combobox en nombre.
Recherche du N° de semaine dans la ligne 5.
semaineColumn = Application.Match(semaine, Sheets("Besoins 2023").Range("5:5"), 0)
Attention, idem que précédemment. Si "semaine" n'est pas présent en ligne 5 il y aura erreur, donc à gérer.
 

Pièces jointes

  • Planning pôle travaux 20231002-copie (1).xlsm
    388 KB · Affichages: 5

Xender

XLDnaute Nouveau
Ho punaise oui effectivement !!! J'ai compris mon erreur ! Merci beaucoup :)

En ce qui concerne les messages d'erreur j'ai pallier ceci en mettant des avertissement de case non remplie en place :)

VB:
' Vérifie que la TextBox1 n'est pas vide
    If TextBox1.Value = "" Then
        MsgBox "Veuillez renseigner votre nom.", vbExclamation
        Exit Sub
    End If
    
    ' Vérifie que la ComboBox2
    If ComboBox2.Value = "" Then
        MsgBox "Veuillez choisir un nom de chantier.", vbExclamation
        Exit Sub
    End If
    
    ' Vérifie que la ComboBox4
    If ComboBox4.Value = "" Then
        MsgBox "Veuillez choisir un nombre de semaine.", vbExclamation
        Exit Sub
    End If
    
    ' Vérifie que la TextBox2 n'est pas vide et contient un nombre
    If TextBox2.Value = "" Or Not IsNumeric(TextBox2.Value) Then
        MsgBox "Veuillez entrer un nombre valide de personnes.", vbExclamation
        Exit Sub
    End If

J'ai juste une dernière question, après je ne vous embête plus ^^

Est ce qu'il ai possible de remplir la case du dessous ? Car dans l'onglet validation (que je n'ai pas encore fait en programmation) la personne qui valide devras avoir ca valeur dans la case du dessous.

Ou l'écriture est bleu sur les autre ligne.

dessous.png

Encore 1000 merci pour votre aide
 

Pièces jointes

  • Planning pôle travaux 20231002.xlsm
    382.3 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
L'écriture s'effectue avec :
VB:
Sheets("Besoins 2023").Cells(Ligne, Colonne).Value = demande
Donc vous écrirez en dessous en faisant :
Code:
Sheets("Besoins 2023").Cells(1+chantierRange, semaineColumn).Value = demande

NB: Votre gestion d'erreur n'est valable que si l'utilisateur laisse vide un item. Par contre s'il met en semaines 55, la gestion sera inefficace. sauf si Chantier et Semaines ont des listes déroulantes sans possibilité pour l'utilisateur de les modifier.
 

Xender

XLDnaute Nouveau
D'accord merci beaucoup ...

Oui j'ai prévue de mettre un volet déroulant pour les chantiers, qui reprend la liste prévue dans l'onglet "projets" et de mettre un volet déroulant pour les semaines de 1 à 52.

Est-ce possible de leur laisser sélectionner plusieurs semaine ?🫣 Par exemple si quelqu'un veux faire une demande de la semaine 28 à 32 par exemple ? Car enfaite dans mon cas de figure il ne peuvent que sélectionner semaine par semaine, donc a chaque faire une demande par semaine :s
 

Discussions similaires

Statistiques des forums

Discussions
315 089
Messages
2 116 094
Membres
112 658
dernier inscrit
doro 76