[RESOLU] Erreur dans le code du userform

goldfinger13

XLDnaute Occasionnel
bonsoir à tous,

je me retourne vers vous car je ne comprends pas comment corriger l'erreur dans le code de mon Userform.

En fait je souhaite vérifier la saisie dans ma base au travers d'un formulaire. Les deux Combobox servent à trier et permettre l'affichage dans les Textbox et là j'ai une erreur que je ne comprends pas. C'est pourquoi je vous sollicite.
Dans un deuxième temps je souhaite pouvoir modifier le contenu des textbox et ainsi mettre à jour la base.
je joins une ébauche du fichier avec l'erreur générée.

merci d'avance pour votre aide
 

Pièces jointes

  • modif base.xls
    33 KB · Affichages: 52
Dernière édition:

Grand Chaman Excel

XLDnaute Impliqué
Re : Erreur dans le code du userform

Bonsoir,

Pour ta 1re question, le problème est dans cette ligne :

Code:
If Cell = ComboBox1.Value And Cell.Offset(0, -4) = ComboBox2.Value Then

car tu compares du texte avec une date. Pour que ça marche, tu dois convertir le texte du Combobox2 en date ainsi :

Code:
If Cell = ComboBox1.Value And Cell.Offset(0, -4) = CDate(ComboBox2.Value) Then

A+
 

fanfan38

XLDnaute Barbatruc
Re : Erreur dans le code du userform

Bonjour
Pour la 2ème question ajoute

Dim ligne As Integer


Private Sub CommandButton1_Click() 'valider
Ws.Cells(ligne, 7) = TextBox2.Value
Ws.Cells(ligne, 8) = TextBox3.Value
Ws.Cells(ligne, 9) = TextBox4.Value
Ws.Cells(ligne, 10) = TextBox5.Value
Ws.Cells(ligne, 11) = TextBox6.Value
Ws.Cells(ligne, 12) = TextBox7.Value
Unload Me
End Sub

A+ François
 

Dranreb

XLDnaute Barbatruc
Re : Erreur dans le code du userform

Bonjour à tous
Erreur correctement identifiée par les autres intervenants.
Autre solution: Pour n'avoir plus à chercher la ligne ou se trouve la date choisie et n'avoir donc plus à reconvertir son texte en date, ranger le numéro de ligne de feuille dans un tableau aux mêmes indices que les lignes de la combobox.
Par ailleurs: pas besoin de déclarer de variable As Worksheet pour les feuilles de ThisWorkbook: ces objets existent déjà, nommés par leurs CodeName. j'ai renommé FBase celui de la feuille "BASE"
Cordialement

P.S. Attention: si la mise à jour doit mettre des valeurs numériques dans les cellules corrigez les lignes de CommandButton1_Click:
VB:
Private Sub CommandButton1_Click()
L = TLig(ComboBox2.ListIndex)
FBase.Cells(L, 7) = CDbl(TextBox2.Value)
FBase.Cells(L, 8) = CDbl(TextBox3.Value)
FBase.Cells(L, 9) = CDbl(TextBox4.Value)
FBase.Cells(L, 10) = CDbl(TextBox5.Value)
FBase.Cells(L, 11) = CDbl(TextBox6.Value)
FBase.Cells(L, 12) = CDbl(TextBox7.Value)
End Sub
À +
 

Pièces jointes

  • ModifBase.xls
    37.5 KB · Affichages: 46
  • ModifBase.xls
    37.5 KB · Affichages: 50
  • ModifBase.xls
    37.5 KB · Affichages: 50
Dernière édition:

goldfinger13

XLDnaute Occasionnel
Re : Erreur dans le code du userform

