IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer un numéro de ligne dans une plage de cellules


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Mai 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 72
    Points : 42
    Points
    42
    Par défaut Récupérer un numéro de ligne dans une plage de cellules
    Bonjour

    Pour faire suite à ma question précédente, je rencontre un petit souci. Je souhaite récupérer le numéro de ligne de la cellule ou où je trouve une correspondace avec ce que je cherche.
    ma plage est définie comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set myPlageSearch = Range(Cells(numLine(resCTSCECCol, wshName), NumCol(resCTSCECCol, wshName)), Cells(calcLnFin(wshName), intCol))
    ...
    une boucle (For Each.. Next) pour chercher une correspondance avec le nom "emplName". Ci-dessous l'instrcution que j'utilise pour récupérer le numéro de ligne lorqu'il y a correspondance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iLine = myPlageSearch.Cells.Find(emplName.Value).Row
    et là bien que je trouve le nom que je cherche dans une cellule, avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsError(returnsearchOld = WorksheetFunction.VLookup(emplName, myPlageSearch, 1, False))
    iLine reste toujours = 0 ; ce qui ne correspond pas à la ligne de la cellule contenant le nom trouvé. Help, please!

    Merci

    Clem256

  2. #2
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    Essaie d'utiliser Match :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Match(valeur_à_chercher, plage_de_recherche, 0)
    Cela te donne la position relative de l'élément dans la plage de données. Si tu connais le numero de la première ligne de ta plage de données (premLig), le numero de l'élément à chercher sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Match(valeur_à_chercher, plage_de_recherche, 0) - 1 + premLig
    EDIT : question : à quoi correspond returnsearchold ?

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Mai 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    avec intLine = Application.Match(emplName, myPlageSearch, 0), intLine =1; alors que la correspondance se trouve plutôt à la ligne 188. Il doit me manquer quelque chose.

    returnsearchOld est juste le retour de la fonction vlookup.

  4. #4
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Peux-tu envoyer une capture d'écran de ton classeur?
    Je ne comprends pas bien ton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsError(returnsearchOld = WorksheetFunction.VLookup(emplName, myPlageSearch, 1, False))
    Il faut que tu dises ce qu'est returnsearchOld avant de tester si c'est une erreur.

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Mai 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    Pas de problème pour t'envoyer cette capture. Mais returnsearchOld est un Double qui récupère le retour de Vlookup, bien que je pense que ce ne soit pas utile pour tester l'erreur. Mais en quoi cela gêne?

  6. #6
    Membre du Club
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Mai 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    ci-joint le fichier qui contient la routine en question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    Sub genReport()
     
    Dim reportName As String
    Dim reportSheetName As String
    Dim shName As String
    Dim Msg As String
    Dim wString As String
    Dim wshName As Worksheet
    Dim emplName As Variant
    Dim myPlageSearch As Variant
    Dim wWbk As Workbook
    Dim resCall As Boolean
    Dim oldEmployees As Range
    Dim tempPlage As Range
    Dim intLine As Integer
    Dim indexline As Integer
    Dim iLine As Integer
    Dim intCol  As Integer
    Dim iPlageLastLine As Integer
    Dim returnsearchOld As Double
     
     
    'get the workbookName
     
    'check the sheet for the report exist; else create it
        If ActiveWorkbook.name = testWorkbookName Then
            'resCall = FeuilleExiste(shReportTest)
            If FeuilleExiste(shReportTest) = False Then
                'create the sheet
                Sheets.Add After:=Sheets(Sheets.Count)
                Sheets(Sheets.Count).Select
                Sheets(Sheets.Count).name = shReportTest
            End If
            Sheets(shReportTest).Select
     
            Set wshName = Sheets(shReportTest)
            ' test if the sheet with Time booking exists, then copy it to the new created sheet
     
     
            Call copy2consoSheet(wshName, "testSheet")
     
     
            'this table may contain the resources in the exception list
            'do a loop on this list to delete lie with the resources Names concerned.
     
            Set oldEmployees = Range("Former_Employees")
     
            intLine = oldEmployees.Rows.Count
            indexline = 1
            intCol = oldEmployees.Columns.Count
            'Prepare teh tables for the search & delete line with old employees
            intCol = calcColFin(wshName)
            Set myPlageSearch = Range(Cells(numLine(resCTSCECCol, wshName), NumCol(resCTSCECCol, wshName)), Cells(calcLnFin(wshName), intCol))
            iPlageLastLine = myPlageSearch.Rows.Count
            intCol = myPlageSearch.Columns.Count
     
     
            'For Each emplName In Range("Former_Employees").Columns(2).Cells
            intLine = 1
            For Each emplName In oldEmployees.Columns(2).Cells
     
                Debug.Print emplName.Value
                ' do a lookup on the value to delete the line having this name is the column of CEC ID
                On Error Resume Next
                If IsError(returnsearchOld = WorksheetFunction.VLookup(emplName, myPlageSearch, 1, False)) Then
                    Debug.Print "Former Employee: " & emplName.Value & "already deleted from the employees list" & Chr(13)
     
                    'MsgBox "Error On VLookup"
                    'Err.Clear
                    'If Err.Number <> 0 Then
                    '   Msg = "L'erreur # " & Str(Err.Number) & " a été générée par " _
                    '         & Err.Source & Chr(13) & Err.Description
                    '    MsgBox Msg, , "Erreur", Err.HelpFile, Err.HelpContext
                    'End If
     
                    'Exit Sub
                Else
                    Debug.Print " Find old Employee: " & emplName.Value
                    'try to delete the entire line
                    intLine = Application.Match(emplName, myPlageSearch, 0)
                    iLine = myPlageSearch.Cells.Find(emplName.Value).Row 'store num line where name is found
                    ' delete this line
                    'wshName.Rows(iLine).EntireRow.Delete
                    ' update the number of lines
                    'iPlageLastLine = iPlageLastLine - 1
     
                End If
     
            Next
     
            'build the Pivot Table
     
            Set oldEmployees = Nothing
            Set myPlageSearch = Nothing
            Set wshName = Nothing
     
     
        End If 'on workbook TestName
    End Sub ' fin de la routine proicipale

  7. #7
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour
    Je suis désolée, mais ce matin, j'ai moins le temps de reagrder.
    Ce qui me gêne avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsError(returnsearchOld = WorksheetFunction.VLookup(emplName, myPlageSearch, 1, False)) Then
    C'est que tu dis : si l'affirmation "returnsearchOld est égale au Vlookup" est fausse, alors ..., or tu ne dis jamais avant à quoi est égal returnsearchOld. En maths, c'est comme si tu disais : soit x un nombre, si x = 2, alors ... Mais tu n'as jamais dit ce que valait x, alors, on peut pas savoir si x = 2.
    Je pense que ce que tu veux faire, c'est vérifier si le VLookup renvoie qqc et si c'est le cas, tu attribus à returnsearchOld la valeur du Vlookup. Il faudrait, alors plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If IsError(WorksheetFunction.VLookup(emplName, myPlageSearch, 1, False)) = False Then
        returnsearchOld = WorksheetFunction.VLookup(emplName, myPlageSearch, 1, False)
    End If
    Autr commentaire : tu utilises On Error Resume Next.
    N'utilises pas On Error Resume Next tant que tu n'es pas 100% sûr de ton code !!! Car là tu dis au code de continuer si il y a une erreur, ainsi tu détectes jamais si il y a une erreur et où elle a lieu et donc tu tournes en rond, car tu n'arrives pas à savoir pourquoi ton code ne fais pas ce que tu voudrais.
    Dans le meilleure des mondes, tu ne devrais jamais utiliser On Error Resume Next, car tu devrais gérer toutes les erreurs qui pourraient appraître... mais j'avoue que parfois je l'utilise (shame on me )

  8. #8
    Membre du Club
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Mai 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    Merci pour tes excellents conseils et suggestions, riaolle. Avec eux ajoutéau fait que j'ai revisité hier soir ce code que j'avais repris sans trop l'analyser, et dans lequel j'ai trouvé quelques incohérences, je pense que je vais pouvoir atteindre mon objectif.
    Merci.
    Clem256

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/11/2010, 23h14
  2. Insertion d'une ligne dans une plage de cellules fusionnées
    Par Gautheron dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/10/2008, 18h14
  3. récupérer le numéro de ligne d'une plage en fonc
    Par triaguae dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/12/2007, 13h33
  4. Récupérer le numéro de ligne d'une feuille excel dans un listbox
    Par Dream Master dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/06/2007, 09h16
  5. Rajouter les numéros de ligne dans une colone d'une requete
    Par AntiSAL dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 02/11/2005, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo