Problème de "formulaire"

Je viens de réessayer et bizarre pour le moment cela refonctionne.

re

Je viens de réessayer et bizarre pour le moment cela refonctionne.

Je suis ne jamais parvenu à reproduire l'erreur dont vous parliez.
Par hasard lors de l'ajout vous cliquiez pas plutôt sur le bouton Modifier que sur Valider.

1 . A ce propos, serait-il possible que lorsque je clic sur "1er" la cellule de la ligne en question soit sélectionnée

Oui c'est possible. Modifiez comme ceci :

1. Dans le 3 codes Btn_Premier, Btn_Precedent et Btn_suivant, ajoutez cette ligne juste avant la ligne TxtBox_Balade.Text=....

TS.DataBodyRange.Item(ID, 1).Select

2. Dans le code Btn_Dernier, ajoutez cette ligne juste avant la ligne TxtBox_Balade.Text=....

TS.DataBodyRange.Item(lig, 1).Select

Rem :
- Une petite chose à ajouter, allez dans l'USF Calendrier et en haut des codes juste avant Option Explicit, rajoutez --> Option Compare Text
- Concernant les Select : même si cela peut paraitre pratique, comme je vous ai déjà écrit, évitez les lorsque vous utilisez VBA et qui plus est les USF.

Merci pour tous ces ajouts, j'ai remarqué le problème lorsque les lignes sous le tableau étaient protégées ,

j'ai donc désactivé les cellules des lignes de "A2 jusqu'à N100" et cela fonctionne normalement.

Apparemment le problème venait de là.

Encore merci pour tous et bonne journée.

re

Ok mais pourquoi jusque N100 ?? Si votre tableau s'agrandit vous risquez d'avoir le même souci.
Cela ne sert pas de protéger votre feuille si vous utilisez votre userform puis les protections avec Excel ce n'est pas toujours simple à gérer.

Par contre, pour améliorer l'utilisation j'aurais peut être rajouté une case à cocher sur l'usf pour autoriser la modification et la suppression.
L'idée étant la suivante :
- Si la case à cocher est non cochée, les boutons modifier et supprimer sont inactifs et le bouton Valider est actif.
- Si la case à cocher est cochée, le bouton Valider devient inactif et les deux boutons modifier et supprimer sont utilisables

Par défaut à l'ouverture de l'usf la case serait non cochée et donc les deux boutons modifier et supprimer inactifs

Cela vous éviterait d'aller cliquer par exemple sur Valider alors que vous voulez modifier. Car ce cas ferait rajouter une ligne à votre feuille plutôt que de modifier

Votre avis ?

Oui après réflexion faite, j'ai supprimer la protection de la feuille.

Je viens de faire des essais jusqu'à la ligne 55 et cela fonctionne parfaitement.

Oui l'idée de désactiver avec 1 case à cocher est excellente.

Encore merci pour votre temps passé à régler mes problèmes de VBA.

re

Oui l'idée de désactiver avec 1 case à cocher est excellente

Ok faites comme ceci

- Dessinez la case à cocher sur votre USF. J'ai fait comme ceci dans votre fichier

image

- Sélectionnez le bouton MODIFIER et dans les propriétés du bouton, mettez la propriété ENABLED sur --> FALSE
- refaite la même chose pour le bouton SUPPRIMER
- Allez dans votre USF, et collez le code ci-dessous

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
    Valider.Enabled = False
    Btn_Modifier.Enabled = True
    Btn_Supprimer.Enabled = True
Else
    Valider.Enabled = True
    Btn_Modifier.Enabled = False
    Btn_Supprimer.Enabled = False
End If
End Sub

- Enregistrez le fichier.

Il vous reste à ouvrir l'USF...

Crdlt

Super, 7 extra.

Me revoilà,

J'ai incorporé 1 textbox_change et 1 listeBox pour faire 1 recherche dans les enregistrements

(copié sur 1 autre fichier du site). 'https://www.excel-pratique.com/fr/astuces_vba/champ-de-recherche-vba

J'ai donc ajouté dans la feuille, les codes suivants:

--------------------------------------------------------------------------------------------------------------------

Private Sub TextBox1_Change()

Application.ScreenUpdating = False

'Range("A2:A24").Interior.ColorIndex = 2
Range("B2:B57").Interior.ColorIndex = 2
ListBox1.Clear

If TextBox1 <> "" Then
For Ligne = 2 To 55
If Cells(Ligne, 1) Like "*" & TextBox1 & "*" Then
Cells(Ligne, 1).Interior.ColorIndex = 43
ListBox1.AddItem Cells(Ligne, 1)
End If
Next
End If

End Sub

-----------------------------------------------------------------------------------------------------------------------------

Réponse quand je clic: pour " ligne" indique " variable non définie".

Que dois-je ajouter ou modifier?

Dsl d'encore vous déranger.

Merci d'avance et bonne journée.

J'ai essayé cette autre formule(copiéd'1 autre fichier:

---------------------------------------------------------------------------------------------

Private Sub TxtBox_1Change()
'Déclaration des variables
Dim NBLigne As Integer
Dim Ligne As Integer

