|
|
|
| [VBA] Optimisation de code / gain de temps par lml-mike |
lundi 25 février 2008 à 12:16:33 |
conf1 = "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" & Chr(13) & Chr(10) conf2 = "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" & Chr(13) & Chr(10) conf3 = "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" _ & Chr(13) & Chr(10) & "blah" & Chr(13) & Chr(10) conf = conf1 & conf2 & conf3
Configuration: Windows XP Firefox 2.0.0.12 VBA Word
Bonjour,
pour eviter la répétion de Chr(13) & Chr(10) tu peux affecter ces 2 caractères à une varialble chaine Dim NL As String NL = Chr(13) & Chr(10) conf1 = "blah" _ & NL & "blah" _ & NL & "blah" _ & NL & "blah" _ & NL & "blah" _ & NL & "blah" _ & NL & "blah" & NL c'est déja plus court... |
c'est très gentil, mais pour moi l'opération reste la même, je dois copier/coller en début de chaque ligne...
ctrl+V + fleche bas + home ctrl+V + fleche bas + home ctrl+V + fleche bas + home ctrl+V + fleche bas + home ctrl+V + fleche bas + home ctrl+V + fleche bas + home ctrl+V + fleche bas + home ... |
Si tu affectais les valeurs des variables conf1 conf2 ... dans une boucle?
D'ou provient le texte que tu veux mettre dans tes variables? Si les lignes de texte à chainer sont dans des tableaux de texe c'est assez simple. conf1 = tabTxt(1) for i =2 to n ' nombre de lignes à chainer conf1 = conf1 & Chr(13) & Chr(10) & tabTxt(i) next i conf1 = conf1 & Chr(13) & Chr(10) c'est déja plus sympa... |
Le texte qui proviens de mes variables viennent d'un fichier de configuration d'un routeur qui fait quelques milliers de lignes...
quand je rentre des paramètres en inputbox, je récupère d'un routeur un fichier de configuration "type", dans lequel je change certaines variables par les paramètres. Enfin, je stock le tout dans une variable, que je copie dans le presse papiers :) |
OK,
Tu utilise une inputbox, ça veut dire que tu saisis manuellement les les lignes de texte que tu veux ensuite chainer? Est ce que tu ne pourrais pas les stocker dans des tableaux et faire la concatenation une seule fois à la fin de la saisie? J'aurais besoin de plus d'éléments pour t'aider. |
Je vais essayer d'être le plus clair possible, par le biais d'un exemple...
Disons que pour mes routeurs j'ai ces commandes à rentrer : ... router ospf 100 Network 192.168.1.1 0.0.0.255 interface fa0/0 ip address 192.168.1.1 255.255.255.0 line con 0 login local logging synchrounous escape-character 27 ... Maintenant, quand je passe d'un routeur à l'autre, il n'y a que le 192.168.1.1 qui change. Donc, dans mon visual basic je le présente comme tel : conf = "router ospf 100" _ & chr(13) & chr(10) & "Network" & IP _ & chr(13) & chr(10) & "interface fa0/0" _ & chr(13) & chr(10) & "ip address " & IP & "255.255.255.0" _ & chr(13) & chr(10) & "line con 0" _ & chr(13) & chr(10) & "login local" _ & chr(13) & chr(10) & "logging synchrounous" _ & chr(13) & chr(10) & "escape-character 27" & chr(13) & chr(10) le IP est une variable qui a été precedemment saisie dans une inputbox : IP = Inputbox("Saisissez l'ip du routeur :")
Comme la conf que je colle il faut que j'ajoute à chaque début de ligne : & chr(13) & chr(10) &et à chaque fin _ jusqu'à ce que j'ai une alerte me disant que j'ai trop de fin de ligne, où dans ce cas je sectionne le bout de config dans une variable que je concatenne à la fin : ... & chr(13) & chr(10) & "escape-character 27" & chr(13) & chr(10) conf2 = "line vty 0 4" _ ... conf_final = conf & conf2 & conf3 J'espere avoir pu t'éclairer un peu plus :) |
Bonjour,
Ton fichier de configuration type, on pourrait le lire ligne par ligne, voir si la ligne de texte contient la partie à modifier Si non -> copier la ligne telle quelle -> Engegister dans une variable texte ou un nouveau fichier config Si oui -> Modifier la ligne avec le nouvel IP -> Engegister dans une variable texte ou un nouveau fichier config Le code pourrait etre: ' cas ou on enregistre la nouvelle config dans un fichier Dim texte as string, IP as string, Open "ConfigType" for input as #1 ' ouvrir configtype en lecture Open "NewConfig" for output as #2 ' ouvrir nouvelle config While not eof(1) Line input #1, texte 'lire une ligne configtype ' si texte contient "ip address" modifier avec nouvel IP If instr(texte,"ip address") > 0 then texte = "ip address " & IP & " 255.255.255.0" Print #2, texte ' engegistrer nouvelle config wend Close ' cas ou on enregistre la nouvelle config dans une variable Dim texte as string, IP as string, config as string Open "ConfigType" for input as #1 ' ouvrir configtype en lecture config="" 'initialiser config While not eof(1) Line input #1, texte 'lire une ligne configtype ' si texte contient "ip address" modifier avec nouvel IP If instr(texte,"ip address") > 0 then texte = "ip address " & IP & " 255.255.255.0" config= config & texte & chr(13) & chr(10) ' engegistrer nouvelle config wend Close Est ce que ça pourrait marcher?
|
OK,
Le code brut ça veut dire que tu ne veux pas les retours à la ligne? Si c'est ça alors il faut juste les retirer de code Dim texte as string, IP as string, config as string Open "ConfigType" for input as #1 ' ouvrir configtype en lecture config="" 'initialiser config While not eof(1) Line input #1, texte 'lire une ligne configtype ' si texte contient "ip address" modifier avec nouvel IP If instr(texte,"ip address") > 0 then texte = "ip address " & IP & " 255.255.255.0" config= config & texte ' <------------ enregistrer nouvelle config wend Close Si tu as encore besoin d'aide n'hesite pas
|
bonjour,
effectivement, config = "chr(13) & chr(10) & "escape-character 27" _" n'est pas correct on ne peut pas imbriquer des guillemets il faut ecrire ça: config = "Chr(13) & Chr(10) & " & Chr(34) & " escape-character 27" & Chr(34) ce qui donne Chr(13) & Chr(10) & "escape-character 27" ou encore config = chr(34) & "Chr(13) & Chr(10) & " & Chr(34) & " escape-character 27" & Chr(34) & " _" & chr(34) qui donne "Chr(13) & Chr(10) & "escape-character 27" _" Mais dans ce cas "Chr(13) & Chr(10)" devient du texte et ne sera plus considéré comme caractère de retour chariot-nouvelle ligne , je ne sais pas si c'est vraiment ce que tu cherche. Ce qui serait bien c'est que tu me mette d'un coté ce que tu récupere dans configType (tel que c'est ecrit) et de l'autre ce que tu voudrait obtenir, je t'écrirai le code qui va bien. Il ne faut pas oublier que les "Chr(13) & Chr(10)" si j'ai bien compris servent à simuler l'appui sur Enter quand tu mets ta variable Config dans le presse papier. Alors il ne faut pas les mettre entre guillemets sinon ça devient un simple texte. Bon appetit. |
Je reviens de la cantine et j'ai pensé à une chose.
Les fichier de config que tu as, c'est pour utiliser avec une commande DOS comme netsh par exemple? Parce que si c'est la cas, pas besoin de passer par le presse papier pour coller les commandes modifiées. Dans DOS, mais peut-etre tu le sait déja, on peut rediriger les entées sorties standard de la console écran-clavier. Par exemple: netsh <config1.txt veut dire executer netsh.exe et les entrées seront lues dans config1.txt au lieu d'etre tapées au clavier. Est ce que cette piste vaut le coup d'etre exploitée? Du coup plus besoin de presse papier ni de chr(13) chr(10). Tu utiliserai VB uniquement pour recopier ton ConfigType en modifiant certains paramètres et l'enregister dans Config1. Aprés, c'est du gateau. A+
|
bonsoir,
Je voudrais que tu essai ce code: Remplace les nom de fichiers par des noms à toi. Le prmier fichier est celui ou tu lis les donnes Le deuxiène fichier est celui ou on ecrit le code VB avec les variables et les données. Dis moi si c'est ce que tu attends. A+
Sub essai()
Dim i, j, k
Dim config, texte
Dim IP, login, IP_public
Close
Open "d:\essai_inp.txt" For Input As #1 'je précise le chemin d'accès complet, où le nom de fichier
' qui se trouve dans le même repertoire ?
Open "d:\essai_out.txt" For Output As #2
j = 1
While Not EOF(1)
For i = 1 To 23
If EOF(1) Then Exit For
Line Input #1, texte
If InStr(texte, "§ip§") > 0 Then
texte = "ip address " & IP & " 255.255.255.0"
End If
If InStr(texte, "§identifiants§") > 0 Then
texte = "ppp chap hostname " & login
End If
If InStr(texte, "§IP publique§") > 0 Then
texte = "permit udp host ip host " & IP_public & " eq isakmp"
End If
If i = 1 Then
config = "conf" & j & " = " & Chr(34) & texte & Chr(34) & " _"
Print #2, config
j = j + 1
Else
config = " & Chr(13) & Chr(10) & " & Chr(34) & texte & Chr(34) & " _"
Print #2, config
End If
Next i
If EOF(1) Then
config = " & " & Chr(34) & Chr(34)
Print #2, config
Print #2, ""
Else
Line Input #1, texte
config = " & Chr(13) & Chr(10) & " & Chr(34) & texte & Chr(34) & " & chr(13) & chr(10)"
Print #2, config
Print #2, ""
End If
Wend
config = "conf = conf"
For k = 1 To j - 2
config = config & k & " & conf"
Next
config = config & j - 1
Print #2, config
Close
End Sub
|
Bonjour,
Heureux d'avoir pu te dépanner, Pour la textbox, ça depend si tu veux la remplir par programme ou manuellement. Par programme c'est facile -définir la textbox avec une taille suffisante en hauteur de manière à voir plusieurs lignes à la fois -mettre la propriété MultiLine=True -mettre la propriété Locked=True -mettre la propriété ScrollBars=Vertical Ensuite le programme renseigne la textbox avec le bout de config. Si la variable config contient le texte en question tu ecrit Form1.Text1.Text=config tout simplement. Verifie que les lignes sont bien affichées, selectionne le texte comme dans un editeur normal, fait un copier coller dans Word par exemple, il ne devrait y avoir de problème. La propriété Locked=False empèche la modification du contenu de la textbox. Par conséquent tu ne pourras pas remplir la textbox manuellement. Pour effacer le contenu Form1.Text1.Text="" Pour selectionner le contenu entier de la textbox avec un click:
Private Sub Text1_Click()
Dim longText As Long
longText = Len(Text1.Text)
Text1.SelStart = 0
Text1.SelLength = longText
End Sub
Voilà. A+ si tu as encore besois de tuyaux.
|