Je ne comprend. Mon évènement Open ... mais j'ai déjà fermé et réouvert mon fichier
En autocomplétion ça marche je met shAnalyse.R ... et cela me donne bien Range.
Je ne comprend pas ce que vous voulez dire... désolée :oops:
Version imprimable
Je ne comprend. Mon évènement Open ... mais j'ai déjà fermé et réouvert mon fichier
En autocomplétion ça marche je met shAnalyse.R ... et cela me donne bien Range.
Je ne comprend pas ce que vous voulez dire... désolée :oops:
donne une erreur puisque la variable shAnalyse est encore vide. si vous essayerCode:If shAnalyse.Range(nomCellule & i) <> ""
si elle te donne le nom de ta feuille, c'est ok et ta fonction fonctionnera corresctement mais s'il y a erreur, ça veut dire que shAnalyse est videCode:msgbox shAnalyse.name
J'ai essayé avec le .name et cela me fait la même erreur :
Variable objet ou variable de bloc with non définie...
Cela signifique que vous aviez raison? Que dois-je faire? Je désespère un peu là j'ai tout essayé !!
J'ai regardé en pas à pas et je crois que l'erreur vient du wbkAnalyses dans cette procédure :
Lorsque je passe sur la variable pendant l'execution je vois Variable objet ou variable de bloc with non définie alors que shAnalyse contient bien "Feuil1".... mais je ne sais pas pourquoiCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Sub Ouvre() Dim cCheminClasseur As String, Fichier As String cCheminClasseur = "C:\Documents and Settings\STAG3\Bureau\" Fichier = "exemple.xls" Set wbkExemple = Nothing On Error Resume Next Set wbkExemple = Workbooks(Fichier) On Error Resume Next If wbkExemple Is Nothing Then Set wbkExemple = Workbooks.Open(cCheminClasseur & Fichier) Set shExemple = wbkExemple.Sheets("Feuil1") MsgBox shExemple.Name MsgBox wbkAnalyses.Name End If End Sub
Où tu as mis cette sub?tu as bien double cliqué sur ThisWorkbook dans ton éditeur vba! c'est bien ça?Code:
1
2
3
4 Private Sub Workbook_Open() Set wbkAnalyses = ThisWorkbook Set shAnalyses = wbkAnalyses.Sheets("Données Rapports") End Sub
Dans ThisWorkbook...
Si je met unCode:
1
2
3
4
5 Private Sub Workbook_Open() Set wbkAnalyses = ThisWorkbook Set shAnalyses = wbkAnalyses.Sheets("Données Rapports") End Sub
dans Wokbook_Open() à l'ouverture de mon fichier Excel j'ai bien un message box analyses.xlsCode:MsgBox wbkAnalyses.Name
J'ai repris mon code et réutilisé toutes les variables wbkAnalyses, wbkExemple, shAnalyse, shExemple ... Cependant maintenant mon erreur est sur l'appel de recupNumLot dans ma fonction recupPartielle ...
Est ce que j'utilise mal les variables wbkAnalyses, wbkExemple, shAnalyse, shExemple ??
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 'Fonction qui permet de récupérer les variables analyses hors du tableau (odeur, volatils measurements, LOI) Function RecupPartielle(typeAnalyse As String, formeAnalyse As Integer, varAnalyse As String, valAnalyse As String) On Error GoTo errorValidation Dim recupVar As String Dim recupVal As String recupVar = "" recupVal = "" 'Sélectionne la première cellule du tableau shExemple.Range("A2").Select 'Boucle pour se positionner sur la première cellule vide Do While Not (IsEmpty(ActiveCell)) NbLigne = NbLigne + 1 Selection.Offset(1, 0).Select Loop 'Première cellule on met la forme d'analyse (numéro dans Waste) ActiveCell.Value = formeAnalyse 'Cellule suivante On récupère le numéro de lot ActiveCell.Offset(0, 1).Range("A1").Select 'ActiveCell.Value = recupNumLot Call recupNumLot ActiveCell.Interior.Color = RGB(255, 255, 255) 'Passage de la cellule en blanc A SUPPRIMER à la fin du développement 'Cellule suivante On récupère le type d'analyse ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.Value = typeAnalyse 'Cellule suivante On récupère la variable d'analyse ActiveCell.Offset(0, 1).Range("A1").Select recupVar = shAnalyse.Range(varAnalyse).Value wbkExemple.Activate ActiveCell.Value = recupVar 'Cellule suivante On récupère la valeur de la mesure ActiveCell.Offset(0, 1).Range("A1").Select recupVal = shAnalyse.Range(valAnalyse).Value wbkExemple.Activate ActiveCell.Value = recupVal ActiveCell.Interior.Color = RGB(255, 255, 255) 'Passage de la cellule en blanc A SUPPRIMER à la fin du développement Exit Function errorValidation: 'Appelle la procédure qui envoit un mail à JFM en cas d'erreur 'Il faut récupérer - nom procédure - nom fichier - nom numéro lot - code erreur excel - description erreur Call EnvoiMailErreurValidation("RecupPartielle", "analyses.xls", recupNumLot, Err.Number, Err.Description) End Function
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 'Procédure de récupération du numéro de lot dans "analyses.xls" Sub recupNumLot() Dim recupNumLot As String wbkAnalyses.Activate recupNumLot = Range(cNumLot).Value 'On récupère le numéro de lot If recupNumLot = "" Then wbkExemple.Activate ActiveCell.Offset(0, -1).Range("A1").Select ActiveCell.Value = "" wbkExemple.Save wbkExemple.Close wbkAnalyses.Activate MsgBox ("Merci de saisir un numéro de lot") End End If wbkExemple.Activate 'On active exemple.xls dans lequel on va stocker les données ActiveCell.Value = recupNumLot 'On affecte le numéro de lot à la cellule active End Sub
Edit : Erreur certainement aléatoire parce que je viens de relancer une nouvelle fois mon projet et l'erreur est à nouveau :
Même question est ce que j'utilise mal mes variables?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 Function RecuperationComplete(typeAnalyse As String, nomCellule As String, formeA As Integer) Dim recupVar As String Dim recupVal As String recupVar = "" recupVal = "" Do While i < cNumLigneFinTableau For i = cNumLigneDebutTableau To cNumLigneFinTableau wbkAnalyses.Activate If Range(nomCellule & i) <> "" Then Windows("exemple.xls").Activate 'Sélectionne la première cellule du tableau Range("A2").Select 'Boucle pour se positionner sur la première cellule vide Do While Not (IsEmpty(ActiveCell)) NbLigne = NbLigne + 1 Selection.Offset(1, 0).Select Loop 'Première cellule on met la forme d'analyse (numéro dans Waste) ActiveCell.Value = formeA 'Cellule suivante On récupère le numéro de lot ActiveCell.Offset(0, 1).Range("A1").Select Call recupNumLot ActiveCell.Interior.Color = RGB(255, 255, 255) 'Passage de la cellule en blanc a enlever à la fin du développement 'Cellule suivante On récupère le type d'analyse ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.Value = typeAnalyse 'Cellule suivante On récupère la variable d'analyse ActiveCell.Offset(0, 1).Range("A1").Select Windows("analyses.xls").Activate recupVar = Range("A" & i).Value Windows("exemple.xls").Activate ActiveCell.Value = recupVar 'Cellule suivante On récupère la valeur de la mesure ActiveCell.Offset(0, 1).Range("A1").Select Windows("analyses.xls").Activate recupVal = Range(nomCellule & i).Value Windows("exemple.xls").Activate ActiveCell.Value = recupVal ActiveCell.Interior.Color = RGB(255, 255, 255) 'Passage de la cellule en blanc a enlever à la fin du développement 'Cellule suivante On récupère le numéro de commande traitement ActiveCell.Offset(0, 1).Range("A1").Select Windows("analyses.xls").Activate RecupNumCmdTraitement = Range(nomCellule & cNumLigneCmdTraitement).Value Windows("exemple.xls").Activate ActiveCell.Value = RecupNumCmdTraitement End If Next i Loop End Function
Si on a instanciés les classeurs et les feuilles, c'est justement pour éviter les Select et les Activatedonne une erreur si la feuille active n'est pas shExemple.Code:shExemple.Range("A2").Select
On part pas à pas, en essayes d'éliminer toutes les Select; en effet, au lieu de faireon fait directementCode:
1
2 sheets(X).cells(x,y).select activecell.value=k
Ton code aura l'allure suivanteCode:sheets(X).cells(x,y).value=k
Relis les 2 codes ligne par ligne, tu auras compris la philosophie. le reste viendra tout seulCode:
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 Function RecupPartielle(typeAnalyse As String, formeAnalyse As Integer, varAnalyse As String, valAnalyse As String) Dim recupVar As String, recupVal As String Dim NewLig As Long On Error GoTo errorValidation With shExemple NewLig = .Cells(Rows.Count, 1).End(xlUp).Row + 1 .Range("A" & NewLig).Value = formeAnalyse With .Range("B" & NewLig) .Value = recupNumLot .Interior.Color = RGB(255, 255, 255) End With .Range("C" & NewLig).Value = typeAnalyse .Range("D" & NewLig).Value = shAnalyse.Range(varAnalyse).Value With .Range("E" & NewLig) .Value = shAnalyse.Range(valAnalyse).Value .Interior.Color = RGB(255, 255, 255) End With End With Exit Function errorValidation: 'Appelle la procédure qui envoit un mail à JFM en cas d'erreur 'Il faut récupérer - nom procédure - nom fichier - nom numéro lot - code erreur excel - description erreur Call EnvoiMailErreurValidation("RecupPartielle", "analyses.xls", recupNumLot, Err.Number, Err.Description) End Function
Est ce que c'est possible que vous me mettiez le même code mais sans la modification de mon code ...
Histoire que j'arrive mieux à comprendre la logique d'utilisation des wbk ... ? Parce que là je me concentre en même temps sur le changement de code et je m'y perd...
Merci à Mercatog pour son aideCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub RecupPartielle(typeAnalyse As String, formeAnalyse As Integer, varAnalyse As String, valAnalyse As String) Dim recupVar As String, recupVal As String Dim NewLig As Long With shExemple NewLig = .Cells(Rows.Count, 1).End(xlUp).Row + 1 'Première cellule on met la forme d'analyse (numéro dans Waste) .Range("A" & NewLig).Value = formeAnalyse 'Cellule suivante On récupère le numéro de lot .Range("B" & NewLig).Value = shAnalyse.Range(cNumLot).Value 'Cellule suivante On récupère le type d'analyse .Range("C" & NewLig).Value = typeAnalyse .Range("D" & NewLig).Value = shAnalyse.Range(varAnalyse).Value .Range("E" & NewLig).Value = shAnalyse.Range(valAnalyse).Value End With EndSub