merci pour votre aide et votre rapidité. je vais opter pour ta solution Dranreb. Il reste un bug.
Une fois le formulaire ouvert si je sélectionne un item à nouveau dans la combobox 1 j'ai ce message d'erreur:
erreur 9 l'indice n'appartient pas à la sélection
Code:
Private Sub Combobox2_Change()
TextBox2.Enabled = True
TextBox3.Enabled = True
TextBox4.Enabled = True
TextBox5.Enabled = True
TextBox6.Enabled = True
TextBox7.Enabled = True
L = TLig(ComboBox2.ListIndex) ' <-- Cette ligne est en jaune
TextBox2.Value = FBase.Cells(L, 7)
TextBox3.Value = FBase.Cells(L, 8)
TextBox4.Value = FBase.Cells(L, 9)
TextBox5.Value = FBase.Cells(L, 10)
TextBox6.Value = FBase.Cells(L, 11)
TextBox7.Value = FBase.Cells(L, 12)
End Sub
'
 

Dranreb

XLDnaute Barbatruc
Re : Erreur dans le code du userform

Vu. il faut ": If PhaseInit Then Exit Sub" pour l'autre aussi:
VB:
'
Private Sub Combobox1_Change(): If PhaseInit Then Exit Sub
If ComboBox1 = "" Then ComboBox1.SetFocus: Exit Sub
PhaseInit = True
ComboBox2.Clear
ReDim TLig(0 To LMax - 2) As Long
For L = 2 To LMax
   If FBase.Cells(L, "E").Value = ComboBox1.Value Then
      ComboBox2.AddItem FBase.Cells(L, "A").Value
      TLig(ComboBox2.ListCount - 1) = L
      End If
   Next L
PhaseInit = False
End Sub
Private Sub Combobox2_Change(): If PhaseInit Then Exit Sub
À +
 

goldfinger13

XLDnaute Occasionnel
Re : [RESOLU] Erreur dans le code du userform

bonjour le forum,
je réinterviens sur le post afin de tenter de regler la suite de mon appli.
sur la 1ere base le tri s'effectuait sur 2 combobox, mais sur la deuxieme j'ai été dans l'obligation d'en rajouter un troisième pour effectuer le tri. Et là les choses se sont compliquées pour moi.

j'ai bien tenté de modifier le code comme ci dessous:

Code:
Option Explicit
Dim PhaseInit As Boolean, Cell As Range, TLig() As Long
Dim LMax As Long, L As Long


Private Sub Userform_Initialize()
LMax = FBase.Range("A65536").End(xlUp).Row
PhaseInit = True
For L = 2 To LMax
   ComboBox1.Text = FBase.Cells(L, "E").Value
   If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem FBase.Cells(L, "E").Value
   Next L
PhaseInit = False
ComboBox1.Text = FBase.[E2].Value
End Sub
'

Private Sub Combobox1_Change(): If PhaseInit Then Exit Sub
If ComboBox1 = "" Then ComboBox1.SetFocus: Exit Sub
PhaseInit = True
ComboBox2.Clear
ReDim TLig(0 To LMax - 2) As Long
For L = 2 To LMax
   If FBase.Cells(L, "E").Value = ComboBox1.Value Then
      ComboBox2.AddItem FBase.Cells(L, "A").Value
      TLig(ComboBox2.ListCount - 1) = L
      End If
   If FBase.Cells(L, "E").Value = ComboBox1.Value Then
      ComboBox3.AddItem FBase.Cells(L, "G").Value
      TLig(ComboBox3.ListCount - 1) = L
      End If
   Next L
PhaseInit = False
End Sub
Private Sub Combobox2_Change(): If PhaseInit Then Exit Sub
TextBox2.Enabled = True
TextBox3.Enabled = True
TextBox4.Enabled = True
TextBox5.Enabled = True
TextBox6.Enabled = True
TextBox7.Enabled = True
L = TLig(ComboBox2.ListIndex)
TextBox2.Value = FBase.Cells(L, 8)
TextBox3.Value = FBase.Cells(L, 9)
TextBox4.Value = FBase.Cells(L, 10)
TextBox5.Value = FBase.Cells(L, 11)
TextBox6.Value = FBase.Cells(L, 12)
TextBox7.Value = FBase.Cells(L, 13)
End Sub
'
Private Sub ComboBox3_Change(): If PhaseInit Then Exit Sub
L = TLig(ComboBox3.ListIndex)
End Sub

