Microsoft 365 Macro indique qualificateur incorrect

BEOS

XLDnaute Nouveau
Bonjour. Je vous affiche mon code. En l'éxécutant j'ai une erreur compilation: qualificateur incorrect. Pourriez-vous m'aider s'il vous plait?
Merci

Sub test()

Dim j As Integer, i As Integer, lig As Integer, dlg As Integer, ws As Worksheet
With Sheets("Récap")
dlg = .Cells.Find("*", LookIn:=xlValues).Row + 1
If dlg = 1 Then dlg = 2
.Range("A2:C" & dlg).ClearContents
dlg = 0
End With
With Sheets("Source")
For j = .Range("H" & .Rows.Count).End(xlUp).Row To 2 Step -1
For Each ws In ThisWorkbook.Worksheets
If ws.CodeName = "Feuil1" Or ws.CodeName = "Feuil2" Or ws.CodeName = "Feuil3" Then
On Error Resume Next
lig = ws.CodeName.Cells.Find(.Range("H" & j), LookIn:=xlValues, lookat:=xlWhole).Row
If lig > 0 Then
dlg = ws.CodeName.Cells.Find("*", LookIn:=xlValues).Row + 1
ws.CodeName.Range("A" & i & ":B" & i).Copy Sheets("Récap").Range("A" & dlg)
ws.CodeName.Range("D" & i).Copy Sheets("Récap").Range("C" & dlg)
End If
End If
Next ws
Next j
End With
End Sub
 

pierrejean

XLDnaute Barbatruc
Bonjour
A tester:
VB:
On Error Resume Next
lig = ws.Cells.Find(.Range("H" & j), LookIn:=xlValues, lookat:=xlWhole).Row
If lig > 0 Then
dlg = ws.Cells.Find("*", LookIn:=xlValues).Row + 1
ws.Range("A" & i & ":B" & i).Copy Sheets("Récap").Range("A" & dlg)
ws.Range("D" & i).Copy Sheets("Récap").Range("C" & dlg)
End If
 

BEOS

XLDnaute Nouveau
Bonjour et merci pour votre retour.
Il m'affiche erreur d'éxécution 91: ariable objet ou variable de bloc with non définie.

L'erreur est entre ces deux lignes:
dlg = .Cells.Find("*", LookIn:=xlValues).Row + 1
If dlg = 1 Then dlg = 2
 

soan

XLDnaute Barbatruc
Bonjour BEOS, pierrejean,

les 2 lignes de code de ton post #4 sont dans le début du code de ton post #1 ;
d'après moi, l'erreur 91 se produit car la feuille "Récap" n'est pas trouvée ;
c'est peut-être "Recap" ? ou peut-être que "Récap" manque réellement ?

de toute façon, tu devrais tester le code VBA proposé par pierrejean : post #2.


soan
 

pierrejean

XLDnaute Barbatruc
Re
Lorsque l'on utilise FInd ,il faut traiter le cas ou il n'y a pas de résultat
exemple
VB:
set c = .Cells.Find("*", LookIn:=xlValues)
if not c is nothing then
  dlg=c.row
  If dlg = 1 Then dlg = 2
else
 msgbox("pas trouvé)")
 exit sub
end if
 

soan

XLDnaute Barbatruc
@pierrejean

mon post #5 est par rapport à l'erreur 91 :

« 91: variable objet ou variable de bloc with non définie. »

effectivement, pour le .Find, il faut différencier selon qu'un résultat est trouvé ou non ;
cependant, je suis étonné par une recherche avec le caractère « * » : n'est-il pas
comme le joker « * » du DOS = n'importe quelle suite de caractères ? si oui,
la recherche aboutira forcément, non ? je sais qu'on peut mettre devant * un autre
caractère pour indiquer qu'on cherche le caractère littéral « * », sans qu'il soit
compris comme un joker, mais j'ai oublié lequel ; peut-être un tilde ? « ~ »

pour :
msgbox("pas trouvé)") pourquoi des parenthèses ?
c'est plus simple comme ceci :
MsgBox "pas trouvé"

soan
 

BEOS

XLDnaute Nouveau
@pierrejean @soan

On aurait donc ceci comme code ?
Parce que le déboggage s'arrête à la ligne set c et j'ai une erreur d'éxécution 9 m'indiquant que l'indice n'appartient pas à la selection à partir de la ligne en gras alors que la feuille se nomme bien "Récap"

Sub test()

