Bonjour à tous,

J'ai un script qui doit générer des fichiers textes ( un pour l'instant ), j'ai une partie qui se répète, donc je voudrais la mettre dans une procédure.
Le tout sans fermer le fichier entre la procédure appelante et la procédure appelé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Sub flecheGauche()
    Dim fs, i, derSynoptOfType, typeView, firstOfTypeView, path, chemin, fichier
    fichier = "scrpt_FlecheGauche.txt"
    chemin = "C:\expExcel\"
    path = chemin & fichier
    headNavFleche path
 
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.opentextfile(path, 8, -2) ' 8 -> For Append, -2 -> TristateUseDefault
    typeView = "Synoptique"
    derSynoptOfType = DerviewUsed(typeView) 'position du dernier synoptique utilisé
    firstOfTypeView = firstTypeView(typeView)   ''position du premier synoptique utilisé
 
    '---     Appel de la procédure "chaqueTypeFlecheGauche(fso as object)
    chaqueTypeFlecheGauche a, typeView    -> Type d'argument ByRef incompatible
 
    a.Close
    Set a = Nothing
    Set fs = Nothing
 
End sub
 
'  Procédure de sélection des vues dans la navigation des vues
Sub chaqueTypeFlecheGauche(b As Object, typeVue)
    While Range("T_Vues_Synopt_WinCC[type]").Item(i) = typeVue
        If Range("T_Vues_Synopt_WinCC[Utilisé]").Item(i) = "oui" Then
                b.writeline "Case " & Left(Range("T_Vues_Synopt_WinCC[Vues]").Item(i), 3)
                For k = i - 1 To 1 Step -1
                    If Range("T_Vues_Synopt_WinCC[Utilisé]").Item(k) = "oui" Then
                        b.writeline "                newView = " & Chr(34) & Range("T_Vues_Synopt_WinCC[Vues]").Item(k) & Chr(34)
                        Exit For
                    End If
                Next k
        End If
        i = i + 1
    Wend
End Sub
Donc j'ai une erreur "Type d'argument ByRef incompatible".
Je souhaitera ne pas à avoir à fermer le fichier avant l'appel de la procédure appelé, puis le ré ouvrir dans la procédure appelé.

La partie à répéter est la boucle while.

Je ne sais pas comment faire pour passer l'instance "a" du fichier ouvert dans la procédure appelé.
Merci d'avance pour votre aide.

ps: Et oui pour ceux qui ont deviné, j'essaie de générer mes scripts vbs pour WinCC avec Excel
Le code complet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Dim posFirst, posLast
Sub flecheGauche()
    Dim fs, i, derSynoptOfType, typeView, firstOfTypeView, path, chemin, fichier
    fichier = "scrpt_FlecheGauche.txt"
    chemin = "C:\expExcel\"
    path = chemin & fichier
    headNavFleche path
 
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.opentextfile(path, 8, -2) ' 8 -> For Append, -2 -> TristateUseDefault
 
    'For i = 1 To UBound(Range("T_Vues_Synopt_WinCC[Vues]"))
 
    typeView = "Synoptique"
    derSynoptOfType = DerviewUsed(typeView) 'position du dernier synoptique utilisé
    firstOfTypeView = firstTypeView(typeView)   ''position du premier synoptique utilisé
 
    a.writeline "Case " & Left(firstOfTypeView, 3)
    a.writeline "                newView = " & Chr(34) & derSynoptOfType & Chr(34)
    i = 1 + posFirst
    '------     La partie qui va se répéter
    While Range("T_Vues_Synopt_WinCC[type]").Item(i) = typeView
        If Range("T_Vues_Synopt_WinCC[Utilisé]").Item(i) = "oui" Then
                a.writeline "Case " & Left(Range("T_Vues_Synopt_WinCC[Vues]").Item(i), 3)
                For k = i - 1 To 1 Step -1
                    If Range("T_Vues_Synopt_WinCC[Utilisé]").Item(k) = "oui" Then
                        a.writeline "                newView = " & Chr(34) & Range("T_Vues_Synopt_WinCC[Vues]").Item(k) & Chr(34)
                        Exit For
                    End If
                Next k
        End If
        i = i + 1
    Wend
    '-----  Fin de la partie qui va se répéter
    a.writeline "Case Else" & Left(firstOfTypeView, 3)
    a.writeline "                newView = " & Chr(34) & firstOfTypeView & Chr(34)
    a.writeline "        End Select"
    a.writeline "    Case " & Chr(34) & "Compteurs" & Chr(34)
    a.writeline "        Select Case pageOrigine"
    i = posLast + 1
    typeView = "Cumul volume"
    derSynoptOfType = DerviewUsed(typeView) 'position du dernier synoptique utilisé
    firstOfTypeView = firstTypeView(typeView)   ''position du premier synoptique utilisé
 
    '---     Appel de la procédure "chaqueTypeFlecheGauche(fso as object)
    chaqueTypeFlecheGauche a, typeView
 
 
    a.writeline "Case " & Left(firstOfTypeView, 3)
    a.writeline "                newView = " & Chr(34) & derSynoptOfType & Chr(34)
 
     '---     Appel de la procédure "chaqueTypeFlecheGauche(fso as object)
    a.writeline ""
    a.writeline
    a.Close
    Set a = Nothing
    Set fs = Nothing
End Sub
'  Procédure de sélection des vues dans la navigation des vues
Sub chaqueTypeFlecheGauche(b As Object, typeVue)
    While Range("T_Vues_Synopt_WinCC[type]").Item(i) = typeVue
        If Range("T_Vues_Synopt_WinCC[Utilisé]").Item(i) = "oui" Then
                b.writeline "Case " & Left(Range("T_Vues_Synopt_WinCC[Vues]").Item(i), 3)
                For k = i - 1 To 1 Step -1
                    If Range("T_Vues_Synopt_WinCC[Utilisé]").Item(k) = "oui" Then
                        b.writeline "                newView = " & Chr(34) & Range("T_Vues_Synopt_WinCC[Vues]").Item(k) & Chr(34)
                        Exit For
                    End If
                Next k
        End If
        i = i + 1
    Wend
End Sub
Function DerviewUsed(typeOfView)
Dim j, nbLinec
nbLine = Range("T_Vues_Synopt_WinCC[Vues]").Rows.Count
    For j = 1 To nbLine
        If Range("T_Vues_Synopt_WinCC[type]").Item(j) <> typeOfView And Range("T_Vues_Synopt_WinCC[Utilisé]").Item(j - 1) = "oui" Then
            j = j - 1
            posLast = j
            Exit For
        End If
    Next j
    DerviewUsed = Range("T_Vues_Synopt_WinCC[Vues]").Item(j)
End Function
Function firstTypeView(typeOfView)
Dim j, nbLine
nbLine = Range("T_Vues_Synopt_WinCC[Vues]").Rows.Count
    For j = 1 To nbLine
        If Range("T_Vues_Synopt_WinCC[type]").Item(j) = typeOfView And Range("T_Vues_Synopt_WinCC[Utilisé]").Item(j) = "oui" Then
            posFirst = j
            Exit For
        End If
    Next j
    firstTypeView = Range("T_Vues_Synopt_WinCC[Vues]").Item(j)
End Function
 
 
Sub headNavFleche(sPath)
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.CreateTextFile(sPath, True)
    a.writeline "Dim newView     'Nouvelle page à ouvrir"
    a.writeline "Dim typeView    'e.g. Process, exploitation..."
    a.writeline ""
    a.writeline "If pageOrigine =100 Then pageOrigine = 101"
    a.writeline "If pageOrigine >= 101 And pageOrigine  <= 111 Then typeView = " & Chr(34) & "Process" & Chr(34)
    a.writeline ""
    a.writeline "If pageOrigine  >= 130 And pageOrigine < 140 Then typeView = " & Chr(34) & "Compteurs" & Chr(34)
    a.writeline ""
    a.writeline "If pageOrigine  >= 140 And pageOrigine < 150 Then typeView = " & Chr(34) & "Alarmes" & Chr(34)
    a.writeline ""
    a.writeline "If pageOrigine  >= 150 And pageOrigine < 160 Then typeView = " & Chr(34) & "Moteurs" & Chr(34)
    a.writeline ""
    a.writeline "If pageOrigine  >= 200 And pageOrigine < 300 Then typeView = " & Chr(34) & "Consignes" & Chr(34)
    a.writeline ""
    a.writeline "If pageOrigine  >= 300 And pageOrigine < 400 Then typeView = " & Chr(34) & "Courbes" & Chr(34)
    a.writeline ""
    a.writeline "Select Case typeView"
    a.writeline "    Case " & Chr(34) & "Process" & Chr(34)
    a.writeline "        Select Case pageOrigine"
    a.Close
    Set a = Nothing
    Set fs = Nothing
End Sub