Sumifs - erreur 1004 - mails
Bonjour à tous, c'est certes mon premier message mais je potasse depuis de long mois maintenant diverses sites d'aide VBA, dont le votre qui est le seul auquel je me suis inscrit pour avoir une réponse à mon problème.
Le voici :
L'objectif est d'avoir un fichier, appelé BE_compil imputation 2018, qui s'ouvre tout seul a date fixe (2 fois par semaine, une seule d'implémenté dans le code) et qui peut recevoir l'intégralité des lignes d'un autre fichier, *NOM Prenom Imputation 2018* (Ex: JEANJEAN Fabrice Imputation 2018) en lançant une macro, puis passe au fichier de la personne suivante, qui est a l'emplacement (N-1)+1
ex:
C:compil
C:compil/JEANJEAN Fabrice
C:compil/JEANJEAN Fabrice/JEANJEAN Fabrice Imputation 2018.xlsx
C:compil/JUJU Arnaud
C:compil/JUJU Arnaud/JUJU Arnaud Imputation 2018.xls
etc
Cette macro permet également d'analyser chaque fichier d'imputation pour qu'un mail s'envoi à la personne si et seulement si son compteur d'heure pour une semaine est inférieur à 35h avec les semaines qu'il doit corriger/remplir. Je joins un fichier lambda pour illustrer bien sûr.
Par souci de compréhension je formule différemment :
Tout les vendredis et lundi à 17h, lancement du code mail_compil.
Le code demande si oui ou non on fait le test et envoi de mail
Si oui: Le code demande si oui ou non on fait la compil
Si oui:
test de tout les fichiers individuel s'il y a 35h par semaine
si oui: ok
si non: note du N° de semaine
ajouter dans compil chaque ligne de la semaine demandé
compteur du nombre de personne en règle
envoi mail a la personne avec les semaines pas ok
si non:
test de tout les fichiers individuel s'il y a 35h par semaine
si oui: ok
si non: note du N° de semaine
compteur du nombre de personne en règle
envoi mail a la personne avec les semaines pas ok
Renvoi d'un msgbox qui indique combien de mail sont envoyé, et combien de personnes ont un bon fichier.
Et enfin, voici le code en lui même, je ne vous joins pas les fonctions d'envoie de mail qui marche sans problème, ou celle de lancer_heure qui correspond a l'ouverture du fichier automatiquement.
La ligne qui définit la variable ok_pasok avec le sumif est celle qui pose problème, "erreur 1004 erreur définie par l'application ou par l'objet".
Je me doute qu'il y aura encore d'autres erreurs dans mon code, mais ne pouvant lancer plus loin la vérification... je bloque.
Public Sub mail_compil()
Dim question As String
Dim question1 As String
Dim chemin As String
Dim fichier As Object
Dim Dossier As Object
Dim fso As Object
Dim repertoire As Object
Dim nom_prenom As String
Dim ok_pasok As String
Dim num_sem1 As String
Dim num_sem2 As String
Dim num_sem3 As String
Dim num_sem4 As String
Dim num_sem5 As String
Dim num_sem6 As String
Dim num_sem7 As String
Dim num_sem8 As String
Dim num_sem9 As String
Dim num_sem10 As String
Dim num_sem11 As String
Dim num_sem12 As String
Dim num_sem13 As String
Dim derlig As Double
Dim derligcompil As Double
Dim indiq_mois As String
Dim recap_sem As String
Dim bon_compil As Integer
Dim bad_compil As Integer
Dim sujet As String
Dim contenu As String
Dim email As String
Dim nbLen As Integer
Dim nbInstr As Integer
Dim strNom As String
Dim strPrenom As String
bon_compil = 0
bad_compil = 0
Application.ScreenUpdating = False
chemin = "V:\Cyril\Travail a faire\mails compils remi\"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Dossier = fso.GetFolder(chemin)
question = InputBox("Bonjour Rémi. Veux tu envoyer des mails pour les Imputations ? oui ou non")
If question = "oui" Then
question1 = InputBox("Bien. Voudras tu également remplir ton fichier BE_COMPIL imputation 2018 ? oui ou non")
If question1 = "oui" Then
For Each repertoire In Dossier.subfolders
nom_prenom = Right(repertoire.Path, Len(repertoire.Path) - Len(chemin))
nbLen = Len(nom_prenom)
nbInstr = InStr(1, nom_prenom, " ")
strNom = Left(nom_prenom, nbInstr - 1)
strPrenom = Right(nom_prenom, nbLen - nbInstr)
Workbooks.Open (chemin & nom_prenom & "\" & nom_prenom & " Imputation 2018.xlsx")
Windows("BE__COMPIL Imputation 2018.xlsm").Activate
ActiveWorkbook.Worksheets("NOM Prénom 2018").Activate
derligcompil = Cells(Rows.Count, 11).End(xlUp).Row
Windows(nom_prenom & " Imputation 2018.xlsx").Activate
ActiveWorkbook.Worksheets(nom_prenom & " 2018").Activate
num_sem = ""
recap_sem = ""
num_sem1 = ""
num_sem2 = ""
num_sem3 = ""
num_sem4 = ""
num_sem5 = ""
num_sem6 = ""
num_sem7 = ""
num_sem8 = ""
num_sem9 = ""
num_sem10 = ""
num_sem11 = ""
num_sem12 = ""
num_sem13 = ""
derlig = Cells(Rows.Count, 10).End(xlUp).Row
For I = 2 To derlig
Range("A2:Q2").Select
Selection.Copy
Windows("BE__COMPIL Imputation 2018.xlsm").Activate
ActiveWorkbook.Worksheets("NOM Prénom 2018").Activate
ActiveSheet.Range("C" & derligcompil + I - 1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows(nom_prenom & " imputation 2018").Activate
ActiveWorkbook.Worksheets(nom_prenom & " 2018").Activate
Range("A1").Select
For v = 1 To 12
indiq_mois = "S0"
If v > 9 Then
indiq_mois = "S"
End If
If Cells(I, 10) <> "" And v = (Right(Cells(I, 10), 2) + 0) And Right(Cells(I, 10), 2) + 0 < DatePart("ww", Now(), vbMonday) Then
ok_pasok = WorksheetFunction.SumIfs(ThisWorkbook.ActiveSheet.Range(Cells(2, 17), Cells(46, 17)), ThisWorkbook.ActiveSheet.Range(Cells(2, 10), Cells(31, 10)), (indiq_mois & v))
If ok_pasok < 35 Then
Select Case Right(Cells(I, 10), 2)
Case Is = "01"
num_sem1 = "Semaine 1"
Case Is = "02"
num_sem2 = "Semaine 2"
Case Is = "03"
num_sem3 = "Semaine 3"
Case Is = "04"
num_sem4 = "Semaine 4"
Case Is = "05"
num_sem5 = "Semaine 5"
Case Is = "06"
num_sem6 = "Semaine 6"
Case Is = "07"
num_sem7 = "Semaine 7"
Case Is = "08"
num_sem8 = "Semaine 8"
Case Is = "09"
num_sem9 = "Semaine 9"
Case Is = "10"
num_sem10 = "Semaine 10"
Case Is = "11"
num_sem11 = "Semaine 11"
Case Is = "12"
num_sem12 = "Semaine 12"
Case Is = "13"
num_sem13 = "Semaine 13"
End Select
End If
End If
Next v
Next I
recap_sem = num_sem1 & vbCrLf & num_sem2 & vbCrLf & num_sem3 & vbCrLf & num_sem4 & vbCrLf & num_sem5 & vbCrLf & num_sem6 & vbCrLf & num_sem7 & vbCrLf & num_sem8 & vbCrLf & num_sem9 & vbCrLf & num_sem10 & vbCrLf & num_sem11 & vbCrLf & num_sem12 & vbCrLf & num_sem13
If recap_sem = "" Then
bon_compil = bon_compil + 1
Else
bad_compil = bad_compil + 1
End If
sujet = "Tableau d'imputation"
email = "remi.sanfins@fmprojet.net"
contenu = "Bonjour, " & vbCrLf & "il faudrait completer ton tableau d'imputation pour la(les) semaine(s) suivante(s) :" & vbCrLf & recap_sem & "Cordialement," & vbCrLf & "Rémi SANFINS"
Call EnvoyerEmail(sujet, email, contenu)
Next
Else
For Each repertoire In Dossier.subfolders
nom_prenom = Right(repertoire.Path, Len(repertoire.Path) - Len(chemin))
nbLen = Len(nom_prenom)
nbInstr = InStr(1, nom_prenom, " ")
strNom = Left(nom_prenom, nbInstr - 1)
strPrenom = Right(nom_prenom, nbLen - nbInstr)
Workbooks.Open (chemin & nom_prenom & "\" & nom_prenom & " Imputation 2018.xls")
Windows("BE__COMPIL Imputation 2018.xlsm").Activate
ActiveWorkbook.Worksheets("NOM Prénom 2018").Activate
derligcompil = Cells(Rows.Count, 11).End(xlUp).Row
Windows(nom_prenom & " imputation 2018").Activate
ActiveWorkbook.Worksheets(nom_prenom).Activate
num_sem = ""
recap_sem = ""
num_sem1 = ""
num_sem2 = ""
num_sem3 = ""
num_sem4 = ""
num_sem5 = ""
num_sem6 = ""
num_sem7 = ""
num_sem8 = ""
num_sem9 = ""
num_sem10 = ""
num_sem11 = ""
num_sem12 = ""
num_sem13 = ""
derlig = Cells(Rows.Count, 10).End(xlUp).Row
For I = 2 To derlig
Range("B2:Q2").Select
Selection.Copy
Windows("BE__COMPIL Imputation 2018.xlsm").Activate
Worksheets("NOM Prénom 2018").Activate
Range(Cells(derligcompil + I, 3)).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows(nom_prenom & " imputation 2018").Activate
ActiveWorkbook.Worksheets(nom_prenom).Activate
For v = 1 To 12
indiq_mois = "S0"
If v > 9 Then
indiq_mois = "S"
End If
If Cells(I, 10) <> "" And v = (Right(Cells(I, 10), 2) + 0) And Right(Cells(I, 10), 2) + 0 < DatePart("ww", Now(), vbMonday) Then
ok_pasok = WorksheetFunction.SumIfs(ThisWorkbook.ActiveSheet.Range(Cells(2, 17), Cells(46, 17)), ThisWorkbook.ActiveSheet.Range(Cells(2, 10), Cells(46, 10)), (indiq_mois & v))
If ok_pasok < 35 Then
Select Case Right(Cells(I, 10), 2)
Case Is = "01"
num_sem1 = "Semaine 1"
Case Is = "02"
num_sem2 = "Semaine 2"
Case Is = "03"
num_sem3 = "Semaine 3"
Case Is = "04"
num_sem4 = "Semaine 4"
Case Is = "05"
num_sem5 = "Semaine 5"
Case Is = "06"
num_sem6 = "Semaine 6"
Case Is = "07"
num_sem7 = "Semaine 7"
Case Is = "08"
num_sem8 = "Semaine 8"
Case Is = "09"
num_sem9 = "Semaine 9"
Case Is = "10"
num_sem10 = "Semaine 10"
Case Is = "11"
num_sem11 = "Semaine 11"
Case Is = "12"
num_sem12 = "Semaine 12"
Case Is = "13"
num_sem13 = "Semaine 13"
End Select
End If
End If
Next v
Next I
recap_sem = num_sem1 & vbCrLf & num_sem2 & vbCrLf & num_sem3 & vbCrLf & num_sem4 & vbCrLf & num_sem5 & vbCrLf & num_sem6 & vbCrLf & num_sem7 & vbCrLf & num_sem8 & vbCrLf & num_sem9 & vbCrLf & num_sem10 & vbCrLf & num_sem11 & vbCrLf & num_sem12 & vbCrLf & num_sem13
If recap_sem = "" Then
bon_compil = bon_compil + 1
Else
bad_compil = bad_compil + 1
End If
Next
End If
End If
Set fso = Nothing
Application.ScreenUpdating = True
Call lancer_heure
MsgBox ("Le travail a été fait Rémi. Il y a " & bon_compil & " de personnes qui ont bien mis à jour leurs imputations")
MsgBox ("Et " & bad_compil & " de personnes qui ont été relancé(s) par mail")
End SubJe vous lierais demain matin à la première heure pour les éventuelles questions. J'aurais essayé d'être le plus exhaustif possible !
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Dans cette utilisation, "Range" est une fonction et non la propriété d'une feuille.
ci-dessous correction :
With ThisWorkbook.ActiveSheet
ok_pasok = WorksheetFunction.SumIfs(Range(.Cells(2, 17), .Cells(46, 17)), Range(.Cells(2, 10), .Cells(46, 10)), (indiq_mois & v))
End WithBonjour Thev,
merci de ta réponse cela marche. Le code continu ! ... et s'arrête pour une histoire de fichier xls et non xlsx.
Mais ça c'est une autre histoire. Et une autre question.
Honnêtement avec la tête dans le guidon et l'ampleur des actions a faire dans le code ce n'était pas une mince affaire... J'attend encore quelques tests pour être certain et je marquerais le sujet comme clos
Mauvaise nouvelle.
Cela ne marche pas avec
With ThisWorkbook.ActiveSheet
ok_pasok = WorksheetFunction.SumIfs(Range(.Cells(2, 17), .Cells(46, 17)), Range(.Cells(2, 10), .Cells(46, 10)), (indiq_mois & v))
End WithCela me fait 0 comme résultat au lieu du résultat normal. l'activesheet renvoie t'il à mon fichier compil ou à mon fichier JEANJEAN ? Je ne vois pas quel autre type d'erreur cela pourrait être
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Etant donné que j'ai
Windows(nom_prenom & " imputation 2018").Activate
ActiveWorkbook.Worksheets(nom_prenom & " 2018").Activate
Range("A1").Selectavant, cela m'indique que c'est bien mon fichier JEANJEAN qui est activé, c'est le fichier qui contient le décompte d'heure.
Et donc le mystère reste entier..
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Si ton "Sumifs" se rapporte au fichier actif (fichier JEANJEAN), alors il faut utiliser "ActiveWorkbook" et npn "ThisWorkbook" qui n'est pas le fichier actif mais celui qui contient ton code.
With ActiveWorkbook.ActiveSheet
ok_pasok = WorksheetFunction.SumIfs(Range(.Cells(2, 17), .Cells(46, 17)), Range(.Cells(2, 10), .Cells(46, 10)), (indiq_mois & v))
End WithCette partie là marche nickel. Merci