Dim j As Integer, i As Integer, lig As Integer, dlg As Integer, ws As Worksheet
With Sheets("Récap")
Set c = .Cells.Find("*", LookIn:=xlValues)
If Not c Is Nothing Then
dlg = c.Row
If dlg = 1 Then dlg = 2
Else
MsgBox ("pas trouvé")
Exit Sub
End If
With Sheets("IntuneWindowsDevices14092020")
For j = .Range("H" & .Rows.Count).End(xlUp).Row To 2 Step -1
For Each ws In ThisWorkbook.Worksheets
If ws.CodeName = "Feuil1" Or ws.CodeName = "Feuil2" Or ws.CodeName = "Feuil3" Then
On Error Resume Next
lig = ws.Cells.Find(.Range("H" & j), LookIn:=xlValues, lookat:=xlWhole).Row
If lig > 0 Then
dlg = ws.Cells.Find("*", LookIn:=xlValues).Row + 1
ws.Range("A" & i & ":B" & i).Copy Sheets("Récap").Range("A" & dlg)
ws.Range("D" & i).Copy Sheets("Récap").Range("C" & dlg)
End If
End If
Next ws
Next j
End With
End With
End Sub
 

BEOS

XLDnaute Nouveau
J'ai une macro qui fonctionne mais qui ne fait absolument rien @soan @pierrejean

Je vais vous expliquer ce que je voudrais traiter et ensuite coller la macro



Les feuilles contenant les données à rechercher sont "Feuil1", "Feuil2" et "Feuil3".

La feuille "Source" est celle contenant les resultats cherchés dans la colonne H

Dans les 3 premières feuilles il y a des colonnes différentes mais une eule d'entre eles contient les données à rechercher (ce sont à chaque fois des adresses mail):

Dans la feuille "Feuil1", c'est la colonne D qui contient les adresses mail

Dans la feuille "Feuil2" c'est la colonne U qui contient les adresses mail

Dans "Feuil3" c'est la colonne K qui contient les adresses mail

Le but est donc de comparer ces adresses mails à celles de la feuille "Source" en colonne H. Si une adresse de meme valeur est retrouvée alors recopier les valeurs des colonnes A, B et D de la même feuille "Source" dans la feuille "Récap"

je voudrais que la zone de collage de la feuille "Récap" soit vidée (si elle contient les données) avant de lancer la macro et faire un collage par ordre alphabetique de tous les résultats provenant de la feuille "Source"

Je ne sais pas si c'est assez clair. Je vous colle la macro dans le message suivant
 

BEOS

XLDnaute Nouveau
Sub test()

Dim j As Integer, i As Integer, lig As Integer, dlg As Integer, ws As Worksheet
With Sheets("Récap")
Set c = .Cells.Find("*", LookIn:=xlValues)
If Not c Is Nothing Then
dlg = c.Row
If dlg = 1 Then dlg = 2

With Sheets("Source")
For j = .Range("H" & .Rows.Count).End(xlUp).Row To 2 Step -1
For Each ws In ThisWorkbook.Worksheets
If ws.CodeName = "Feuil1" Or ws.CodeName = "Feuil2" Or ws.CodeName = "Feuil3" Then
On Error Resume Next
lig = ws.Cells.Find(.Range("H" & j), LookIn:=xlValues, lookat:=xlWhole).Row
If lig > 0 Then
dlg = ws.Cells.Find("*", LookIn:=xlValues).Row + 1
ws.Range("A" & i & ":B" & i).Copy Sheets("Récap").Range("A" & dlg)
ws.Range("D" & i).Copy Sheets("Récap").Range("C" & dlg)
End If
End If
Next ws
Next j
End With
End If
End With
End Sub
 

soan

XLDnaute Barbatruc
tu as écrit : « J'ai une macro qui fonctionne mais qui ne fait absolument rien » ;
c'est peut-être une macro paresseuse ? ou elle s'est mise en grève car tu ne la
paye pas assez ? ou elle est confinée à cause du coronavirus ?

tu as bien décrit ce qu'il faut faire, et c'est très clair ; mais un petit fichier exemple,
avec plusieurs infos fictives, serait vraiment le bienvenu ! ;)


soan
 

soan

XLDnaute Barbatruc
Bonsoir BEOS,

* note que la feuille "Récap" est vide (à part la ligne d'en-têtes)

* va sur la feuille "Source" ; fais Ctrl e ➯ travail effectué ! :)
et tu es automatiquement sur la feuille "Récap".

en fait, si tu avais fait Ctrl e depuis cette feuille, ou depuis
une des autres feuilles à gauche de "Source" ("Feuil1" ;
"Feuil2" ; ou "Feuil3"), le résultat aurait été identique.

edit du 04/11/20 à 17:24 : j'ai modifié le fichier joint.


soan
 

Pièces jointes

  • Test.xlsm
    26.9 KB · Affichages: 0
Dernière édition:

Discussions similaires

Haut Bas