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 :

range(cells(i,11),cells(i,100)).find(donnee..) ne marche pas [XL-2002]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut range(cells(i,11),cells(i,100)).find(donnee..) ne marche pas
    Bonjour,

    J'ai un petit souci: le numéro de la ligne sur la quelle je fais une recherche avec find() est la variable i.
    Je cherche donc une donnée dans cette ligne (il y a une boucle for avant). Mais Excel pas vouloir erreur 93, 91..
    Je dois signaler que je manipule deux fichiers Excel
    J'ai essayé ceci mais rien..
    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
    Dim ligne_source_transaction As Range
    Set ligne_source_transaction = ActiveSheet.UsedRange.Rows(i & ":" & i)
    col_source_saisie = ligne_source_transaction.Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Row
     
    Au départ j'avais ceci:
    Dim ws201 As Worksheet 
    col_source_Transaction = 3 
    For i = 2 To 2000
    code_transaction = ws201.Cells(i, col_source_Transaction).Value 'celui-là, il marche!
    'Récupération du code de transaction dans le fichier cible (dans la première colonne)
    On Error Resume Next
    ligne_transaction_cible = [H2:H5000].Find(What:=code_transaction, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Row 'celui-ci aussi, il marche!
     
    On Error Resume Next
    col_source_saisie = ws201.Range(Cells(i, 11), Cells(i, 100)).Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Row  'et là ça ne marche plus!
    Merci d’avance pour votre aide.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    D'abord, ligne 15
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws201.Range(ws201.Cells(i, 11), ws201.Cells(i, 100))...
    où quelque part avant, il fallait instancier ws201
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ws201=Thisworkbook.worksheets("Nom de la Feuille")

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    oui je l'ai déclaré dans mon code, j'ai oublié de le faire ici...

    j'ai modifié un peu le code mais, le message d'erreur est le suivant:
    Variable objet ou variable bloc With non définie (erreur 91)

    Le bout de code modifié est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set ligne_source_transaction = ActiveSheet.UsedRange.Rows(i)
     
    col_source_saisie = ligne_source_transaction.Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole).Column

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonsoir,

    Tu peux avoir cette erreur parce que la valeur recherchée n’a pas été trouvée.
    La recherche retourne alors « Nothing » et provoque l’erreur d’exécution ‘91’.

    Pour t’en assurer, tu peux décomposer ton code et visualiser en pas à pas avec la fenêtre variables locales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim ligne_source_transaction As Range
    Dim Source_saisie As Range
    Dim col_source_saisie As Long
    Set ligne_source_transaction = ActiveSheet.UsedRange.Rows(i & ":" & i)
    Set Source_saisie = ligne_source_transaction.Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns)
    col_source_saisie = Source_saisie.Column
    Cordialement.

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Avec Find, il faut toujours garder en tête l'éventualité où rien n'est trouvé.

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim c As Range
     
    '.....
    Set c = ligne_source_transaction.Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole)
     
    If Not c Is Nothing Then
        col_source_saisie = c.Column
        Set c = Nothing
    '....
    End If

  6. #6
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut une petite aide pour les amis débogueurs
    J'envois les deux fichier de jeux de test.

    Ré-explication::

    je récupère la date à laquelle la saisie a été faite, donc la donnée de la deuxième ligne de la colonne où je trouve la donnée saisie que je met dans la colonne saisie du fichier cible.
    Pareil pour l'exécution et la livraison qui sont la même chose: donc à mettre dans la colonne exécution du fichier cible (la date).
    J'espère qu'avec le jeux de test c'est plus claire!
    NB J'ai mis mon code dans le fichier source!

    Donc je lis dans le fichier source la colonne toto à chaque ligne (i), lue je vais chercher la chaine de caractères Saisie, la fonction find me renvoie le n° de colonne (j) de la cellule contenant Saisie.
    Je récupère la date (qui est la donnée de la seconde ligne du fichier à la j ème colonne.
    cette date est mise dans le fichier cible dans la colonne des saisies et à la ligne de la même transaction (toto) que celle du fichier source.
    Fichiers attachés Fichiers attachés

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonsoir

    as tu appliquée les corrections préconisées plus haut par mercatog ?

    montre nous ton code modifié .. (sur le forum.. je ne télécharge pas les pièces jointes ..)

  8. #8
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    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
    Sub MàJ()
     
    Application.ScreenUpdating = False       'permet de ne pas rafraîchir les cellules pendant l'exécution de la macro => gain de temps
     
     
    '**********************************
    ' initialisation
    '**********************************
     
     
        'initialisation des variables
     
        Dim wa As Workbook
        Dim wb As Workbook
        Dim wc As Worksheet                 
        Dim ws201 As Worksheet            
        Dim ws202 As Worksheet              
        Dim ws204 As Worksheet              
        Dim aire_de_recherche As Range
     
        Set wa = Workbooks("test.xls")
        fichier_cible = "C:\Users\bibiman\Documents\Listes_des_transactions.xlsx"
        Set ws201 = wa.Worksheets("PSB201")
        Set ws202 = wa.Worksheets("PSB202")
        Set ws204 = wa.Worksheets("PSB204")
        Set wb = Workbooks.Open(fichier_cible)
        Set wc = wb.Sheets("Liste des transactions")
     
        'initialisation des numéros de colonnes dans le fichier (cible) de transactions
     
        col_cible_saisie = 16       'numéro de la colonne Planning de saisie des tests
        col_cible_execution = 17    'numéro de la colonne entité
     
        'initialisation des numéros de colonnes dans le fichier (source) de Planification
     
        col_source_saisie = 1       'numéro de la colonne de la date de saisie
        col_source_execution = 2    'numéro de la colonne de la date d'execution
        col_source_Transaction = 3  'numéro de la colonne transaction AGL, équivalent à la colonne C
        Saisie = "Saisie"
     
    '**********************************
    ' Mise à jour 
    '*********************************
     
     
        'Récupération du code de transaction dans le fichier source (Planification des tests.xls)
     
        For i = 1 To 2000           '2000 nombre de lignes max du fichier source
            code_transaction = ws201.Cells(i, col_source_Transaction).Value
     
        'Récupération du code de transaction dans le fichier cible (dans la première colonne)
            On Error Resume Next
            ligne_transaction_cible = [H2:H5000].Find(What:=code_transaction, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Row
            If ligne_transaction_cible Is Nothing Then
     
        'Récupération de la colonne où la chaine de caractères "Saisie" a été saisie dans le fichier source (Planification des tests.xls)
                On Error Resume Next
                col_source_saisie = Rows(i).Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
     
                If col_source_saisie = "1" Then 'Is Nothing Then
        'Mise à jour des dates de saisie, dans le fichier (cible) de transactions
                    wc.Cells(ligne_transaction_cible, col_cible_saisie).Value = ""
                ElseIf col_source_saisie > 1 Then
                    wc.Cells(ligne_transaction_cible, col_cible_saisie).Value = ws201.Cells(2, col_source_saisie).Value
                End If
        'Récupération de la colonne où les chaines de caractères "Exec" ou "Livr" ont été saisies dans le fichier source (Planification des tests.xls)
     
                On Error Resume Next
                col_source_execution = ws201.Rows(i).Find(What:="Exec", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns).Column
                If Not col_source_execution Is Nothing Then
                    col_source_execution = ws201.ws201.Rows(i).Find(What:="Livr", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns).Column
        'Mise à jour des dates d'éxecution, dans le fichier (cible) de transactions
                    wc.Cells(ligne_transaction_cible, col_cible_execution).Value = ws201.Cells(2, col_source_execution).Value
                ElseIf col_source_execution Is Nothing Then
                    wc.Cells(ligne_transaction_cible, col_cible_execution).Value = ws201.Cells(2, col_source_execution).Value
                End If
                wc.Rows(ligne_transaction_cible).Interior.Color = RGB(255, 255, 0) 'jaune
    '        End If
        Next
    Application.ScreenUpdating = True
    MsgBox ("Fin de traitement")
    End Sub
    Mon erreur (que j'ai découvert avec l'éxecution pas à pas est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    col_source_saisie = Rows(i).Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    col_source_execution = Rows(i).Find(What:="Exec", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns).Column
    à savoir que j'écrive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Rows(i) 'ou  
    ws201.Range(Cells(i, 11), Cells(i, 100))
    find renvoi nothing donc col_source_execution vaut la valeur d'initialisation.

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Après,

    pour être sur d'agir sur la bonne feuille de la même manière que tu as créé tes feuilles variables liées au feuilles :"ws202 ..."
    crée une variable worksheet pointant sur la feuille ou tu effectue tes recherches ...

    et préfixe tous tes objets de type "[H2:H5000]", Cells, Range ... avec cette variable ainsi tu seras sur de travailler avec la bonne feuille...

  10. #10
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut début de réponse
    j'ai pu avancer un peu.
    Il fallait que j'active la worksheet du fichier source.
    Parce que dans mon code j'ouvre le fichier cible, et j'ai beau lui demander de selectionner une Range dans l'autre fichier, VBA pas vouloir.
    Donc il fallait réactiver le fichier source.

  11. #11
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour bibiman23,

    Je te retourne ton code modifié.
    Je te laisse découvrir les corrections ou adaptations, en particulier pour l’utilisation de find.
    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
    Option Explicit
    Sub MàJ_dates()
    '******************************************************************************************************
    ' MàJ_dates Macro
    ' Macro réalisée le 18/11/2011
    ' Auteur :
    ' Objet : une seconde mise à jour concerne les dates de saisie et d'execution
    '******************************************************************************************************
    Application.ScreenUpdating = False       'permet de ne pas rafraîchir les cellules pendant l'exécution de la macro => gain de temps
    '**********************************
    'initialisation des variables
    '**********************************
    Dim wa As Workbook
    Dim wb As Workbook
    Dim wcible As Worksheet
    Dim wsource201 As Worksheet
    Dim cel_source_transaction As Range
    Dim cel_transaction_cible As Range
    Dim cel_source_saisie As Range
    Dim cel_source_execution As Range
    Dim i As Long
    Dim code_transaction As String
     
    Set wa = Workbooks("fichier source.xls") 'fichier source
    Set wb = Workbooks.Open("fichier cible.xlsx") 'fichier cible
    Set wcible = wb.Worksheets("tata")
    Set wsource201 = wa.Worksheets("titi")
     
    Const col_cible_saisie As Byte = 16     'numéro de la colonne Planning de saisie des tests
    Const col_cible_execution As Byte = 17  'numéro de la colonne entité
    Const col_source_Transaction As Byte = 3 'numéro de la colonne transaction AGL, équivalent à la colonne C
    Const Saisie As String = "Saisie"
     
        wsource201.Activate
        'Récupération du code de transaction dans le fichier source (Planification des tests Neos.xls)
        For i = 3 To 2000           '2000 nombre de lignes max du fichier source
            code_transaction = wsource201.Cells(i, col_source_Transaction).Value
            'Récupération du code de transaction dans le fichier cible (dans la première colonne)
            Set cel_transaction_cible = wcible.Range("H2:H5000").Find(What:=code_transaction, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns)
            If Not cel_transaction_cible Is Nothing Then
                'Récupération de la colonne où la chaine de caractères "Saisie" a été saisie dans le fichier source _
                (Planification des tests Neos.xls)
                Set cel_source_transaction = ActiveSheet.UsedRange.Rows(i)
                Set cel_source_saisie = cel_source_transaction.Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole)
                If Not cel_source_saisie Is Nothing Then
                    'Mise à jour des dates de saisie, dans le fichier (cible) de transactions
                    wcible.Cells(cel_transaction_cible.Row, col_cible_saisie).Value = wsource201.Cells(2, cel_source_saisie.Column).Value
                Else
                    wcible.Cells(cel_transaction_cible.Row, col_cible_saisie).Value = ""
                End If
                'Récupération de la colonne où les chaines de caractères "Exec" ou "Livr" ont été saisies dans le fichier source _
                (Planification des tests Neos.xls)
                Set cel_source_execution = cel_source_transaction.Find(What:="Exec", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns)
                If Not cel_source_execution Is Nothing Then
                    'Mise à jour des dates d'éxecution , dans le fichier (cible) de transactions
                    wcible.Cells(cel_transaction_cible.Row, col_cible_execution).Value = wsource201.Cells(2, cel_source_execution.Column).Value
                Else
                    Set cel_source_execution = cel_source_transaction.Find(What:="livr", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns)
                    If Not cel_source_execution Is Nothing Then
                        wcible.Cells(cel_transaction_cible.Row, col_cible_execution).Value = wsource201.Cells(2, cel_source_execution.Column).Value
                    Else
                        wcible.Rows(cel_transaction_cible.Row).Interior.Color = RGB(255, 255, 0) 'jaune
                    End If
                End If
            End If
        Next
    Application.ScreenUpdating = True
    MsgBox ("Fin de traitement")
    Set wcible = Nothing
    Set wsource201 = Nothing
    Set wa = Nothing
    Set wb = Nothing
    End Sub
    Cordialement.

  12. #12
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Un grand merci
    Merci bbil et gFZT82 et tous les autres pour votre aide!

    il fallait vraiment faire attention à quelle feuille je me réferais.

    En activant l'ancienne feuille après l'ouverture de la nouvelle pour le find, ça marchait mieux!
    La méthode de l'exécution pas à pas (F8) est d'une grande aide, ainsi que vos commentaires avisés.

    Cordialement
    Amine

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

Discussions similaires

  1. [XL-2007] Un « find » qui ne renvoie pas un range ?
    Par GroFlo dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 20/10/2014, 10h00
  2. [VBA - Excel - Word] Problème avec Range(Cells(1,1),Cells(10,10))
    Par Tanoffy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/10/2014, 11h07
  3. [Compiler] Ref Cell From Non Cell
    Par harmonips dans le forum MATLAB
    Réponses: 7
    Dernier message: 13/02/2012, 13h41
  4. Cells(1,1) = textbox1 (vide) place quoi dans la cellule ? Pas convaincu
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 14/04/2008, 14h54
  5. VBA Access : Fonction find qui ne marche pas
    Par leeloo35 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/02/2008, 16h56

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