' Mettre une couleur dans la liste des noms
Range("Liste_Noms").Interior.ColorIndex = 15 ' 15 = gris
'Remise à zéro de la liste
Lst_Resultat.Clear

'Définir le nombre de ligne à rechercher dans la liste
NBLigne = WorksheetFunction.CountA(Range("b:b"))

'On teste que la txtbox ne soit pas vide
If TxtBox_1 <> "" Then

'On parcours toutes la liste des nom à partir de la deuxième ligne
For Ligne = 2 To NBLigne
'on test le contenu de la cellule en prenant en compte ttes les valeurs "*"
If Cells(Ligne, 1) Like "*" & TxtBox_1 & "*" Then
'on complète la valeur trouvée dans la listBox
Cells(Ligne, 1).Interior.ColorIndex = 6 ' 6 = jaune ' 26 = violet
Lst_Resultat.AddItem Cells(Ligne, 1)

End If

Next Ligne

End If
End Sub

--------------------------------------------------------------------------------------------------------------------------

Mais cela ne donne rien non plus.

Re

Lorsque vous postez un code pensez à utiliser les balises de code en cliquant sur l'icone </> disponible dans la barre de menu et en collant votre code dans la fenêtre. C'est lisible pour celui qui vous répond


Pour votre question :

Réponse quand je clic: pour " ligne" indique " variable non définie".
Que dois-je ajouter ou modifier?

Vous avez omis de déclarer la variable Ligne --> Dim Ligne as integer

Par contre, votre tableau dans la feuille est au format structuré. Par conséquent votre code sera mieux comme ceci :

Private Sub TextBox1_Change()
Dim TS As ListObject
Dim cel As Range

Set TS = Range("T_Liste").ListObject

With TS
    .ListColumns(2).DataBodyRange.Interior.Color = xlNone

    ListBox1.Clear
    If TextBox1.Value <> vbNullString Then
        For Each cel In .ListColumns(2).Range
            If cel.Value Like "*" & TextBox1 & "*" Then
                .Range(cel.Row, 2).Interior.ColorIndex = 43
                ListBox1.AddItem .Range(cel.Row, 2).Value
            End If
        Next cel
    End If
End With
End Sub

NB : dans le code que vous avez essayé, cells(ligne, 1) correspond à la ligne en colonne A
Celui que je vous donne utilise Listcolumns(2) qui correspond à la colonne B et que je crois être celle que vous voulez utiliser pour la listbox

Crdlt

Bonjour Dan,

dsl pour le retard.

Merci pour ces codes et bonne journée.

Re-bonjour

Voilà j'ai bien réussi à remplir la "listBox" avec les données voulues.

J'ai installé 2 boutons de commandes en rapport avec 2 cellules (avec validations de données)"Q9" et "S9"

installé les codes trouvés sur le site qui fonctionne sur le fichier du site en question;

mais 1 problème se pose sur mon fichier

quand je clic sur les boutons de commande " groupe" ou "pays".

réponse du VBA : "ERREUR non définie.

Voilà les codes:

Private Sub Cmbtn_Groupe_Click()

    'Décalaration des variables
    Dim Critere
    Dim DerniereLigne As Integer, x As Integer

    'Affectation des variables
    Critere = Range("q9")
    'On récupère la dernière ligne de la source de données
    If Cells(Rows.Count, 1).End(xlUp).Row = 1 Then
        DerniereLigne = 2
    Else
        DerniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
    End If

    'On efface le contenu de la liste à chaque recherche.
    lst_Balade.Clear
    lst_Balade.BackColor = RGB(100, 100, 400)

    'On parcours la source de données de la ligne à la dernière ligne
    For x = 1 To DerniereLigne
        'On teste le critère, ici le contenu de M4 avec la source de données.
        If Cells(x, 5) = Critere Then
            'On ecrit dans la listbox
            Me.lst_Balade.AddItem Cells(x, 1)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 1) = Cells(x, 2)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 2) = Cells(x, 3)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 3) = Cells(x, 4)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 4) = Cells(x, 5)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 5) = Cells(x, 6)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 6) = Cells(x, 7)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 7) = Cells(x, 8)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 8) = Cells(x, 9)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 9) = Cells(x, 10)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 9) = Cells(x, 10)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 10) = Cells(x, 11)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 11) = Cells(x, 12)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 12) = Cells(x, 13)
            Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 13) = Cells(x, 14)
            'Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 14) = Cells(x, 15)

        End If
    Next x
End Sub

Le problème se pose au niveau de : lst_Balade.clear .

Où ai-je encore fait 1 erreur?

Merci d'avance et bonne journée.

fichier V2.1 pour essai avant de rectifier sur v3

Re

Ok je vais regarder mais avant une question --> sur base des deux critères placés en Q9 et S9, pourquoi vous ne filtrez pas simplement le tableau plutôt que de faire une listbox ? Cela vous donne une résultat identique

Il y a même mieux à faire en utilisant Power Query et là c'est sans VBA... et une fois fait plus de bouton mais juste la liste de validation. Conditions d'avoir excel 2013 minimum et donc inutile pour vous puisque votre version est 2007.


