Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
884 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBS] Excel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBS] Excel

n°2065775
Mackk2
Posté le 24-03-2011 à 12:24:26  profilanswer
 

Bonjour,
 
Débutant en vb, je cherche à créer un vbs.
En effet celui-ci doit récupérer les noms netbios de machine dans un excel commençant par "XP" puis interroger ces machines sur le réseau pour vérifier qu'une valeur dans leur registre existe et enfin écrire dans ce même excel "OK" ou "Nok" sur la ligne correspondant à la bonne machine.
 
Apres plusieurs essai je pensais être enfin arrivé à quelque chose, mais non l'excel s'ouvre et il ne se passe rien.  :cry:  
 

Code :
  1. Function RegExiste(value)
  2. On Error Resume Next
  3. Set WS = CreateObject("WScript.Shell" )
  4. val = WS.RegRead(value)
  5. If (Err.number = -2147024893) or (Err.number = -2147024894) Then
  6. RegExiste = False
  7. Else
  8. RegExiste = True
  9. End If
  10. End Function
  11. On Error Resume Next
  12. 'Ouverture d'Excel
  13. Set objExcel = CreateObject("Excel.Application" )
  14. Set objWorkbook = objExcel.Workbooks.Open("c:\XXX\Desktop\VBS\Test1.xlsx" )
  15. objExcel.Visible = False
  16. objExcel.DisplayAlerts = False
  17. objExcel.Sheets("Feuil1" ).select
  18. Dim Netbios
  19. IntRow = 2
  20. Netbios = objExcel.Cells(IntRow,10).Value
  21. While Netbios = "XP*"
  22. If objExcel.Cells(IntRow,10).Value = "XP*" Then
  23.  NomMachine = objExcel.Cells(IntRow,10).Value
  24.  'objExcel.value(IntRow,10)
  25.  HKEY_LOCAL_MACHINE = &H80000002
  26.   Err.Clear
  27.   Set objReg = GetObject("winmgmts:\\" & NomMachine & "\root\default:StdRegProv" )
  28.   If err.number<>0 Then
  29.   msgbox "L'ordinateur " & NomMachine & " n'a pas été trouvé sur le réseau", vbCritical, "Erreur de connexion"
  30.   Else
  31.    If RegExiste ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ScanOCS" ) Then
  32.     MsgBox "La valeur existe."
  33.     objExcel.Cells(IntRow, 18).Value = "Ok"
  34.     IntRow = IntRow + 1
  35.    Else
  36.     MsgBox "La valeur n'existe pas."
  37.     objExcel.Cells(IntRow, 18).Value = "Nok"
  38.     IntRow = IntRow + 1
  39.    End If
  40.   End If
  41. Else
  42.  'Fermeture d'Excel
  43.  objWorkbook.Save
  44.  objWorkbook.Close
  45.  objExcel.Quit
  46.  Set objWorkbook = Nothing
  47.  Set objWorkbook = Nothing
  48.  Set objExcel = Nothing
  49. End If
  50. Wend

 
Si quelqu'un à une idée d'ou pourrait provenir le problème je lui en serais reconnaissant
Merci
 

mood
Publicité
Posté le 24-03-2011 à 12:24:26  profilanswer
 

n°2065796
SuppotDeSa​Tante
Aka dje69r
Posté le 24-03-2011 à 13:50:07  profilanswer
 

Code :
  1. Netbios = objExcel.Cells(IntRow,10).Value
  2. While Netbios = "XP*"

Tu définis en amont du While, et tu ne redefinis pas Netbios par la suite, ca ne peut pas tourner...
 
De plus, il va sortir de ton while des que Netbios sera different de "XP"...
 
Je verrais plutot quelque chose de ce genre la :
A la place des lignes 21 et 22:

Code :
  1. DerLigne = objExcel.Cells(Rows.Count, 10).End(xlUp).Row
  2. For IntRow = 1 To DerLigne


 
Degager les lignes 36 ; 40
 
Et a la place de la ligne 52

Code :
  1. Next IntRow

Message cité 1 fois
Message édité par SuppotDeSaTante le 24-03-2011 à 13:50:16