Private Sub CommandButton1_Click()
L = TLig(ComboBox2.ListIndex)
FBase.Cells(L, 8) = TextBox2.Value
FBase.Cells(L, 9) = TextBox3.Value
FBase.Cells(L, 10) = TextBox4.Value
FBase.Cells(L, 11) = TextBox5.Value
FBase.Cells(L, 12) = TextBox6.Value
FBase.Cells(L, 13) = TextBox7.Value
End Sub
'

Private Sub Commandbutton2_Click()
Unload Me
End Sub

mais cela ne fonctionne pas je vous sollicite donc à nouveau.

ci joint le fichier modifié
Encore Merci pour votre aide
 

Pièces jointes

  • ModifBase4.xls
    39 KB · Affichages: 48

Dranreb

XLDnaute Barbatruc
Re : Erreur dans le code du userform

Vous ne me dites pas si la Combobox3 doit suivre la Combobox2 sur la base du 1er critère seulement, comme le suggère ce que vous avez commencé à écrire, ou si elle doit avoir sa propre liste, chacune dépendant des autres.
Dans ce dernier cas, je me demande quand même pourquoi vous ne réglez pas tout simplement le problème à l'aide d'un simple filtre automatique sur la liste, en modifant directement sur la feuille quand le filtre ne retient plus qu'une seule ligne ?
À +
 
Dernière édition:

goldfinger13

XLDnaute Occasionnel
Re : Erreur dans le code du userform

En fait le premier filtre devrait etre la combobox 1 ensuite la combobox 2 et enfin la combobox 3 en clair je souhaite filtrer sur une liaison a partir de la sur une date pour terminer le filtre sur le chantier. Et là je me perds dans l'écriture!
 

goldfinger13

XLDnaute Occasionnel
Re : Erreur dans le code du userform

bonsoir à tous!
je suis assez impressionné par le résultat. Je souhaiterais avoir quelques explications sur le code lui meme

1) les valeurs entre crochet [liaison] par exemple sont elles déterminées par les intitulés de colonnes?

2) si je souhaite filtrer sur une deux ou trois combo il me faut modifier cette partie?:

Code:
Private Sub CbxChantier_Change(): If PhaseInit Then Exit Sub
L = TLig(CbxChantier.ListIndex)
For C = 1 To 6
   Me.Controls("TbxC" & C).Value = FBase.[ColC1àC6].Item(L, C).Value
   Next C
End Sub
'

Private Sub BtValider_Click()
L = TLig(CbxChantier.ListIndex)
For C = 1 To 6
   FBase.[ColC1àC6].Item(L, C).Value = Me.Controls("TbxC" & C).Value
   Next C
End Sub
'

3) [ColC1àC6] correspond aux intitulé de colonnes?
si j'augmente mon nombre de colonnes sur le fichier final j'en ai besoin de 24 j'obtiens [ColC1àC24] en ayant pris soin de nommer chaque colonne de 1 à 24?

Voilà avec ces réponses je pense pouvoir poursuivre et adapter le code à la base finale

merci pour ton aide
 

Dranreb

XLDnaute Barbatruc
Re : Erreur dans le code du userform

Les expressions entre crochet sont une sorte de passerelle vers l'application hote dont elle permettent l'évaluation dans son langage propre. Une référence de plage pour Excel. [...] est équivalent à Range("...") plus simple à écrire, mais ne convenant pas pour des références construites à l'aide d'expressions. Les noms n'ont techniquement aucun rapport avec les intitulés de colonnes. Le dialogue standard pour y accéder en Excel 2003 c'est menu Insertion, Noms, Définir.
Il y à 3 combo là: une première, une autre qui n'est pas la dernière, et une dernière. C'est surtout celle sur le modèle de cette dernière (CbxChantier ici) qui doit toujours exister.
Ecrit comme ça seul les noms des Textbox commançant par TbxC suivi d'un numéro doivent être respecté, du moment que ce sont des colonnes contiguës dans la feuille à prendre dans le même ordre, peu importent leurs titres.
À +
 

Discussions similaires

Réponses
8
Affichages
385

Statistiques des forums

Discussions
312 104
Messages
2 085 332
Membres
102 863
dernier inscrit
Selemani