Bonjour,
Sur une petite macro sur laquelle je planche depuis un long moment (je débute et suis au passage preneur de conseils), je suis confronté à une erreur que je ne saisis pas du tout "Erreur d'exécution 1004 - Erreur définie par l'application".
J'ai surligné la ligne fautive en rouge. En vert un bout de code très similaire et qui pourtant fonctionne parfaitement... C'est là que je ne comprends pas...
Confer ci-dessous pour repérer le code, j'ai essayé de les marquer comme j'ai pu...
ThisWorkbook.Worksheets("Tâches").Range("J2").Formula = Consommation & "="
ThisWorkbook.Worksheets("Tâches").Range("L2").Formula = Rafreest & "=SI(ET("
Pour décrire rapidement les fonctions remplies par ces deux morceau de code, il s'agit de deux formules qui s'éditent successivement pour opérer une addition ou un contrôle d'une même cellule sur plusieurs onglets différents.
Nota : NomRes, PreRes, MelRes et Trigramme sont des valeurs issues d'un formulaire sur lequel est situé le bouton déclencheur de la macro.
En fait, par tests successifs, c'est le signe "=" qui pose problème. Si je le retire ça marche, dès qu'il est présent ça ne marche plus. Même s'il est seul.
Pourtant dans la partie de code en vert, il y a un signe "=" et cela fonctionne...
EDIT : Fichier joint + explications sur le classeur Excel :
On considère 3+x onglets :
L'onglet 1 "Tableau des ressources" représente un tableau avec une ligne par personne effectuant un rapport intermédiaire de gestion.
L'onglet 2 "Tâches" représente le bilan de tous les rapports de gestion. Une ligne représente une "tâche étudiée". Deux colonnes sont impactées ici par la macro :
- Les cellules en colonne J du tableau "tâches" font la simple addition des cellules en G des onglets de rapports intermédiaires.
- Les cellules en L vérifient qu'au moins une cellule correspondante à la tâche étudiée a été saisie dans l'un des onglets de rapports intermédiaires.
Les onglets 3 à X "Autres" etc.sont des rapports de gestion remplis par des personnes. Il y a un onglet par personne remplissant un rapport de gestion (donc 1 à X personnes). Il y a une ligne par tâche étudiée.
A quoi sert la macro ? A rajouter des onglets de rapports intermédiaire automatiquement, sur le modèle de l'onglet 3 et donc modifier le le bilan des rapports de gestion (onglet 2) de sorte qu'il incorpore dans ses calculs les nouveaux onglets ajoutés.
Par avance merci de vos éclairages !
Ludovic
Sur une petite macro sur laquelle je planche depuis un long moment (je débute et suis au passage preneur de conseils), je suis confronté à une erreur que je ne saisis pas du tout "Erreur d'exécution 1004 - Erreur définie par l'application".
J'ai surligné la ligne fautive en rouge. En vert un bout de code très similaire et qui pourtant fonctionne parfaitement... C'est là que je ne comprends pas...
Confer ci-dessous pour repérer le code, j'ai essayé de les marquer comme j'ai pu...
ThisWorkbook.Worksheets("Tâches").Range("J2").Formula = Consommation & "="
ThisWorkbook.Worksheets("Tâches").Range("L2").Formula = Rafreest & "=SI(ET("
Pour décrire rapidement les fonctions remplies par ces deux morceau de code, il s'agit de deux formules qui s'éditent successivement pour opérer une addition ou un contrôle d'une même cellule sur plusieurs onglets différents.
Nota : NomRes, PreRes, MelRes et Trigramme sont des valeurs issues d'un formulaire sur lequel est situé le bouton déclencheur de la macro.
Code:
Private Sub CommandButton1_Click()
Dim LastRes As Object
Dim Ressource As String
Dim Consommation As String
Dim Rafreest As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'Retrait des filtres de tableaux pouvant générer des erreurs
ThisWorkbook.Sheets("Tâches").Range("A1").End(xlDown).AutoFilter Field:=1, Criteria1:="<>""""", Operator:=xlAnd
ThisWorkbook.Sheets("Tâches").Range("A1").End(xlDown).AutoFilter
'Création de l'entrée dans le tableau ressources
Set LastRes = Sheets("Tableau des ressources").Range("A1").End(xlDown)
LastRes.Offset(1, 0).EntireRow.Insert
LastRes.Offset(1, 0).Value = LastRes.Offset(0, 0).Value + 1
LastRes.Offset(1, 2).Value = NomRes.Value
LastRes.Offset(1, 3).Value = PreRes.Value
LastRes.Offset(1, 1).Value = Trigramme
If CheckBox1 = True Then
LastRes.Offset(1, 4).Value = "Externe"
Else
LastRes.Offset(1, 4).Value = "Interne"
End If
LastRes.Offset(1, 6).Value = MelRes.Value
LastRes.Offset(1, 5).Value = ComboBox1.Value
LastRes.Offset(1, 7).Formula = LastRes.Offset(0, 7).Formula
'Copie de l'onglet Autres pour insertion de l'onglet au nom de la ressource nouvellement créée
Sheets("Autres").Copy Before:=Sheets("Autres")
Sheets("Autres (2)").Range("W3:CE65500").ClearContents
Sheets("Autres (2)").Name = Trigramme
'Création de la formule en J (tableau des tâches)
ThisWorkbook.Worksheets("Tâches").Range("J2").ClearContents
Consommation = ThisWorkbook.Worksheets("Tâches").Range("J2").Formula
'CODE FONCTIONNANT
ThisWorkbook.Worksheets("Tâches").Range("J2").Formula = Consommation & "="
For i = 2 To ThisWorkbook.Worksheets("Tableau des ressources").Range("B1").End(xlDown).Row
Consommation = ThisWorkbook.Worksheets("Tâches").Range("J2").Formula
Ressource = ThisWorkbook.Worksheets("Tableau des ressources").Range("B" & i)
ThisWorkbook.Worksheets("Tâches").Range("J2").Formula = Consommation & "+" & Ressource & "!G3"
Next i
'Création de la formule en L (tableau des tâches)
ThisWorkbook.Worksheets("Tâches").Range("L2").ClearContents
Rafreest = ThisWorkbook.Worksheets("Tâches").Range("L2").Formula
'CODE NE FONCTIONNANT PAS
ThisWorkbook.Worksheets("Tâches").Range("L2").Formula = Rafreest & "=SI(ET("
For j = 2 To ThisWorkbook.Worksheets("Tableau des ressources").Range("B1").End(xlDown).Row
Rafreest = ThisWorkbook.Worksheets("Tâches").Range("L2").Formula
Ressource = ThisWorkbook.Worksheets("Tableau des ressources").Range("B" & j)
ThisWorkbook.Worksheets("Tâches").Range("L2").Formula = Rafreest & Ressource & "!W3="""";"
Next j
Rafreest = ThisWorkbook.Worksheets("Tâches").Range("L2").Formula
ThisWorkbook.Worksheets("Tâches").Range("L2").Formula = Rafreest & ");"""";"
For k = 2 To ThisWorkbook.Worksheets("Tableau des ressources").Range("B1").End(xlDown).Row
Rafreest = ThisWorkbook.Worksheets("Tâches").Range("L2").Formula
Ressource = ThisWorkbook.Worksheets("Tableau des ressources").Range("B" & k)
ThisWorkbook.Worksheets("Tâches").Range("L2").Formula = Rafreest & Ressource & "!W3+"
Next k
Rafreest = ThisWorkbook.Worksheets("Tâches").Range("L2").Formula
ThisWorkbook.Worksheets("Tâches").Range("L2").Formula = Rafreest & ")"
Application.ScreenUpdating = True
Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
Sheets("Tâches").Range("A1").End(xlDown).AutoFilter
Unload Addrsrc
End Sub
En fait, par tests successifs, c'est le signe "=" qui pose problème. Si je le retire ça marche, dès qu'il est présent ça ne marche plus. Même s'il est seul.
Pourtant dans la partie de code en vert, il y a un signe "=" et cela fonctionne...
EDIT : Fichier joint + explications sur le classeur Excel :
On considère 3+x onglets :
L'onglet 1 "Tableau des ressources" représente un tableau avec une ligne par personne effectuant un rapport intermédiaire de gestion.
L'onglet 2 "Tâches" représente le bilan de tous les rapports de gestion. Une ligne représente une "tâche étudiée". Deux colonnes sont impactées ici par la macro :
- Les cellules en colonne J du tableau "tâches" font la simple addition des cellules en G des onglets de rapports intermédiaires.
- Les cellules en L vérifient qu'au moins une cellule correspondante à la tâche étudiée a été saisie dans l'un des onglets de rapports intermédiaires.
Les onglets 3 à X "Autres" etc.sont des rapports de gestion remplis par des personnes. Il y a un onglet par personne remplissant un rapport de gestion (donc 1 à X personnes). Il y a une ligne par tâche étudiée.
A quoi sert la macro ? A rajouter des onglets de rapports intermédiaire automatiquement, sur le modèle de l'onglet 3 et donc modifier le le bilan des rapports de gestion (onglet 2) de sorte qu'il incorpore dans ses calculs les nouveaux onglets ajoutés.
Par avance merci de vos éclairages !
Ludovic
Pièces jointes
Dernière édition: