Saisie et recherche

Bonjour à tous.

Après avoir "piocher" un peu partout sur le Net, j'ai créer créer un fichier en assemblant plusieurs codes.

Ce classeur comporte :

  • un userForm de saisie, (fonctionnel).
  • un autre de recherche qui me pose des soucis avec l'affichage des données dans le listview. Si cela fonctionne dans la récupération des données, je n'ai pas celles que j'aimerai obtenir dans les colonnes respectives. J'ai tenté plusieurs modifications sans succès. De plus, la colonne du nom de la feuille ne m'est pas nécessaire et je n'arrive pas à la supprimer. (Dans les différents classeurs sur le sujet pas de codage identique).
Merci par avance de l'aide que vous pourriez m'apporter.

Licaon

Salut Licaon,

Voici les codes rectifiés de ton USF recherche

'ICI C'est la mise en place initialisation
Private Sub UserForm_Initialize()
'pour la date du jour
  Me.Caption = Format(Date, "dddd dd mmmm yyyy")
  With ListBox1
    .ColumnCount = 54  ' de A à D = 4 colonnes + 1 pour la cellule
    '.ColumnWidths = "150;100;0;80;80;70;0"
    .ColumnWidths = "100;100;80;80;0"
  End With
  Me.CommandButton1.Default = True

  ' pour définir la couleur des objets lors de l'initialisation d'un UserForm.
  With RECHERCHETOUS
    .BackColor = &H8000000F
    .CommandButton1.BackColor = &H8000000F
    .CommandButton3.BackColor = &H8000000F
    .CommandButton2.BackColor = &H8000000F
    '.Label3.BackColor = &H8000000F
  End With
End Sub

'ICI C'est le Moteur de Recherche
Private Sub CommandButton1_Click()
  Dim F As Worksheet
  Dim Plage As Range, C As Range
  Dim T As String, Firstaddress As String
  Dim x As Integer
  ListBox1.Clear
  T = Me.TextBox1
  If T = "" Then Exit Sub
  ' Pour chaque feuille du classeur
  For Each F In Worksheets
    ' Avec la feuille F
    With F
      ' FAUX
      'Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(.Rows.Count, .Columns.Count)))
      ' Commencer la recherche à partir de la ligne 3 de la colonne 1
      Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(3, 1), .Cells(.Rows.Count, .Columns.Count)))
    End With
    ' Trouver la cellule contenant la valeur et l'attibuer à C
    Set C = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart)
    ' Si C n'est pas vide = valeur trouvée
    If Not C Is Nothing Then
      ' Première adresse = adresse de la cellule
      Firstaddress = C.Address
      ' Faire
      Do
        ' Avec la ListBox
        With ListBox1
          ' Ajouter un item avec la date
          .AddItem F.Cells(C.Row, 1).Text
          ' Pour chaque colonne suivante de 2 à 4
          For x = 2 To 4
            ' Ajouter la valeur de la cellule
            .List(.ListCount - 1, x - 1) = F.Cells(C.Row, x).Text
          Next x
          ' Ajouter l'adresse dans la 5ème
          .List(.ListCount - 1, 5) = C.Address(False, False)
        End With
        ' Trouver la prochaine cellule contenant la valeur
        Set C = Plage.FindNext(C)
        ' On continue, tant que cellule trouvée et que son adresse <> de la 1ère
      Loop While Not C Is Nothing And C.Address <> Firstaddress
    End If
  Next F

  If ListBox1.ListCount = 0 Then
    MsgBox "Le Texte " & T & " n'a pas été trouvé" & vbLf & "Faites un essai sur une partie du nom", vbCritical, Sign
  End If
End Sub

A+

Bonsoir et merci BrunoM45 pour cette réponse rapide.

Cela fonctionne bien, mais, il y a toujours un mais.

J'ai fourni un fichier avec une seule feuille, (Feuil1). Je souhaite y transférer les données recueillies dans la Feuil2 et quand j'ajoute cette fameuse feuille j'ai le message suivant :

Erreur d’exécution "91", Variable objet ou variable de bloc With non définie.

A force de chercher, je me perds dans le code.

Est-il possible de m'aider encore ?

Merci.

Licaon

bonjour Licaon

non testé a essayer

Private Sub CommandButton4_Click()

    Dim L As Long

    With Worksheets("Feuil2")
        L = .Range("A65536").End(xlUp).Row
        For i = 1 To Me.ListView1.ListItems.Count
            .Range("A" & L + i).Value = Me.ListView1.ListItems(i).ListSubItems(1).Text
              If Me.ListView1.ListItems(i).ListSubItems(2).Text <> "" Then
                .Range("B" & L + i).Value = Me.ListView1.ListItems(i).ListSubItems(2).Text
            End If
            If Me.ListView1.ListItems(i).ListSubItems(3).Text <> "" Then
                .Range("D" & L + i).Value = Me.ListView1.ListItems(i).ListSubItems(3).Text
            End If
        End If
        End With
End Sub

Pascal

Bonjour le Forum.

Merci Grisan29 pour ce code.

Je ne peux pas le vérifier car lorsque j'ajoute la Feuil2, je me retrouve en débogage et je n'ai toujours pas trouvé la solution.

Bonne journée.

Licaon.

Bonjour à tous.

Je cherche toujours la solution à ce problème :

"J'ai fourni un fichier avec une seule feuille, (Feuil1). Je souhaite y transférer les données recueillies dans la Feuil2 et quand j'ajoute cette fameuse feuille j'ai le message suivant :

Erreur d’exécution "91", Variable objet ou variable de bloc With non définie.

Merci de m'aider à trouver la solution pour pouvoir continuer à élaborer cette application.

Bonjour

Modifies ta macro (lignes surlignées)

'ICI C'est le Moteur de Recherche
Private Sub CommandButton1_Click()
  Dim F As Worksheet
  Dim Plage As Range, C As Range
  Dim T As String, Firstaddress As String
  Dim x As Integer
  ListBox1.Clear
  T = Me.TextBox1
  If T = "" Then Exit Sub
  ' Pour chaque feuille du classeur
 For Each F In Worksheets
    ' Avec la feuille F
   With F
      ' FAUX
     'Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(.Rows.Count, .Columns.Count)))
     ' Commencer la recherche à partir de la ligne 3 de la colonne 1
     Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(3, 1), .Cells(.Rows.Count, .Columns.Count)))
    End With
   If Not Plage Is Nothing Then
      ' Trouver la cellule contenant la valeur et l'attibuer à C
      Set C = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart)
      ' Si C n'est pas vide = valeur trouvée
      If Not C Is Nothing Then
        ' Première adresse = adresse de la cellule
        Firstaddress = C.Address
        ' Faire
        Do
          ' Avec la ListBox
          With ListBox1
            ' Ajouter un item avec la date
            .AddItem F.Cells(C.Row, 1).Text
            ' Pour chaque colonne suivante de 2 à 4
            For x = 2 To 4
              ' Ajouter la valeur de la cellule
              .List(.ListCount - 1, x - 1) = F.Cells(C.Row, x).Text
            Next x
            ' Ajouter l'adresse dans la 5ème
            .List(.ListCount - 1, 5) = C.Address(False, False)
          End With
          ' Trouver la prochaine cellule contenant la valeur
          Set C = Plage.FindNext(C)
          ' On continue, tant que cellule trouvée et que son adresse <> de la 1ère
        Loop While Not C Is Nothing And C.Address <> Firstaddress
      End If
   End If
  Next F

  If ListBox1.ListCount = 0 Then
    MsgBox "Le Texte " & T & " n'a pas été trouvé" & vbLf & "Faites un essai sur une partie du nom", vbCritical, Sign
  End If
End Sub

Bonsoir Banzaï et merci de m'orienter.

Bonsoir le Forum.

Je n'arrive pas à comprendre ni à modifier ce code pour que la recherche ne se fasse que sur la Feuil1.

Mes connaissances sont tés limitées pour ce type de modification.

Est-il possible de me faire cette modification afin que je puisse la comprendre. Comme je l'ai déjà mentionné, chacun à sa logique de codage et je ne trouve pas pour m'aider à résoudre ce problème.

Merci pour votre participation.

Licaon

Bonsoir

A voir

Bonjour Banzaï, Bonjour le Forum.

Merci Banzaï pour ton aide.

Je vais prendre le temps de comparer les codes afin de comprendre là où j'étais coincé.

Cette formule fonctionne bien. Je vais pouvoir continuer cette application et affiner mon projet. Une recherche de données entre deux dates par deux DTPicker.

Merci encore

Licaon.

Rechercher des sujets similaires à "saisie recherche"