Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/11/2011, 15h55   #1
Invité de passage
 
Homme amine
Consultant informatique
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme amine
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 1
Points : 1
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 :
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.
bibiman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 17h20   #2
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
D'abord, ligne 15
Code :
ws201.Range(ws201.Cells(i, 11), ws201.Cells(i, 100))...
où quelque part avant, il fallait instancier ws201
Code :
Set ws201=Thisworkbook.worksheets("Nom de la Feuille")
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/11/2011, 20h22   #3
Invité de passage
 
Homme amine
Consultant informatique
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme amine
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 1
Points : 1
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 :
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
bibiman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 20h55   #4
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
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 :
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.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 20h57   #5
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Avec Find, il faut toujours garder en tête l'éventualité où rien n'est trouvé.

Par exemple
Code :
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
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 21h46   #6
Invité de passage
 
Homme amine
Consultant informatique
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme amine
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 1
Points : 1
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
Type de fichier : xlsx fichier cible.xlsx (372,3 Ko, 2 affichages)
Type de fichier : xls fichier source.xls (64,5 Ko, 4 affichages)
bibiman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 21h49   #7
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
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 ..)
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 22h04   #8
Invité de passage
 
Homme amine
Consultant informatique
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme amine
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 1
Points : 1
Code :
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 :
col_source_saisie = Rows(i).Find(What:=Saisie, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
Code :
col_source_execution = Rows(i).Find(What:="Exec", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns).Column
à savoir que j'écrive
Code :
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.
bibiman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 22h17   #9
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
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...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/11/2011, 22h40   #10
Invité de passage
 
Homme amine
Consultant informatique
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme amine
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 1
Points : 1
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.
bibiman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 00h12   #11
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
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 :
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.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2011, 13h45   #12
Invité de passage
 
Homme amine
Consultant informatique
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme amine
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 1
Points : 1
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
bibiman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h34.


 
 
 
 
Partenaires

Hébergement Web