Scripts VBS


Liens utiles

FAQVBS
W3schools online web tutorials
Edietru : Notepad++




Tableaux


Charger un fichier dans un tableau


Sub ChargerFichierDansTAB_1 (sFichier, tt, nbCol, sDelim)
 REM ==================================
 REM Charger un fichier dans un tableau
 REM nbCol : nb de colonnes sur une ligne
 REM sSep : séparateur d'éléments sur une ligne
 REM ==================================
 Dim s, t, i, u
 s = FileReadAll(sFichier)
 t = Split(s, vbCrLf)
 ReDim tt(UBound(t)*nbCol-1)
 For i=0 To UBound(t)
  u = Split(t(i), sDelim)
  For j=0 To nbCol-1
   tt(i*nbCol+j) = u(j)
  Next
 Next
End Sub



Différences entre deux tableaux

'à utiliser pour l'AD, dans un fichier HTM :
'différences groupes d'un utilisateur à l'autres
'différences des memebres de deux groupes

'à utiliser dans Excel dans une procédure VBA

t= Array(_
         "m", "abc", "12", _
         "a", "abc", "12", _
         "f", "abc", "12")
u= Array( _
         "f", "abc", "12", _
         "a", "abc", "12", _
         "m", "abc", "1")

Differences_Between_Two_Tables t, u, 3

Sub Differences_Between_Two_Tables(t, u, widthTab)
    REM ==================================
    REM list the differences, common lines
    REM between two tables
    REM t et u ont la même largeur widthTab (=nb de colonnes)
    REM ==================================
    'brute force :
    'browse each line of each tables
    Dim i, j, b_t_Present_in_u
    Dim k
    Dim bCommonLines
    ReDim tt(UBound(t)/widthTab)      'Dim only makes an error
    ReDim uu(UBound(u)/widthTab)    'ReDim necessary
   
    For i=0 To UBound(t) Step widthTab
     b_t_Present_in_u = FALSE
     For j=0 To UBound(u) Step widthTab
          bCommonLines=TRUE
          For k=1 To widthTab
           'prendre les widthTab de chaque enregistrement
           'attention sensible à la casse !
           If t(i+k-1) <> u(j+k-1) Then bCommonLines=FALSE
          Next
          If bCommonLines Then
           b_t_Present_in_u =TRUE
           Exit For
          End If
     Next
      If b_t_Present_in_u Then
       'marquer élément i de t
       '     et élément j de u comme éléments communs
       Wscript.Echo "Ligne " & i/widthTab & " de t commune à ligne " & j/widthTab & " de u."
       tt(i/widthTab) = "1"  'common lines
       uu(j/widthTab) = "1"  'common lines
       Else
       'marquer élément i de t unique
       Wscript.Echo "Ligne " & i/widthTab & " de t unique."
       tt(i/widthTab) = "1"  'unique line (useless, default value)
      End If
    Next
   
    'here all tt()=0 and uu()=0 means unique lines in t an u
End Sub

QuickSort

Sub QSort_Simple(t,deb,fin,numCol,nbCol)
 REM ========================================
 REM = Trier un tableau linéaire, des indices
 REM = deb à fin, de largeur nbCol
 REM = t(0) : vide (ou indicatif)
 REM = exemple : pour trier en entier
 REM = un tableau à trois colonnes,
 REM = sur la 2ème colonne,
 REM = contenant 25 enregistrements (lignes)
 REM = et qui commence à l'indice 1
 REM = utiliser : QSort_Simple t,1,25,2,3
 REM ========================================
'1. segmenter le tableau au milieu
 Dim i, j, c, p, z
 c = (deb + fin) \ 2        'divison entière
 Do
  i = deb: j = fin
  While LCase(t((i-1)*nbCol+numCol)) <= LCase(t((c-1)*nbCol+numCol)) And i < c:i = i + 1:Wend
  While LCase(t((j-1)*nbCol+numCol)) >= LCase(t((c-1)*nbCol+numCol)) And j > c:j = j - 1:Wend
   'échanger les valeurs
   If i < j Then
    For z=1 To nbCol   'à verifier !!! z=1
        p = t( (j-1)*nbCol+z )
        t( (j-1)*nbCol+z ) = t( (i-1)*nbCol+z )
        t( (i-1)*nbCol+z ) = p
    Next
   End If   
   i = i + 1: j = j - 1
 Loop While i < j
