Recherche V avec une partie d'un mot

Killerjo

XLDnaute Nouveau
Bonjour a tous et toutes

J'ai un fichier composé de plusieurs feuilles. Sur chaque feuille, j'ai une liste de postes avec un prix en face (par exemple sur la feuille MAÇONNERIE en A1 " Ouverture du mur porteur et pose d'un IPN" et en A2 j'ai le tarif)

Sur ma 1er feuille, je souhaiterais qu'en tapant dans une cellule précise soit "mur", soit "porteur" soit "ipn", s'affiche en dessous toutes les lignes qui se trouvent sur la feuille "MACONNERIE" avec le tarif correspondant dans la cellule attenante.

Est ce que je me suis fait comprendre ? Merci par avance.
 

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Bonjour Killerjo,

Pas très sympa de ne pas déposer le fichier ce qui nous oblige à en faire un :rolleyes:

Et vous n'avez jamais entendu parler du filtre automatique ?

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$B$2" Then Exit Sub
On Error Resume Next 'si la feuille n'existe pas
With Sheets(CStr(Target(1, 0))).[A:B]
  .AutoFilter
  .AutoFilter 1, "*" & Target(1) & "*"
  .Parent.Activate
End With
End Sub
A+
 

Pièces jointes

  • Filtre(1).xlsm
    19.4 KB · Affichages: 55
Dernière édition:

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Re,

Maintenant on peut filtrer par formules, voyez le fichier joint.

Les formules en C2 et D2 sont matricielles, donc à valider par Ctrl+Maj+Entrée.

Elles ont été tirées jusqu'à la ligne 1000, vous pouvez ajuster ce nombre dans les formules.

A+
 

Pièces jointes

  • Filtre par formule(1).xlsx
    48.5 KB · Affichages: 49

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Re,

Je reviens au VBA avec cette solution plus élaborée :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [A2:B2]) Is Nothing Then Exit Sub
On Error Resume Next 'si la feuille n'existe pas
With Sheets(CStr([A2])).[A:B]
  .AutoFilter
  .AutoFilter 1, "*" & [B2] & "*"
  Range("C2:D" & Rows.Count).ClearContents 'RAZ
  .Parent.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Copy [C2]
End With
End Sub
C'est beaucoup plus simple et rapide que la solution par formules...

Fichier joint.

Bonne fin de soirée.
 

Pièces jointes

  • Filtre VBa(1).xlsm
    20.6 KB · Affichages: 53

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Bonjour le forum,

.SpecialCells est inutile car .Copy ignore les cellules masquées :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [A2:B2]) Is Nothing Then Exit Sub
On Error Resume Next 'si la feuille n'existe pas
With Sheets(CStr([A2])).[A:B]
  .AutoFilter
  .AutoFilter 1, "*" & [B2] & "*"
  Range("C2:D" & Rows.Count).ClearContents 'RAZ
  .Parent.AutoFilter.Range.Offset(1).Copy [C2]
End With
Columns("C:D").AutoFit 'facultatif, ajustement largeur
End Sub
Fichier (2).

Bonne journée.
 

Pièces jointes

  • Filtre VBA(2).xlsm
    20.7 KB · Affichages: 49

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Re,

Avec VBA on peut faire de jolis gadgets :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [A2:B2]) Is Nothing Then Exit Sub
Dim cible$, L%, c As Range, t$, n%
cible = LCase([B2].Text)
Application.ScreenUpdating = False
On Error Resume Next 'si la feuille n'existe pas
With Sheets(CStr([A2])).[A:B]
  .AutoFilter
  .AutoFilter 1, "*" & cible & "*"
  Range("C2:D" & Rows.Count).Clear 'RAZ
  .Parent.AutoFilter.Range.Offset(1).Copy [C2]
End With
'---mise en évidence du texte cible---
L = Len(cible)
If L Then
  For Each c In Range("C2", Range("C" & Rows.Count).End(xlUp)(2))
    t = c 'plus rapide
    For n = 1 To Len(t) - L + 1
      If LCase(Mid(t, n, L)) = cible Then
        c.Characters(n, L).Font.ColorIndex = 3 'rouge
        c.Characters(n, L).Font.Bold = True 'gras
      End If
  Next n, c
End If
Columns("C:D").AutoFit 'facultatif, ajustement largeur
With Me.UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Fichier (3).

Edit : s'il y a beaucoup de lignes filtrées ça prend un peu de temps mais pas trop.

Recherchez la lettre "o" avec ce fichier (3 bis).

A+
 

Pièces jointes

  • Filtre VBA(3).xlsm
    49.1 KB · Affichages: 51
  • Filtre VBA(3 bis).xlsm
    202.4 KB · Affichages: 45
Dernière édition:

Killerjo

XLDnaute Nouveau
Re : Recherche V avec une partie d'un mot

La vache, t'es prolifique toi !!! :D

Du coup je te joins mon fichier pour que tu comprenne (mais y'a de l'idée dans ce que tu as fait)

Apres je t'ai rajouté une autre mission sur la 1ere feuille
 

