Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

roidurif

XLDnaute Occasionnel
Bonjour

J'ai 3 onglet,
- tableau de donnée
- code de donnée UPS
- Outil de controle

Dans l'onglet "tableau de donnée" , il y a des codes UPS de rentré en colonne AW,
J'aimerai a partir de l'onglet "outil de contrôle" en cliquant le bouton lancer macro, ca va aller vérifier le code UPS rentré en AW (l'onglet "tableau de donnée) s'il est existant dans l'onglet "code de donnée UPS".

Si code rentré en AW de l'onglet "tableau de donnée" est différent de celui dans l'onglet "code de donnée UPS", alors indiqué numéro de célulle dans l'onglet "Outil de controle", ligne 19

J espere avoir été assez claire

cordialement
 

Pièces jointes

Re : Macro de recherche

Merci de votre aide,

Le souci que je rencontre maintentant, c'est la lenteur de la macro, si je rempli mon tableau qui varie de 700 à 5000 lignes dans "onglet DATA" et ma table code UPS est d'environ 20000 codes.


C'est tres long meme avec 700 lignes, je suis toujour obligé d'arreté la macro brusquement.

Es ce que c'est une question d'emplacement de la macro ou dois je changé complétement la macro?

merci
 
Re : Macro de recherche

Bonsoir à tous...
... et spécialement à roidurif qui dit
(...) Le souci que je rencontre maintentant, c'est la lenteur de la macro (...)
Concernant la lenteur, elle est toute relative. J'ai testé la procédure avec 18 785 lignes dans la feuille DATA et 20 247 lignes dans la feuille Code UPS. Durée d'exécution : 44 minutes et 59 secondes. Pas besoin d'arrêter la macro brusquement...
(...) je rempli mon tableau qui varie de 700 à 5000 lignes dans "onglet DATA" et ma table code UPS est d'environ 20000 codes (...)
Voilà un renseignement intéressant qui aurait dû être donné dès le début : nous aurions gagné du temps.
Venons en à ceci :
(...) Es ce que c'est une question d'emplacement de la macro ou dois je changé complétement la macro? (...)
Maintenant qu'on sait quel est exactement le problème, la réponse est non, pas besoin de changer l'emplacement de la procédure, oui, il convient d'aborder le problème autrement.
Je vous propose le code suivant, à placer dans le module de la feuille Controle :
Code:
Option Explicit
[COLOR="Red"]Option Compare Binary[/COLOR]

Private Sub CommandButton1_Click()
[COLOR="SeaGreen"]' Les lignes marquées *** peuvent être supprimées. Elles ne servent qu'à chronométrer
'la durée d'exécution de la procédure CtlUPS.[/COLOR]
Dim t As Single                         [COLOR="SeaGreen"]' ***[/COLOR]
    t = Timer                           [COLOR="SeaGreen"]' ***[/COLOR]
    CtlUPS
    MsgBox Round(Timer - t, 2) & "s"    [COLOR="SeaGreen"]' ***[/COLOR]
End Sub

Sub CtlUPS()
[COLOR="SeaGreen"]'
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' ¤            29 Pluviôse CCXVII   -   ROGER2327 fecit.            ¤ '
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' Révision le 30 Pluviôse CCXVII (Contrôle des valeurs extrèmes)
'[/COLOR]
Dim i As Long, j As Long, ctl(), dat(), cod(), Uctl As Long, Ldat As Long, Lcod As Long, cd
    Application.ScreenUpdating = False
    ReDim ctl(1 To 2, 1 To 1)
    ctl(1, 1) = "Code UPS INCOHERENT"
    Uctl = 1
    With Sheets("DATA")
        dat = .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Value
        ReDim Preserve dat(1 To UBound(dat, 1), 1 To 3)
        For Each cd In .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Cells
            Ldat = Ldat + 1: dat(Ldat, 2) = cd.Address: dat(Ldat, 3) = cd.Row
        Next cd
    End With
    With Sheets("Code UPS")
        cod = .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp)[COLOR="Red"].Offset(1, 0)[/COLOR]).Value
        ReDim Preserve cod(1 To UBound(cod, 1), 1 To 2)
        [COLOR="Red"]cod(UBound(cod, 1), 1) = Chr(255)
        cod(UBound(cod, 1), 2) = Chr(255)[/COLOR]
        For Each cd In .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp)).Cells
            Lcod = Lcod + 1: cod(Lcod, 2) = cd.Address
        Next cd
        [COLOR="Red"]Lcod = Lcod + 1[/COLOR]
    End With
    Sheets.Add Before:=Worksheets(Me.Name)
    With ActiveSheet
        With .Range(.Cells(1, 1), .Cells(Ldat, 3))
            .Value = dat
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Key2:=.Range("C1"), Order2:=xlAscending, _
                Header:=xlYes, Orientation:=xlSortColumns, [COLOR="Red"]DataOption1:=xlSortTextAsNumbers[/COLOR]
            dat = .Value
        End With
        .Cells.Clear
        With .Range(.Cells(1, 1), .Cells(Lcod, 2))
            .Value = cod
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns, _
                [COLOR="Red"]DataOption1:=xlSortTextAsNumbers[/COLOR]
            cod = .Value
        End With
        .Cells.Clear
        j = 2
        For i = 2 To Ldat
            cd = dat(i, 1)
            For j = j To Lcod
                If cd <= cod(j, 1) Then
                    If cd < cod(j, 1) Then
                        Uctl = Uctl + 1
                        ReDim Preserve ctl(1 To 2, 1 To 1 + Uctl)
                        ctl(1, Uctl) = Replace(dat(i, 2), "$", "")
                        ctl(2, Uctl) = dat(i, 3)
                    End If
                    Exit For
                End If
            Next j
        Next i
        ctl = Application.Transpose(ctl)
        With .Range(.Cells(1, 1), .Cells(Uctl, 2))
            .Value = ctl
            .Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns
            ctl = .Value
        End With
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
    ReDim Preserve ctl(1 To Uctl, 1 To 1)
    ctl = Application.Transpose(ctl)
    With Sheets("controle")
        .Range(.Cells(19, 1), .Cells(19, Columns.Count).End(xlToLeft)).ClearContents
        .Range(.Cells(19, 1), .Cells(19, Uctl)).Value = ctl
    End With
    Application.ScreenUpdating = True
End Sub
Testée avec les mêmes 18 785 lignes dans la feuille DATA et 20 247 lignes dans la feuille Code UPS, cette procédure s'achève en 1 seconde et 4/10.
Voilà. Testez et dites-moi si cela donne bien le résultat espéré.​
Bonne nuit !
ROGER2327
 
Dernière édition:
Re : Macro de recherche

Merci pour l'aide que vous m'avez apporter. La recherche est plus rapide,

Par contre, lorsque dans la feuille DATA, je rentre un code UPS inexistant dans la feuille code UPS, en resultat la macro ne detecte pas l'erreure.

Exemple : le code taper en AW2 de la feuille DATA est 12345678
Celui-ci n' existe pas dans la feuille code UPS

En résultat, il ne me signal pas que la celule AW2 est incohérente.

Par contre, si je saisie toujours en AW2 de la feuille DATA un code < à 8 chiffres, il va me le detecter

1 OK
12 OK
123 OK
1234 OK
12345 OK
123456 OK
1234567 OK

si je saisie toujours en AW2 de la feuille DATA un code > ou = à 8 chiffres, il ne va pas me le detecter

12345678
123456789
...

Merci infiniment
 
Re : Macro de recherche

Bonjour à tous.
Réponse à roidurif :
(...) le code taper en AW2 de la feuille DATA est 12345678
Celui-ci n' existe pas dans la feuille code UPS
En résultat, il ne me signal pas que la celule AW2 est incohérente. (...)
Vous avez parfaitement raison. Les valeurs supérieures au plus grand code figurant dans Code UPS ne sont pas prises en compte. Vous auriez fait la même remarque en plaçant du texte comme donnée dans la feuille DATA : "ABC" n'est pas détecté comme "valeur incohérente".
L'explication est que j'ai oublié une partie du code de la procédure CtlUPS. Voici donc le code corrigé (ajouts en rouge):
Code:
Sub CtlUPS()
[COLOR="SeaGreen"]'
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' ¤            29 Pluviôse CCXVII   -   ROGER2327 fecit.            ¤ '
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' Révision le 30 Pluviôse CCXVII (Contrôle des valeurs extrèmes)
'[/COLOR]
Dim i As Long, j As Long, ctl(), dat(), cod(), Uctl As Long, Ldat As Long, Lcod As Long, cd
    Application.ScreenUpdating = False
    ReDim ctl(1 To 2, 1 To 1)
    ctl(1, 1) = "Code UPS INCOHERENT"
    Uctl = 1
    With Sheets("DATA")
        dat = .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Value
        ReDim Preserve dat(1 To UBound(dat, 1), 1 To 3)
        For Each cd In .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Cells
            Ldat = Ldat + 1: dat(Ldat, 2) = cd.Address: dat(Ldat, 3) = cd.Row
        Next cd
    End With
    With Sheets("Code UPS")
        cod = .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp)[COLOR="Red"].Offset(1, 0)[/COLOR]).Value
        ReDim Preserve cod(1 To UBound(cod, 1), 1 To 2)
        [COLOR="Red"]cod(UBound(cod, 1), 1) = Chr(255)
        cod(UBound(cod, 1), 2) = Chr(255)[/COLOR]
        For Each cd In .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp)).Cells
            Lcod = Lcod + 1: cod(Lcod, 2) = cd.Address
        Next cd
        [COLOR="Red"]Lcod = Lcod + 1[/COLOR]
    End With
    Sheets.Add Before:=Worksheets(Me.Name)
    With ActiveSheet
        With .Range(.Cells(1, 1), .Cells(Ldat, 3))
            .Value = dat
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Key2:=.Range("C1"), Order2:=xlAscending, _
                Header:=xlYes, Orientation:=xlSortColumns, [COLOR="Red"]DataOption1:=xlSortTextAsNumbers[/COLOR]
            dat = .Value
        End With
        .Cells.Clear
        With .Range(.Cells(1, 1), .Cells(Lcod, 2))
            .Value = cod
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns, _
                [COLOR="Red"]DataOption1:=xlSortTextAsNumbers[/COLOR]
            cod = .Value
        End With
        .Cells.Clear
        j = 2
        For i = 2 To Ldat
            cd = dat(i, 1)
            For j = j To Lcod
                If cd <= cod(j, 1) Then
                    If cd < cod(j, 1) Then
                        Uctl = Uctl + 1
                        ReDim Preserve ctl(1 To 2, 1 To 1 + Uctl)
                        ctl(1, Uctl) = Replace(dat(i, 2), "$", "")
                        ctl(2, Uctl) = dat(i, 3)
                    End If
                    Exit For
                End If
            Next j
        Next i
        ctl = Application.Transpose(ctl)
        With .Range(.Cells(1, 1), .Cells(Uctl, 2))
            .Value = ctl
            .Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns
            ctl = .Value
        End With
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
    ReDim Preserve ctl(1 To Uctl, 1 To 1)
    ctl = Application.Transpose(ctl)
    With Sheets("controle")
        .Range(.Cells(19, 1), .Cells(19, Columns.Count).End(xlToLeft)).ClearContents
        .Range(.Cells(19, 1), .Cells(19, Uctl)).Value = ctl
    End With
    Application.ScreenUpdating = True