Edit : voilà il y a plusieurs erreurs :
- la propriété columnHeads doit être à valeur False
- Le nombre de colonne dans une listbox est limité à 10 (là vous essayez avec 13 voir 14...)
- la propriété ListFillrange ne doit pas être mentionnée. Donc laissez à vide
- dans les deux codes cells(x, ...), le numéro de colonne est 3 pour le pays et 7 pour le groupe (là vous avez mis 5 dans les deux)
- Vous restez avec un code qui fonctionne peut-être mais dont les instructions doivent être adaptée pour les tableaux au format structuré

Dites moi si ok pour ne filtrer que sur la tableau principal ou si vous voulez quand même cette listbox...

Re

Si cela ne vous cause pas trop d'ennui, j'aimerais garder cette listebox.

Je vous laisse le fichier que j'ai encore modifié (houps)

Re

Si cela ne vous cause pas trop d'ennui, j'aimerais garder cette listebox.

Pas de soucis pour moi, même si je trouve cela plus compliqué.

Sinon, vous avez changé quoi dans le dernier fichier ?
De mon coté j'ai préparé un code sur le fichier de votre post précédent

La listbox est limitée à 10 colonnes. Donc dites-moi les colonnes que vous ne voulez pas voir

Celles que j'ai besoin sont: 1à 9 + la 11.

A à I et K (code - nom balade - pays - communes - km - durée - groupe - région - restos - fermeture)

Merci et bonne soirée.

Voici les deux codes à remplacer :

Pour le pays

Private Sub CmBtn_Pays_Click()
'Décalaration des variables
Dim Critere
Dim TS As ListObject
Dim c As Range
Dim prem As String
Dim i As Byte

'Affectation des variables
Set TS = Range("T_liste").ListObject
Critere = Range("S9")

'On efface le contenu de la liste à chaque recherche.
lst_Balade.Clear
lst_Balade.BackColor = RGB(100, 100, 400)

If Critere = vbNullString Then Exit Sub 'si liste validation vide

With TS
    'On parcours la source de données de la ligne à la dernière ligne
    Set c = TS.ListColumns(3).DataBodyRange.Find(Critere, LookIn:=xlValues, lookat:=xlWhole)

    If Not c Is Nothing Then
        prem = c.Address
        Do
            If .DataBodyRange(c.Row - .HeaderRowRange.Row, 3) = Critere Then
                Me.lst_Balade.AddItem .DataBodyRange(c.Row - .HeaderRowRange.Row, 1)
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 1) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 2).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 2) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 3).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 3) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 4).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 4) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 5).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 5) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 6).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 6) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 7).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 7) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 8).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 8) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 9).Text
                Me.lst_Balade.List(Me.lst_Balade.ListCount - 1, 9) = .DataBodyRange(c.Row - .HeaderRowRange.Row, 11).Text
            End If
            Set c = .ListColumns(3).DataBodyRange.FindNext(c)
        Loop While Not c Is Nothing And c.Address <> prem
    End If
End With
End Sub

Pour le groupe
C'est le même code que pour le pays dans lequel vous devez changez
- Private Sub CmBtn_Pays_Click() par --> Private Sub Cmbtn_Groupe_Click()
- La ligne Critere = Range("S9") par --> Critere = Range("Q9")
- Dans les deux lignes TS.ListColumns(3), remplacez le chiffre 3 par le chiffre 7
- Dans la ligne IF .databodyrange..... qui est juste en dessous de l'instruction DO, remplacez le chiffre 3 par le chiffre 7

NB : Je supprimerais le code Worksheet Selection Change dans lequel vous avez mis une instruction Calculate. Il est chaque fois exécuté à chaque changement de cellule. Vous êtes en mode de calcul automatique donc ce code est inutile?

Crdlt

Bonjour

Voilà j'ai fait les corrections avec les nouveaux codes; mais j'ai exactement le même problème.

Réponse quand je clic sur "Groupe ou Pays": " fenêtre VBA " indique " erreur non répertoriée".

au niveau:

'On efface le contenu de la liste à chaque recherche.
lst_Balade.Clear

Dsl de vous encore vous déranger.

Merci d'avance et bonne journée.

Laisse le fichier avec les correction (pouvez-vous vérifier si pas fait d'erreur(s)).

Vous m'avez dit seulement 10.

Comment se fait-il que dans ma listBox, j'ai installé 14 colonnes et qu'elle fonctionne normalement avec ses 14 colonnes?

Vous m'avez dit seulement 10.
Comment se fait-il que dans ma listBox, j'ai installé 14 colonnes et qu'elle fonctionne normalement avec ses 14 colonnes?

Vous n'avez pas suivi tout ce que je vous ai écrit dans l'EDIT de mon post précédent --> https://forum.excel-pratique.com/s/goto/1252302
Donc cela ne fonctionnera pas.
Par code les listbox c'est 10 colonnes max que ce soit sur votre feuille ou sur une userform
Un visu avec le code que je vous ai donné

test
Rechercher des sujets similaires à "probleme formulaire"