Variable ou bloc

Bonjour

J'ai une erreur dans ce code que je n'arrive pas à trouvé :

Sub Justeallocation()

Dim plage As Range
Dim i As Integer

With Sheets("Effectif")

For i = 1 To 881                                                    'pour les lignes de 1 à 881

        If .Range("U" & i).Value = "49 €" Then

            Set plage = .Range("C" & i & ", D" & i & ",R" & i & ", U" & i) 'initialisation de cette plage

        End If

    Next i

End With

plage.Copy Destination:=Sheets("Argent de poche").Range("A3")  'copie de la plage effectif dans la feuille Argent de poche en A3

For i = 881 To 1 Step -1

    If Worksheets("Argent de poche").Cells(i, 2) = "" Then Worksheets("Argent de poche").Rows(i).Clear

Next i

    Sheets("Argent de poche").Visible = True
    Sheets("Argent de poche").Activate

ActiveSheet.Range("A1:G74").Select
ActiveWorkbook.EnvelopeVisible = True

    If Worksheets("Argent de poche").Cells(i, 2) = "" Then Worksheets("Argent de poche").Rows(i).Clear

With ActiveSheet.MailEnvelope

    .Introduction = "Bonjour. Veuillez trouver ci dessous le tableau des versements d'allocation à effectuer en faveur des jeunes du DAMA" 'le texte
    .Item.To = "o****.org" 'l'adresse
    .Item.cc = "m*****.org"
    .Item.Subject = "Argent de poche DAMA"
    .Item.Send

    Sheets("Argent de poche").Visible = False

End With

End Sub

En particulier sur la ligne

plage.Copy Destination:=Sheets("Argent de poche").Range("A3")

Merci de votre aide

Bonjour Theyoshi,

D'abord sur une boucle aussi importante de 880 lignes que va t'il se passer si tu rencontres plusieurs fois

If .Range("U" & i).Value = "49 €" Then

Par exemple sur la ligne 10, 35, et 880.

Ta plage ne gardera à la fin que la ligne 880.

Et puisque ta copie n' intervient qu'après la fin de la boucle tu auras omis plusieurs lignes concordantes à copier.

Merci de ta réponse X Cellus

Tout d'abord je réduis la zone de rechercher à 80 lignes, mais comment faire pour ne pas oublier les lignes valables ?

A nouveau,

Tu n'est pas obligé de réduire ta zone de recherches sauf à titre de test.

Mais il te faut placer cette ligne de code ci-dessous

c = c + 1
plage.Copy Destination:=Sheets("Argent de poche").Range("A" & 2 + c)  'copie de la plage effectif dans la feuille Argent de poche en A3

à l'intérieur de ta boucle juste en dessous de Set Plage.

Ainsi chaque fois que la condition sera vrai ("49 €") alors il y aura copie de la ligne en cours sur l'autre feuille.

A partir de la cellule A3 jusqu'aux cellules suivantes si plusieurs correspondances à 49 €.

Toujours cette erreur 91 variable objet ou variable de bloc with non définie ici

erreur 91 variable objet ou variable de bloc with non définie

Pourtant sur cette macro aucun souci

Sub Bonbusmensueltrimestriel()

Dim plage As Range
Dim i%
Dim DerniereLigne As Integer
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim Sourcewb As Workbook
Dim destwb As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim OutApp As Object
Dim OutMail As Object
Dim S As Shape
Dim sNomFic As String, sRep As String, WshShell As Object
Dim Destinataires(3) As String
Dim Sujet As String
Dim AccuseReception As Boolean

With Sheets("Effectif")

    For i = 1 To 881                                                    'pour les lignes de 1 à 881

        If .Range("AJ" & i).Value <> "Non pris en charge par le DAMA" Then

            If plage Is Nothing Then 'si la plage à copier est vide
                Set plage = .Range("C" & i & ", AH" & i & ":AI" & i) 'initialisation de cette plage

            Else 'sinon
                Set plage = Union(plage, .Range("C" & i & ", AH" & i & ", AI" & i)) 'la plage annexe les nouvelles cellules (ligne en cours)

            End If

        End If
    Next i

End With

plage.Copy Destination:=Sheets("Bus").Range("A5")  'copie de la plage effectif dans la feuille Bus en A5

For i = 881 To 1 Step -1

    If Worksheets("Bus").Cells(i, 2) = "" Then Worksheets("Bus").Rows(i).Clear

Next i

    Sheets("Bus").Visible = True
    Sheets("Bus").Activate

Range("A2").Value = ("Etablissement :")
Range("B2").Value = ("DAMA")
Range("A3").Value = ("Code analytique :")
Range("B3").Value = ("500")
Range("C3").Value = ("Nombre de bons :")
Range("D3").Value = Application.CountA([B5:B80])
    

Suite,

Mais ici c'est différent, pourquoi?

Else 'sinon
                Set plage = Union(plage, .Range("C" & i & ", AH" & i & ", AI" & i))

Vérifie avec ta ligne au dessus.

A nouveau,