End Sub
De plus, si vous envisagez d'utiliser du texte dans vos saisies, il serait prudent d'ajouter
Code:
Option Compare Binary
en tête du code de la feuille Controle. Sinon, "ab25" pourrait ne pas être distingué de "AB25", par exemple.
Autre remarque : si la procédure vous parait encore lente et que vous avez des formules calculées dans de nombreuses cellules, vous pouvez essayer de désactiver le calcul automatique des formules pendant l'exécution de la procédure.

Merci de me faire savoir si ce code est maintenant complet (car on peut toujours oublier quelque chose). Pourriez-vous également me dire le temps d'exécution de cette procédure dans les conditions réelles de votre application (en précisant le nombre de lignes utilisées dans chaque feuille, bien sûr) ?​
Merci d'avance,
ROGER2327
 
Re : Macro de recherche

Merci infiniment,

J'ai adapter la macro à mon tableau DATA soit 8000 lignes et des codes UPS soit environ 22000.
J'ai eu au début un message " erreur 400" à l exécution de la macro, je ne sais pas ce que j'ai fait

Apres quelque vérification dans le tableau, et ça a fonctionné ensuite.

C'est vrai que ce vous avez fait ça rien a voir qu 'au début. J'ai d'autres macros dans mon fichier et lorsque le tableau commence à être volumineux, ca prends plus de temps, comme par exemple la macro qui identifie les caractères spéciaux (#, @, 😉 etc.

Je vous joins mon fichier via l'URL ci dessous, car il est volumineux

Macro controles_V.0.9.zip

Merci enormément
 
Re : Macro de recherche

Bonsoir roidurif
J'ai regardé votre classeur et j'ai constaté qu'il pouvait être amélioré. La procédure la plus longue est Ctrl_Caracteres_speciaux (± 5 minutes). En fait, la procédure que vous utilisez est conforme aux indications de l'aide de VBA, mais elle est particulièrement inadaptée à votre cas. Vous lisez entièrement la feuille DATA 6 fois pour rechercher les 6 caractères #, &, @, |, ;, ". En abandonnant la fonction Find(), on peut le faire en une lecture de la feuille au lieu de 6. La durée chute de 5 minutes à moins de 40 secondes. Enfin, au lieu de faire la recherche directement dans la feuille, on peut la faire dans le tableau de valeur de la zone utile de la feuille. Le temps d'exécution chute alors 2,7 secondes. Voici le code que je vous propose :
Code:
Sub Ctrl_Caracteres_speciaux()[COLOR="SeaGreen"] 'Contrôle Caractères Spéciaux
      '---------------------------------------------------[/COLOR]
    [Nom] = "CONTROLE de la présence de caractères spéciaux"
    [Progression] = "10%"
    
     [COLOR="SeaGreen"] '---------------------------------------------------[/COLOR]

Dim dat(), Plage As Range, i As Long, j As Long, x
    dat = Worksheets(DATA).Cells(1, 1).CurrentRegion.Value
    With Sheets(CONTROLE)
        Set Plage = .Range("B2").CurrentRegion
        .Range(.Range("B2"), Plage.Cells(Plage.Cells.Count).Address).Clear
    For i = 2 To UBound(dat, 1)
        For j = 1 To UBound(dat, 2)
            x = dat(i, j)
            If x Like "*[#]*" Then .Cells(2, 256).End(xlToLeft).Offset(0, 1) = Cells(i, j).Address(REF_ABS, REF_ABS)
            If x Like "*&*" Then .Cells(3, 256).End(xlToLeft).Offset(0, 1) = Cells(i, j).Address(REF_ABS, REF_ABS)
            If x Like "*@*" Then .Cells(4, 256).End(xlToLeft).Offset(0, 1) = Cells(i, j).Address(REF_ABS, REF_ABS)
            If x Like "*|*" Then .Cells(5, 256).End(xlToLeft).Offset(0, 1) = Cells(i, j).Address(REF_ABS, REF_ABS)
            If x Like "*;*" Then .Cells(6, 256).End(xlToLeft).Offset(0, 1) = Cells(i, j).Address(REF_ABS, REF_ABS)
            If x Like "*[" & Chr(34) & "]*" Then .Cells(7, 256).End(xlToLeft).Offset(0, 1) = Cells(i, j).Address(REF_ABS, REF_ABS)
        Next j
    Next i
    End With
    Call Format_Date
End Sub
Je l'ai testé, mais il convient de vérifier avant d'abandonner la procédure actuelle.​
Bonne nuit !
ROGER2327
 
Re : Macro de recherche

Bonjour ROGER2327, merci de vos conseil et de votre aide.

Apres quelques test, c'est claire que c'est plus rapide ce que vous me proposez.
Je vais essayer d'adapter vos conseils pour les autres macros, en esperant que c'est la même chose.

Pour revenir à la macro ctrl UPS, " l'erreur 400" que j'obtiens apparait quand il trouve plus de 255 erreurs du fait qu'on est limité en colonne sous excel.

Je ne sais pas s'il est préferable de laisser ça comme cela ou de faire en sorte que lorqu'il y a plus de 255 erreures, faire défiler toute celles au dessus en B19.

C'est ce qu'il se passe pour les caracteres speciaux , ex : si 300 # détectés, toutes celle au dessus de 255 erreurs défilent en B2.

Le fait d'avoir 'l'erreur 400' et plus de 255 eurreurs trouvé, lorsque je relance à nouveau la macro, ca va aller aussi m'effacer le libéllé "Code UPS INCOHERENT" en A19 du fichier contôle.

Je vous remercie infiniement.
 
Même problème, recherche très lente

Bonjour le fil, le forum. Je profite de ce thread pour tenter de trouver une solution à un épineux problème de code. En effet, j'ai moi aussi un tableau assez densément rempli. Au total, 15000 lignes, sur 8 colonnes, où chacune des cases est une variablede critère de recherche dans une macro qui liste et trie ces mêmes critères sous forme de combobox. Ma macro liste les items, et les affiche ensuite dans un usf. Jusque là, rien de bien compliqué. J'ai cependant commencé à observer que le temps d'exécution de ma macro était devenu démesurément long: de 10s de moyenne à 2m30s. J'en déduis que j'ai un problème de boucle, et que la boite tourne dans le vide...Je vous joins le code VBA de mon USF, pour que vous puissiez me guider dans une éventuelle épuration de celui-ci:

Private Sub CommandButton1_Click()
Unload Me: Recherche.Show

End Sub

Private Sub ListBoxLocataire_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
ligSelect = ListBoxLocataire.Column(9, ListBoxLocataire.ListIndex)

usfAffichage.Show
End Sub

Private Sub RechercheC2_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheC3_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheC4_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheC5_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheC6_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheC7_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheC8_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheC9_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub
Private Sub RechercheCX_Change()
Call Rechercher
End Sub
Private Sub UserForm_Initialize()
Range("A2").Select

' Initialiser les listes des critères
Call InitCombo(RechercheC1, "A")
Call InitCombo(RechercheC2, "B")
Call InitCombo(RechercheC3, "C")
Call InitCombo(RechercheC4, "D")
Call InitCombo(RechercheC5, "E")
Call InitCombo(RechercheC6, "F")
Call InitCombo(RechercheC7, "G")
Call InitCombo(RechercheC8, "H")
Call InitCombo(RechercheC9, "I")
Call InitCombo(RechercheCX, "J")



' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub

Private Sub RechercheC1_Change()
' Rechercher les données en fonction des critères sélectionnés
Call Rechercher
End Sub

Private Sub Rechercher()
' Rechercher les données en fonction des critères 1 et 2
Dim rCel As Range
Dim lgLig As Long
Dim lgLigDeb As Long

Dim Critere1 As String
Dim Critere2 As String
Dim Critere3 As String
Dim Critere4 As String
Dim Critere5 As String
Dim Critere6 As String
Dim Critere7 As String
Dim Critere8 As String
Dim Critere9 As String
Dim CritereX As String




Critere1 = "*"
If RechercheC1.Value <> "" Then Critere1 = RechercheC1.Value
ListBoxLocataire.Clear
Critere2 = "*"
If RechercheC2.Value <> "" Then Critere2 = RechercheC2.Value
ListBoxLocataire.Clear
Critere3 = "*"
If RechercheC3.Value <> "" Then Critere3 = RechercheC3.Value
ListBoxLocataire.Clear
Critere4 = "*"
If RechercheC4.Value <> "" Then Critere4 = RechercheC4.Value
ListBoxLocataire.Clear
Critere5 = "*"
If RechercheC5.Value <> "" Then Critere5 = RechercheC5.Value
ListBoxLocataire.Clear
Critere6 = "*"
If RechercheC6.Value <> "" Then Critere6 = RechercheC6.Value
ListBoxLocataire.Clear
Critere7 = "*"
If RechercheC7.Value <> "" Then Critere7 = RechercheC7.Value
ListBoxLocataire.Clear
Critere8 = "*"
If RechercheC8.Value <> "" Then Critere8 = RechercheC8.Value
ListBoxLocataire.Clear
Critere9 = "*"
If RechercheC9.Value <> "" Then Critere9 = RechercheC9.Value
ListBoxLocataire.Clear


' Boucle de la 2me à la dernière ligne de la feuille Feuil1
For lgLigDeb = 3 To Range("A" & Cells.Rows.Count).End(xlUp).Row
If Range("A" & lgLigDeb).Value Like Critere1 And Range("B" & lgLigDeb).Value Like Critere2 And Range("C" & lgLigDeb).Value Like Critere3 And Range("D" & lgLigDeb).Value Like Critere4 And Range("E" & lgLigDeb).Value Like Critere5 And Range("F" & lgLigDeb).Value Like Critere6 And Range("G" & lgLigDeb).Value Like Critere7 And Range("H" & lgLigDeb).Value Like Critere8 And Range("I" & lgLigDeb).Value Like Critere9 Then
With ListBoxLocataire
.AddItem Range("A" & lgLigDeb).Value
.List(.ListCount - 1, 1) = Range("B" & lgLigDeb).Value
.List(.ListCount - 1, 2) = Range("C" & lgLigDeb).Value
.List(.ListCount - 1, 3) = Range("D" & lgLigDeb).Value
.List(.ListCount - 1, 4) = Range("E" & lgLigDeb).Value
.List(.ListCount - 1, 5) = Range("F" & lgLigDeb).Value
.List(.ListCount - 1, 6) = Range("G" & lgLigDeb).Value
.List(.ListCount - 1, 7) = Range("H" & lgLigDeb).Value
.List(.ListCount - 1, 8) = Range("I" & lgLigDeb).Value
.List(.ListCount - 1, 9) = Range("J" & lgLigDeb).Value
.List(.ListCount - 1, 9) = lgLigDeb

lgLig = lgLig + 1
End With
End If
Next lgLigDeb
End Sub

Private Sub InitCombo(LCombo As Object, nomCol As String)
Dim lig As Long
Dim nbElement As Integer
Dim trouveElm As Boolean

LCombo.Clear

' Boucle de la ligne 2 à la dernière ligne dans la colonne nomCol
For lig = 3 To Range(nomCol & Cells.Rows.Count).End(xlUp).Row
trouveElm = False

' Vérifier que l'élément à ajouter dans la liste n'existe pas déjà
For nbElement = 0 To LCombo.ListCount - 1
' L'élément est déjà présent dans la liste, sortie de la boucle
If LCombo.List(nbElement) = Range(nomCol & lig).Value Then
trouveElm = True
Exit For
End If
Next nbElement

' Elément non trouvé dans la liste, l'ajouter
If trouveElm = False Then LCombo.AddItem Range(nomCol & lig).Value
Next lig
End Sub


J'espère de tout coeur que vous pourrez m'aider!!!Excellement vôtre. M
 
Re : Macro de recherche

Bonjour ROGER2327, merci de vos conseil et de votre aide.

Je reviens vers vous car du fait que j'obtiens " l'erreur 400" lorsque j'ai plus de 255 donnée non trouvé, du fait qu'on est limité à 256 colonne sous excel.

J'ai modifié mon tableau horizontal en vertical, ce qui me permettra d'avoir mes résultat en colonne et non linéaire, de plus je n'aurais plus cette erreur 400.

Ma question est simple, comment ne plus avoir le resutat en ligne 19,mais avoir le resultat en colonne "S12:S" et le libéllé code UPS est en S11??

Merci de votre aide

Je vous remercie infiniement.

Code:
Sub CtlUPS()
[COLOR="SeaGreen"]'
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' ¤            29 Pluviôse CCXVII   -   ROGER2327 fecit.            ¤ '
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' Révision le 30 Pluviôse CCXVII (Contrôle des valeurs extrèmes)
'[/COLOR]
Dim i As Long, j As Long, ctl(), dat(), cod(), Uctl As Long, Ldat As Long, Lcod As Long, cd
    Application.ScreenUpdating = False
    ReDim ctl(1 To 2, 1 To 1)
    ctl(1, 1) = "Code UPS INCOHERENT"
    Uctl = 1
    With Sheets("DATA")
        dat = .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Value
        ReDim Preserve dat(1 To UBound(dat, 1), 1 To 3)
        For Each cd In .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Cells
            Ldat = Ldat + 1: dat(Ldat, 2) = cd.Address: dat(Ldat, 3) = cd.Row
        Next cd
    End With
    With Sheets("Code UPS")
        cod = .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp)[COLOR="Red"].Offset(1, 0)[/COLOR]).Value
        ReDim Preserve cod(1 To UBound(cod, 1), 1 To 2)
        [COLOR="Red"]cod(UBound(cod, 1), 1) = Chr(255)
        cod(UBound(cod, 1), 2) = Chr(255)[/COLOR]
        For Each cd In .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp)).Cells
            Lcod = Lcod + 1: cod(Lcod, 2) = cd.Address
        Next cd
        [COLOR="Red"]Lcod = Lcod + 1[/COLOR]
    End With
    Sheets.Add Before:=Worksheets(Me.Name)
    With ActiveSheet
        With .Range(.Cells(1, 1), .Cells(Ldat, 3))
            .Value = dat
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Key2:=.Range("C1"), Order2:=xlAscending, _
                Header:=xlYes, Orientation:=xlSortColumns, [COLOR="Red"]DataOption1:=xlSortTextAsNumbers[/COLOR]
            dat = .Value
        End With
        .Cells.Clear
        With .Range(.Cells(1, 1), .Cells(Lcod, 2))
            .Value = cod
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns, _
                [COLOR="Red"]DataOption1:=xlSortTextAsNumbers[/COLOR]
            cod = .Value
        End With
        .Cells.Clear
        j = 2
        For i = 2 To Ldat
            cd = dat(i, 1)
            For j = j To Lcod
                If cd <= cod(j, 1) Then
                    If cd < cod(j, 1) Then
                        Uctl = Uctl + 1
                        ReDim Preserve ctl(1 To 2, 1 To 1 + Uctl)
                        ctl(1, Uctl) = Replace(dat(i, 2), "$", "")
                        ctl(2, Uctl) = dat(i, 3)
                    End If
                    Exit For
                End If
            Next j
        Next i
        ctl = Application.Transpose(ctl)
        With .Range(.Cells(1, 1), .Cells(Uctl, 2))
            .Value = ctl
            .Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns
            ctl = .Value
        End With
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
    ReDim Preserve ctl(1 To Uctl, 1 To 1)
    ctl = Application.Transpose(ctl)
    With Sheets("controle")
        .Range(.Cells(19, 1), .Cells(19, Columns.Count).End(xlToLeft)).ClearContents
        .Range(.Cells(19, 1), .Cells(19, Uctl)).Value = ctl
    End With
    Application.ScreenUpdating = True