'2. appels récursifs
 If j > deb Then QSort_Simple t,deb,j,numCol,nbCol
 If i < fin Then QSort_Simple t,i,fin,numCol,nbCol
End Sub


Fichiers

Ligne à faire figurer dans la fonction ou bien dans les déclarations de varaibles en début de fichier
Set oFSO = CreateObject("Scripting.FileSystemObject")

Déplacer des fichiers suivant leur extension

Sub Move_Files_Ext_To_Folder(sFolder, sExtensionFichier)
    REM ============================
    REM move the files to the folders created
    REM (intérêt relatif)
    REM ============================
    Dim oFSO, f, dossier, nbDossiersCrees, dossier_a_creer, fichiers, fichier, nom, p, nbFichiersDeplaces
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set dossier = oFSO.GetFolder(sFolder)
    set fichiers = dossier.Files

    For Each fichier in fichiers
      'Wscript.Echo "fichier : " & fichier.Name
      nom = fichier.Name
      If Right(LCase(fichier), 4)= LCase(sExtensionFichier) Then
        p = Instr(nom, " - ")
        If p>0 Then
          dossier_a_creer = Left(nom, p-1)
          If oFSO.FolderExists(dossier_a_creer) Then
           Wscript.Echo "Fichier : " & nom & ", dossier : " & dossier_a_creer
           If oFSO.FileExists(nom) Then
            oFSO.MoveFile nom, dossier_a_creer & "\"  'backslash needed !!!
            nbFichiersDeplaces = nbFichiersDeplaces + 1
           End If
          End If
        End If
      End If
    Next
    Set f = Nothing
    Set oFSO = Nothing
    Wscript.Echo nbFichiersDeplaces & " fichiers déplacés."
End Sub


Lire tout un fichier

Function FileReadAll(sFile)
 REM ========================================
 REM = Renvoie le contenu complet d'un fichier texte
 REM ========================================
 proc = "fn_FileReadAll"
 On Error Resume Next
 Dim f
 Set f = oFSO.OpenTextFile(sFile)
 If Err Then
  Msgbox "Erreur de lecture du fichier " & sFile & vbCrLf & "Fin du programme."
  WScript.Quit(0)
 End If
 FileReadAll = f.ReadAll
 Set f = Nothing
End Function


Lister les dossiers vides


Dim g_nbDossiers_a_Supprimer
ListEmptyFolders "d:\"
Wscript.Echo g_nbDossiers_a_Supprimer & " dossiers vides trouvés."

Sub ListEmptyFolders(sFolder)
    REM ============================
    REM deletes empty subfolders
    REM recursive procedure
    REM ============================
    On Error Resume Next 'pb sur dossiers spéciaux
    Dim oFSO, f, d, dossier, folders
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set f = oFSO.GetFolder(sFolder)
    set folders = f.SubFolders

    For Each d in folders
     ListEmptyFolders oFSO.GetAbsolutePathName(d)
     If oFSO.GetFolder(oFSO.GetAbsolutePathName(d)).Size = 0 Then
      g_nbDossiers_a_Supprimer = g_nbDossiers_a_Supprimer + 1
      Wscript.Echo g_nbDossiers_a_Supprimer & ". " & d
     End If
    Next
   
    Set f = Nothing
    Set oFSO = Nothing
End Sub



Sauver un fichier

Sub SaveToFile (sTexte, sFile)
 REM ========================================
 REM = Sauvegarde un texte dans un fichier
 REM ========================================
 Dim oFSO, f1
 Set oFSO = CreateObject("Scripting.FileSystemObject")
 Set f1 = oFSO.CreateTextFile(sFile)
 f1.Write sTexte
 f1.Close
 Set f1 = Nothing
 Set oFSO = Nothing
End Sub


Supprimer des dossiers vides

Sub DeleteEmptyFolders(sFolder)
    REM ============================
    REM deletes empty subfolders, supprimer des sous-dossiers vides
    REM ============================
    Dim oFSO, f, d, dossier, folders, nbDossiersSupprimes
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set f = oFSO.GetFolder(sFolder)
    set folders = f.SubFolders

    For Each d in folders
     If d.Size = 0 Then
      nbDossiersSupprimes = nbDossiersSupprimes + 1
      oFSO.DeleteFolder d
     End If
    Next
   
    Set f = Nothing
    Set oFSO = Nothing
    Wscript.Echo nbDossiersSupprimes & " dossiers supprimés."
End Sub