Pièces jointes

  • Estimation projet.xlsx
    75.1 KB · Affichages: 59

Killerjo

XLDnaute Nouveau
Re : Recherche V avec une partie d'un mot

Zut ... je viens de m'apercevoir que mon tableau ne fonctionnera pas ...

Sur ma cellule de recherche en feuille1, est il possible de taper par exemple "mur", de voir toutes les lignes concernées, et de ne selctionner (et donc afficher) que celle qui m'interresse ?
 

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Bonjour Killerjo, le forum,

Etudiez avec soin le fichier joint.

Il utilise une TextBox et une ListBox (c'est plus simple et c'est mieux qu'une ComboBox).

Notez bien la macro Workbook_Open dans ThisWorkbook.

J'ai mis pas mal de commentaires pour faciliter la compréhension.

Edit : un petit complément avec le nombre de lignes de la ListBox indiqué en C5.

Bonne journée.
 

Pièces jointes

  • Estimation projet - TextBox + ListBox(1).xlsm
    102.8 KB · Affichages: 63
Dernière édition:

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Bonjour Killerjo, le forum,

C'est pas loin de répondre à mes attentes !!!!!

Vous faites la fine bouche ? La solution que j'ai donnée fait exactement ce que vous désiriez :rolleyes:

Pour le reste je ne vois vraiment pas l'intérêt d'ajouter des lignes puisqu'a priori la nomenclature en colonne B est fixée une fois pour toutes.

Et plutôt que supprimer des lignes il suffit de les masquer (provisoirement).

Inspirez-vous donc du fichier joint et de ces macros :

Code:
Private Sub CommandButton1_Click() 'Enregistrer la facture
Dim chemin$, i%, r As Range
chemin = ThisWorkbook.Path & "\" 'à adapter
If [C2] = "" Then MsgBox "Entrez le client !", 48: Exit Sub
For i = 1 To 9 'supprime les caractères interdits
  [C2] = Replace([C2], Mid("\/:*?""<>|", i, 1), "#")
Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier a été créé
Me.Copy 'nouveau document
With ActiveWorkbook.Sheets(1)
  .DrawingObjects.Delete 'supprime les objets, adapter éventuellement
  .Name = [C3] 'renomme la feuille
  .UsedRange = .UsedRange.Value 'supprime les formules
  For i = .Range("A1", .UsedRange).Rows.Count To 6 Step -1
    If .Rows(i).Hidden Then .Rows(i).Delete 'supprime les lignes masquées
  Next
  .Parent.SaveAs chemin & .Name, FileFormat:=51 'fichier.xlsx
  .Parent.Close
End With
Application.ScreenUpdating = True
MsgBox "Le fichier '" & [C3] & ".xlsx' a été créé"
'---réinitialise---
Rows.Hidden = False 'affiche toutes les lignes
[A6:A100,C2] = ""
[C2].Select
End Sub

Private Sub CommandButton2_Click() 'Imprimer
Me.PrintPreview 'pour tester
'Me.PrintOut
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Row > 5 And Application.CountIf(Target.EntireRow, "*TOTAL*") = 0 Then _
  Cancel = True: Target.EntireRow.Hidden = True 'masque la ligne
End Sub
Cela dit on s'éloigne beaucoup de votre RECHERCHEV du post #1 non ???

A+
 

Pièces jointes

  • Création facture(1).xlsm
    115.6 KB · Affichages: 40

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Re,

Pour insérer une ligne il suffira de sélectionner une ligne entière :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'---ajout de ligne---
Set Target = Target.Areas(1)
If Target.Row > 5 And Target.Rows(1).Address = Target.EntireRow.Address Then
  If Application.CountIf(Target, "*TOTAL*") Then Exit Sub
  Target.Offset(1).Insert
  Target.Copy Target.Offset(1)
  Target(2, 1) = "": Target(2, 1).Select
  Exit Sub
End If
'---
Les lignes ajoutées seront supprimées après création du fichier (voyez aussi dans ThisWorkbook) :

Code:
Private Sub CommandButton1_Click() 'Enregistrer la facture
'---
'---réinitialise---
'supprime les lignes insérées
For i = Me.UsedRange.Rows.Count To 7 Step -1
  If Cells(i, 2) = Cells(i - 1, 2) Then Rows(i).Delete
Next
'---

Edit : j'ai complètement revu l'ensemble (en-tête avec logo, MFC, formules, fichiers .xlsx et .pdf etc...).

Fichier (2).

A+
 

Pièces jointes

  • Création facture(2).xlsm
    138.7 KB · Affichages: 34
Dernière édition:

job75

XLDnaute Barbatruc
Re : Recherche V avec une partie d'un mot

Bonjour Killerjo, le forum,

Si l'on veut créer des fichiers .xls utiliser les fichiers joints.

Les macros sont supprimées dans les fichiers créés.

A+
 

Pièces jointes

  • Création facture .xls(1).xlsm
    139.4 KB · Affichages: 38
  • Création facture .xls(1).xls
    250 KB · Affichages: 32
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 672
Messages
2 090 776
Membres
104 664
dernier inscrit
jth