Et surtout if Plage is Nothing alors que Plage n'est pas encore défini quand démarre la boucle.

Mets par exemple avant la boucle For

Set Plage = .Range("D1") où D1 (ou autre) représente une cellule vide.

Dans la seconde macro, je n'ai aucun soucis. Je ne comprends donc pas pourquoi si je limite les if à une seule condition, j'ai l'erreur 91

Bonjour Theyoshi,

Le souci ne vient pas du If dans ta première macro.

S'il trouve au moins une concordance tu pourras copier la Plage.

Mais s'il n'en trouve aucune...

plage.Copy Destination:=Sheets("Argent de poche").Range("A3")

Tu n'auras jamais défini Plage. Donc le programme sera incapable de copier de l'indéfinissable.

Donc soit tu définis comme indiqué Set Plage = une cellule vide. Et il te copiera une cellule vide, donc sans importance.

Soit tu modifies la macro par

if not Plage is Nothing then Plage.copy etc...

En faisant ainsi

With Sheets("Effectif")

    For i = 1 To 81                                                    'pour les lignes de 1 à 881

        If .Range("U" & i).Value = "49 €" Then

            If plage Is Nothing Then 'si la plage à copier est vide

            Set plage = .Range("C" & i & ", D" & i & ",Q" & i & ", R" & i & ", U" & i) 'initialisation de cette plage

            Else 'sinon

            Set plage = Union(plage, .Range("C" & i & ", D" & i & ",Q" & i & ", R" & i & ", U" & i)) 'la plage annexe les nouvelles cellules (ligne en cours)

            End If

        End If

    Next i

End With

plage.Copy Destination:=Sheets("Argent de poche").Range("A3")  'copie de la plage effectif dans la feuille Argent de poche en A3

For i = 81 To 1 Step -1

    If Worksheets("Argent de poche").Cells(i, 2) = "" Then Worksheets("Argent de poche").Rows(i).Clear

Next i

Cela ne change rien à l'erreur.

A nouveau,

La modification à faire est sur la première macro.

Celle que tu demandes qu'elle soit corrigée.

Si à chaque fois tu changes de macro, je vais pas toutes les tester...

Donc indique moi si après modif ta première macro fonctionne ou pas comme tu le souhaites.

Sinon poste un fichier définitif.

Et surtout c'est là qu'il faut changer

if not Plage is Nothing then Plage.copy etc...

C'est bien la même macro, j'ai réduit l'analyse de 881 à 81, inséré

 If plage Is Nothing Then 'si la plage à copier est vide

La seconde est juste mon modèle de base (fonctionnant) pour comparer.

Suite,

Relis bien ma réponse.

C'est uniquement si la Plage à copier n'est pas vide qu'il faut la copier.

Si cette Plage n'as pas été définie car la condition n'a pas été trouvée alors on ne copie pas la Plage.

Si par contre la condition a été trouvée au moins une fois alors la Plage est définie. Et à ce moment là elle peut être copiée.

End With

plage.Copy Destination:=Sheets("Argent de poche").Range("A3")  'copie de la plage effectif dans la feuille Argent de poche en A3

Donc change cette ligne ci-dessus.

JE te présente mes excuses, mais la je patauge. J'apprends en autodidacte la programmation entre deux accompagnements.

Concrètement, je dois faire quoi ?

Voici,

With Sheets("Effectif")

    For i = 1 To 81                                                    'pour les lignes de 1 à 881

        If .Range("U" & i).Value = "49 €" Then

            If plage Is Nothing Then 'si la plage à copier est vide

            Set plage = .Range("C" & i & ", D" & i & ",Q" & i & ", R" & i & ", U" & i) 'initialisation de cette plage

            Else 'sinon

            Set plage = Union(plage, .Range("C" & i & ", D" & i & ",Q" & i & ", R" & i & ", U" & i)) 'la plage annexe les nouvelles cellules (ligne en cours)

            End If

        End If

    Next i

End With

'Note: Ne copie la plage que si la condition "49 €" est trouvée au minimum dans une ligne et donc la plage a été définie.

If Not Plage is Nothing then plage.Copy Destination:=Sheets("Argent de poche").Range("A3")  'copie de la plage effectif dans la feuille Argent de poche en A3

For i = 81 To 1 Step -1

    If Worksheets("Argent de poche").Cells(i, 2) = "" Then Worksheets("Argent de poche").Rows(i).Clear

Next i

Plus d'erreur mais une page vierge.

A nouveau,

Soit tu n'as pas de "49 €" donc il ne copiera pas de ligne.

Soit ta ligne de code Union, n'est pas appropriée pour effectuer cela. Ce que je crois.

Je préfères que la copie se fasse ligne par ligne comme indiqué dans un message précédent.

Donc qu'elle fasse partie de la boucle. Et non en dehors.

J'ai résolu, tu avais raison, la cellule avait 49 sous format numéraire, donc sans €.

Par contre les lignes vides ne sont pas supprimés, as tu encore du temps à m'accorder ?

Au final , j'ai contourné, merci de ta précieuse aide.

Rechercher des sujets similaires à "variable bloc"