Code VBA de ma commande "modifier" erroné

Bonjour à tous,

Voilà une semaine que je me suis mis à m'intéresser à la création de formulaire personnalisé excel, afin de créer un outil plus opérationnel pour la gestion des réservations de nos visites. C'est complexe, mais intéressant.

Mais une commande de mon userform "modifier une visite" ne fonctionne pas. Elle ne prend pas en compte les changements apportés pour modifier la ligne... J'espère que je suis assez clair.

Voici ci-dessous le code :

Private Sub Cmdmodification_Click()

Dim no_ligne As Integer

For no_ligne = Cbrechercheidentifiant.ListIndex + 5 To Range("A:A").End(xlDown).Row

If Cbrechercheidentifiant.Value = Cells(no_ligne, 1) Then

Cells(no_ligne, 2).Value = DTPickerDatedemande.Value

Cells(no_ligne, 3).Value = Cbsuiviepar.Value

Cells(no_ligne, 4).Value = Cbetatdemande.Value

Cells(no_ligne, 5).Value = Cbinstallation.Value

Cells(no_ligne, 6).Value = TextBoxDateconfirmee.Value

Cells(no_ligne, 7).Value = TextBoxhorairesdebut.Value

Cells(no_ligne, 8).Value = TextBoxhorairesfin.Value

Cells(no_ligne, 9).Value = TextBoxduree.Value

Cells(no_ligne, 10).Value = TextBoxStructure.Value

Cells(no_ligne, 11).Value = Cbcollectivites.Value

Cells(no_ligne, 12).Value = TextBoxNomprenom.Value

Cells(no_ligne, 13).Value = TextBoxFonction.Value

Cells(no_ligne, 14).Value = TextBoxcodepostal.Value

Cells(no_ligne, 15).Value = TextBoxVille.Value

Cells(no_ligne, 16).Value = TextBoxemail.Value

Cells(no_ligne, 17).Value = TextBoxTel.Value

Cells(no_ligne, 18).Value = TextBoxdatesouhaitee.Value

Cells(no_ligne, 19).Value = TextBoxNbredepersonnes.Value

Cells(no_ligne, 20).Value = Cbpublic.Value

Cells(no_ligne, 21).Value = Cbanimateurs.Value

Cells(no_ligne, 22).Value = Cbpresenceds.Value

Cells(no_ligne, 23).Value = Cbtransport.Value

Cells(no_ligne, 24).Value = TextBoxcommentaires.Value

Cells(no_ligne, 25).Value = TextBoxtravailamont.Value

Cells(no_ligne, 26).Value = TextBoxcontactcollectivites.Value

Cells(no_ligne, 27).Value = Cbinfopar.Value

Cells(no_ligne, 28).Value = Cbenvoiconfirmation.Value

Cells(no_ligne, 29).Value = Cbtypegoodies.Value

Cells(no_ligne, 30).Value = TextBoxnbgoodies.Value

Cells(no_ligne, 31).Value = Cbquestionnaire.Value

End If

Next no_ligne

End Sub

Je vous joins également le formulaire excel dans sa totalité. Il y a certainement des simplifications à apporter à certaines formulations. Un oeil d'expert est ainsi le bienvenu pour m'expliquer quelques astuces à apporter.

Merci d'avance pour votre aide.

Bonne journée

Bonjour,

Si depuis une semaine que tu pratiques, on ne peut que t'encourager à poursuivre pour améliorer...

Axes d'améliorations :

  • Utiliser balises Code pour citer du code (ça, pour faciliter discussions sur le forum)
  • Ecriture du code : l'indenter correctement et systématiquement pour que sa lisibilité soit immédiate.
  • Eliminer les longues énumérations au profit de boucles qui simplifient à la fois l'écriture et la lecture.
  • Cela implique un renommage des contrôles propre à permettre cette utilisation.
...

Ton problème relève d'un défaut de conception :

tu ouvres un Userform destiné à modifier...

l'opération commence par une recherche à partir d'une ComboBox...

On s'attend à la sélection d'un identifiant à voir le formulaire se remplir avec les données correspondant à cet identifiant :

rien ! La procédure Change de la Combo n'est même pas programmée !

Il te faut donc commencer par ça !

L'enregistrement des modifications : les changements opérés ne concernent par définition qu'un seul identifiant. Donc une seule ligne !

Or ta validation lance une modification en boucle, peu explicable...

Je n'ai peut-être pas regardé suffisamment en détail... mais en tout état de cause un dispositif fiable doit se limiter à :

  • recherche des données correspondant à un identifiant sélectionné
  • modifications
  • validation = enregistrement des données modifiées.

Cordialement.

Bonjour Tom, bonjour le forum,

Deux problèmes dans ton code :

Premier

Range("A:A").End(xlDown).Row renvoie la ligne 4 (première ligne éditée de la colonne A)

Il aurait fallu écrire Range("A" & Application.Rows.Count).End(xlUp).Row qui aurait renvoyé 13

Car une boucle d'une valeur à une autre valeur inférieure à la première, va directement à la fin de celle-ci sans exécuter le code entre For et Next. C'est ce qui se passe dans ton cas, quel que soit l'identifiant affiché, le ListIndex+5 est toujours suppérieur à 4...

Second

Pourquoi boucler puisque tu connais le numéro de ligne avec no_ligne = Cbrechercheidentifiant.ListIndex + 5. En plus tu l'utilises déjà dans le bouton Afficher la visite (qui à mon sens est inutile puisque le même code sur la procédure Change de la ComboBox Cbrechercheidentifiant, soit Private Sub Cbrechercheidentifiant_Change(), aurait fait l'affaire sans avoir à cliquer sur le bouton).

Ton code devient donc :

Private Sub Cmdmodification_Click()
Dim no_ligne As Integer

no_ligne = Cbrechercheidentifiant.ListIndex + 5
Cells(no_ligne, 2).Value = DTPickerDatedemande.Value
Cells(no_ligne, 3).Value = Cbsuiviepar.Value
Cells(no_ligne, 4).Value = Cbetatdemande.Value
Cells(no_ligne, 5).Value = Cbinstallation.Value
Cells(no_ligne, 6).Value = TextBoxDateconfirmee.Value
Cells(no_ligne, 7).Value = TextBoxhorairesdebut.Value
Cells(no_ligne, 8).Value = TextBoxhorairesfin.Value
Cells(no_ligne, 9).Value = TextBoxduree.Value
Cells(no_ligne, 10).Value = TextBoxStructure.Value
Cells(no_ligne, 11).Value = Cbcollectivites.Value
Cells(no_ligne, 12).Value = TextBoxNomprenom.Value
Cells(no_ligne, 13).Value = TextBoxFonction.Value
Cells(no_ligne, 14).Value = TextBoxcodepostal.Value
Cells(no_ligne, 15).Value = TextBoxVille.Value
Cells(no_ligne, 16).Value = TextBoxemail.Value
Cells(no_ligne, 17).Value = TextBoxTel.Value
Cells(no_ligne, 18).Value = TextBoxdatesouhaitee.Value
Cells(no_ligne, 19).Value = TextBoxNbredepersonnes.Value
Cells(no_ligne, 20).Value = Cbpublic.Value
Cells(no_ligne, 21).Value = Cbanimateurs.Value
Cells(no_ligne, 22).Value = Cbpresenceds.Value
Cells(no_ligne, 23).Value = Cbtransport.Value
Cells(no_ligne, 24).Value = TextBoxcommentaires.Value
Cells(no_ligne, 25).Value = TextBoxtravailamont.Value
Cells(no_ligne, 26).Value = TextBoxcontactcollectivites.Value
Cells(no_ligne, 27).Value = Cbinfopar.Value
Cells(no_ligne, 28).Value = Cbenvoiconfirmation.Value
Cells(no_ligne, 29).Value = Cbtypegoodies.Value
Cells(no_ligne, 30).Value = TextBoxnbgoodies.Value
Cells(no_ligne, 31).Value = Cbquestionnaire.Value
End Sub

À toi de voir si tu veux conserver le bouton Afficher la visite ou le faire automatiquement au changement dans la ComboBox Cbrechercheidentifiant...

[Édition]

Bonjour Môssieur FERRAND, nos posts se sont croisés...

Salut ThauThème !

Ça arrive régulièrement de se croiser ici ou là !

Ça agrémente les parcours !

Là tu as mâché le travail !

Bon dimanche.

Merci à vous deux. Le travail est certes mâché, mais je vais essayer de bien comprendre pour améliorer l'outil.

Bon dimanche

Bonjour à tous,

Je suis également à la recherche d'un formulaire personnalisé excel, afin d'avoir un outil opérationnel pour:

1) La gestion des réservations de nos visites: qui réserve quoi (nb de pers, langue, visite guidée, ...)

Et si possible:

2) De pouvoir en amont avoir un formulaire qui nous sert de 'caisse enregistreuse', c'est-à-dire d'enregistrer chacune des visites dans la catégorie adéquate (individuel, groupe, seniors, réduction, tarif plein ...) + de pouvoir en tirer des statistiques

3) De pouvoir en aval transférer ces données vers une comptabilité

4) que le Point 1, gestion des réservation, inscrive directement les informations pertinentes (choisies) dans un agenda

5) de pouvoir rajouter dans cet agenda d'autres infos: travaux, présence du personnel ...

Merci de votre aide et de vos bonnes idées

Rechercher des sujets similaires à "code vba commande modifier errone"