VBA Comment passer un objet openTextFile en argument de procédure
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:
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:
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 |