End Sub
 

Pièces jointes

Dernière édition:
Re : Macro de recherche

Bonsoir roidurif
Code:
Sub CtlUNSPSC()
[COLOR="SeaGreen"]'
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' ¤            29 Pluviôse CCXVII   -   ROGER2327 fecit.            ¤ '
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ '
' Révision le 30 Pluviôse CCXVII (Contrôle des valeurs extrèmes)
' Modification le 8 Floréal CCXVII (Sorie des données en colonne S)
'[/COLOR]
Dim i As Long, j As Long, ctl(), dat(), cod(), Uctl As Long, Ldat As Long, Lcod As Long, cd
    Application.ScreenUpdating = False
    ReDim ctl(1 To 2, 1 To 1)
    ctl(1, 1) = "Code UNSPSC INCOHERENT"
    Uctl = 1
    With Sheets("DATA")
        dat = .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Value
        ReDim Preserve dat(1 To UBound(dat, 1), 1 To 3)
        For Each cd In .Range(.Cells(1, 49), .Cells(Rows.Count, 49).End(xlUp)).Cells
            Ldat = Ldat + 1: dat(Ldat, 2) = cd.Address: dat(Ldat, 3) = cd.Row
        Next cd
    End With
    With Sheets("Code UNSPSC")
        cod = .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)).Value
        ReDim Preserve cod(1 To UBound(cod, 1), 1 To 2)
        cod(UBound(cod, 1), 1) = Chr(255)
        cod(UBound(cod, 1), 2) = Chr(255)
        For Each cd In .Range(.Cells(1, 2).End(xlDown), .Cells(Rows.Count, 2).End(xlUp)).Cells
            Lcod = Lcod + 1: cod(Lcod, 2) = cd.Address
        Next cd
        Lcod = Lcod + 1
    End With
    Sheets.Add Before:=Worksheets(Me.Name)
    With ActiveSheet
        With .Range(.Cells(1, 1), .Cells(Ldat, 3))
            .Value = dat
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Key2:=.Range("C1"), Order2:=xlAscending, _
                Header:=xlYes, Orientation:=xlSortColumns, DataOption1:=xlSortTextAsNumbers
            dat = .Value
        End With
        .Cells.Clear
        With .Range(.Cells(1, 1), .Cells(Lcod, 2))
            .Value = cod
            .Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns, _
                DataOption1:=xlSortTextAsNumbers
            cod = .Value
        End With
        .Cells.Clear
        j = 2
        For i = 2 To Ldat
            cd = dat(i, 1)
            For j = j To Lcod
                If cd <= cod(j, 1) Then
                    If cd < cod(j, 1) Then
                        Uctl = Uctl + 1
                        ReDim Preserve ctl(1 To 2, 1 To 1 + Uctl)
                        ctl(1, Uctl) = Replace(dat(i, 2), "$", "")
                        ctl(2, Uctl) = dat(i, 3)
                    End If
                    Exit For
                End If
            Next j
        Next i
        ctl = Application.Transpose(ctl)
        With .Range(.Cells(1, 1), .Cells(Uctl, 2))
            .Value = ctl
            .Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns
            ctl = .Value
        End With
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
    ReDim Preserve ctl(1 To Uctl, 1 To 1)