---------------
Soyez malin, louez entre voisins !
n°2065852
Mackk2
Posté le 24-03-2011 à 16:14:35  profilanswer
 

Merci  pour les réponses

SuppotDeSaTante a écrit :

Tu définis en amont du While, et tu ne redefinis pas Netbios par la suite, ca ne peut pas tourner...


Ah oui effectivement trop la honte lol Merci

SuppotDeSaTante a écrit :

De plus, il va sortir de ton while des que Netbios sera different de "XP"...


Dans mon fichier Excel les "XP" se suivent. Des que ce n'est plus le cas les valeurs ne m'intéressent plus. En fait je cherche seulement les cellules commençant par XP en respectant la casse.

SuppotDeSaTante a écrit :

Je verrais plutot quelque chose de ce genre la :
A la place des lignes 21 et 22:

Code :
  1. DerLigne = objExcel.Cells(Rows.Count, 10).End(xlUp).Row
  2. For IntRow = 1 To DerLigne


Degager les lignes 36 ; 40
 
Et a la place de la ligne 52

Code :
  1. Next IntRow



Si je comprend bien ca "check" chaque ligne à partir de 1 et Next IntRow sert à passer à la suivante jusquà la derniere?
J'ai enlevé IntRow dans "Next IntRow" car j'ai un message d'erreur "Attente d'intruction".
 
En suivant ta méthode la boucle à l'air de marcher mais bloque à ligne 31 et m'affiche mon message d'erreur "L'ordinateur " & NomMachine & " n'a pas été trouvé sur le réseau" ou "NomMachine" correspond à un Blanc : L'ordinateur >< n'a pas été trouvé sur le réseau ( donc normale que l'erreur survienne )
 
Du coup je pense que j'ai un probleme à la ligne 23;24 :

Code :
  1. If objExcel.Cells(IntRow,10).Value = "XP*" Then
  2.  NomMachine = objExcel.Cells(IntRow,10).Value


Je voudrais dire : Si la valeur dans la cellule(IntRow, 10) commence par XP alors appliquer cette valeur à la variable "NomMachine"
C'est pas comme ça qu'il faut faire?
 
[Edit]
J'ai essayé d'isoler des lignes pour voir d'ou venait l'erreur et j'en est une autre maintenant " Erreur : Objet requis: 'Rows' " caractere 1 pour la ligne "DerLigne = objExcel.Cells(Rows.Count, 10).End(xlUp).Row"


Message édité par Mackk2 le 24-03-2011 à 16:28:31
n°2065861
SuppotDeSa​Tante
Aka dje69r
Posté le 24-03-2011 à 16:37:03  profilanswer
 

Ah ui, ôtent pour moi.
Je l'ai fait dans Excel... pas en VBS...
 
objExcel.Cells(objExcel.Rows.Count, 10).End(xlUp).Row


---------------
Soyez malin, louez entre voisins !
n°2065864
Mackk2
Posté le 24-03-2011 à 16:50:43  profilanswer
 

SuppotDeSaTante a écrit :

Ah ui, ôtent pour moi.
Je l'ai fait dans Excel... pas en VBS...
 
objExcel.Cells(objExcel.Rows.Count, 10).End(xlUp).Row


 
T'aurais un exemple de script ou tu utilise objExcel.Cells(objExcel.Rows.Count, 10).End(xlUp).Row
Parce que maintenant j'ai : erreur d’exécution inconnu
Donc peut être que je zappe quelque chose qu'il faut que je rajoute ( ou enleve )
 
Merci

n°2065865
SuppotDeSa​Tante
Aka dje69r
Posté le 24-03-2011 à 16:58:45  profilanswer
 

Fais un essai avec  
DerLigne = 65536
 
Edit : je suis con...
xlUp.. en vbs...
Remplace xlUp par 3
 
objExcel.Cells(objExcel.Rows.Count, 10).End(3).Row

Message cité 1 fois
Message édité par SuppotDeSaTante le 24-03-2011 à 17:01:15

---------------
Soyez malin, louez entre voisins !
n°2065870
Mackk2
Posté le 24-03-2011 à 17:17:16  profilanswer
 

SuppotDeSaTante a écrit :