[COLOR="SeaGreen"]'    ctl = Application.Transpose(ctl)
'    With Sheets("CONTROLE")
'        .Range(.Cells(19, 1), .Cells(19, Columns.Count).End(xlToLeft)).ClearContents
'        .Range(.Cells(19, 1), .Cells(19, Uctl)).Value = ctl
'    End With[/COLOR]
    [COLOR="Red"][B]With Sheets("CONTROLE")[/B][/COLOR] [COLOR="SeaGreen"]' modifié le 8 Floréal CCXVII[/COLOR]
        [COLOR="Red"][B].Range(.Cells(11, 19), .Cells(Rows.Count, 19).End(xlUp)).ClearContents
        .Range(.Cells(11, 19), .Cells(Uctl + 10, 19)).Value = ctl
    End With[/B][/COLOR]
    Application.ScreenUpdating = True
End Sub
Il s'agit d'une modification mineure que vous devriez faire vous-même. J'ai l'impression que vous ne cherchez pas de l'aide pour voir comment faire, puis adapter à votre convenance, mais que vous faites faire le travail. Nous sortons ainsi de l'entraide pour entrer dans le travail gratuit. Est-ce là la philosophie de ce forum ? Je ne le pense pas.​
ROGER2327
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

D
  • Question Question
Réponses
5
Affichages
253
Didierpasdoué
D
Réponses
5
Affichages
613
Réponses
4
Affichages
314
Réponses
32
Affichages
1 K
Réponses
21
Affichages
504
Réponses
6
Affichages
368
Retour