Fais un essai avec  
DerLigne = 65536
 
Edit : je suis con...
xlUp.. en vbs...
Remplace xlUp par 3
 
objExcel.Cells(objExcel.Rows.Count, 10).End(3).Row


Effectivement ça marche
Bon ben je mettrais 1000 alors parceque xlUp ca passe pas en vbs
 
Merci beaucoup

n°2065871
SuppotDeSa​Tante
Aka dje69r
Posté le 24-03-2011 à 17:19:02  profilanswer
 

Non non !!
3 = xlUp
Il faut laisser 3.


---------------
Soyez malin, louez entre voisins !
n°2065883
Mackk2
Posté le 24-03-2011 à 17:46:27  profilanswer
 

SuppotDeSaTante a écrit :

Non non !!
3 = xlUp
Il faut laisser 3.


Mdr trop cool Merci beaucoup

n°2066086
Mackk2
Posté le 25-03-2011 à 15:24:43  profilanswer
 

Maintenant le script marche nikel....... enfin presque
 
La ou ca bloque maintenant c'est ligne 16. Je pense au moment de la lecture du registre distant. Je ne comprend pas pourquoi il ne fait soit que m'inscrire Nok ( donc la valeur du registre n'existe pas )  peut importe qu'elle existe ou pas ; ou indisponible qui lui marche bien quand la machine distante n'est pas joignable
 

Code :
  1. 'On Error Resume Next
  2. 'Ouverture d'Excel
  3. Set objExcel = CreateObject("Excel.Application" )
  4. Set objWorkbook = objExcel.Workbooks.Open("c:\Excel.xlsx" )
  5. objExcel.Visible = True
  6. objExcel.DisplayAlerts = True
  7. objExcel.Sheets("sheet 1" ).select
  8. On Error Resume Next
  9. Dim DerLigne
  10. Derligne = objExcel.Cells(objExcel.Rows.Count, 10).End(3).Row
  11. For IntRow = 21 To DerLigne
  12. If objExcel.Cells(IntRow,10).Value<>"" Then
  13.  NomMachine = objExcel.Cells(IntRow,10).Value
  14.  HKEY_LOCAL_MACHINE = &H80000002
  15.  Err.Clear
  16.  Set objReg = GetObject("winmgmts:\\" & NomMachine & "\root\default:StdRegProv" )
  17.   strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"
  18.   ValueName = "ScanOCS"
  19.   objReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, ValueName, strValue
  20.  If err.number<>0 Then
  21.   objExcel.Cells(IntRow, 18).Value = "Indisponible"
  22.  Else
  23.   If IsNull(strValue) Then
  24.    objExcel.Cells(IntRow, 18).Value = "NOk"
  25.   Else
  26.    objExcel.Cells(IntRow, 18).Value = "Ok"
  27.   End If
  28.  End If
  29. Else
  30. 'Fermeture d'Excel
  31. ' objWorkbook.Save
  32. ' objWorkbook.Close
  33. ' objExcel.Quit
  34. ' Set objWorkbook = Nothing
  35. ' Set objWorkbook = Nothing
  36. ' Set objExcel = Nothing
  37. End If
  38. Next
  39. Msgbox = "Fichier Excel mise à jour."


 
J'ai pourtant essayé plusieurs manière d’interroger le registre sur un pc distant. J'ai à chaque fois un problème alors que les droit sont bons etc.
Si quelqu'un à une idée d'ou provient mon erreur.
Merci pour vos conseils avisés


Message édité par Mackk2 le 25-03-2011 à 15:27:58
mood
Publicité
Posté le 25-03-2011 à 15:24:43  profilanswer
 

n°2066088
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 15:28:04  profilanswer
 

strValue te renvoie quoi pour les coups où ca ne marche pas ?


---------------
Soyez malin, louez entre voisins !
n°2066089
Mackk2
Posté le 25-03-2011 à 15:29:27  profilanswer
 

Hmm comment je peux récupérer cette valeur?
Quand j'essaye de la mettre dans une msgbox j'ai tout de suite une erreur

n°2066091
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 15:30:42  profilanswer
 

Et ton erreur est ou ? Ligne 16 ?


---------------
Soyez malin, louez entre voisins !
n°2066092
Mackk2
Posté le 25-03-2011 à 15:32:37  profilanswer
 

Pour le registre je n'ai pas de message d'erreur
Ca me met tout simplement Nok dans mon excel que la valeur dans le registre existe ou non
Pour "msgbox strValue" j'ai l'erreur sur la ligne ou je met cette commande.


Message édité par Mackk2 le 25-03-2011 à 15:32:52
n°2066099
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 15:38:15  profilanswer
 

Hum.
 
Reprenons.
 
"ScanOCS" c'est quoi ? Une clé ou une Valeur ?


---------------
Soyez malin, louez entre voisins !
n°2066101
Mackk2
Posté le 25-03-2011 à 15:39:06  profilanswer
 

Une Valeur de chaine

n°2066104
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 15:40:46  profilanswer
 

Donc tu créés une Valeur Chaine directement dans le Run.. Mouai bon, admettons.
 
Tu as donc HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Et dedans une valeur chaine ayant pour nom ScanOCS ?


Message édité par SuppotDeSaTante le 25-03-2011 à 15:41:03

---------------
Soyez malin, louez entre voisins !
n°2066106
Mackk2
Posté le 25-03-2011 à 15:42:12  profilanswer
 

Exactement
(Ce n'est pas moi qui la créée je veux juste savoir si elle est présente)

n°2066108
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 15:43:17  profilanswer
 

Et dedans il y a quoi ? Comme données de la valeur ?


---------------
Soyez malin, louez entre voisins !
n°2066109
Mackk2
Posté le 25-03-2011 à 15:44:17  profilanswer
 

Une url genre \\serveur\...\etc

n°2066111
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 15:45:35  profilanswer
 

Et toi tu veux tester quoi ?
Si la valeur DWORD existe ou les données de la valeur DWORD ?


---------------
Soyez malin, louez entre voisins !
n°2066113
Mackk2
Posté le 25-03-2011 à 15:47:52  profilanswer
 

Si ScanOCS existe. De toute facon impossible qu'il n'y est rien dans ScanOCS
Hmmmm
à tous les coup faudrait pas que je remplace DWORD par String?

n°2066118
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 15:57:59  profilanswer
 

GetDWORDValue permet de lire les données dans la Valeur DWord, donc ton url
 
D'ailleurs, un truc comme ca serait plus rapide :
Set objWSH = CreateObject("WScript.Shell" )
Debug.Print objWSH.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ScanOCS" )
 
Tu peux d'ailleurs tester s'il y a une erreur ou pas et en fonction dire sil elle y est ou pas.
 
 
Ensuite, pour énumérer les Valeur d'une clé, remplace la ligne 19 par  

Code :
  1. objReg.EnumKey &H80000002, strKeyPath, strValue
  2. For Each Valeurs In strValue
  3. If strValue = "ScanOCS" Then


---------------
Soyez malin, louez entre voisins !
n°2066121
Mackk2
Posté le 25-03-2011 à 16:36:01  profilanswer
 

WOUAHOU!
Rofl Beau Gosse ça marche du tonnerre  
 
Et effectivement String à la place de Dword c'est mieux dans mon cas vu que je ne veux trouver que la valeur chaîne et pas ce qu'il y a dedans
 
Merci c'est génial :D

n°2066123
SuppotDeSa​Tante
Aka dje69r
Posté le 25-03-2011 à 16:51:28  profilanswer
 
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBS] Excel

 

Sujets relatifs
VBS - Copier feuille Excel vers un autre classeur[VBS] Actualiser Classeur Excel
[VBS] Lire un fichier excel[VB/VBA/VBS] Excel - Lien entre Tableau croisé dynamique et cellule
[RESOLU] [VBS] copier uniquement les lignes filtrées sous Excel[VBS][Résolu] Supprimer une ligne dans Excel
[VBS] Commande pour activer le Analysis Toolpack d'Excel[VB/VBA/VBS] Excel vba et Windows 64 bit: problème de shell ?
VBS - Récuperer la valeur d'une cellule excel[VBS]Ouverture d'un classeur excel
Plus de sujets relatifs à : [VBS] Excel


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR