IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Variable qui ne se valorise pas [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut Variable qui ne se valorise pas
    Bonjour,

    Voici le contexte.
    Soit nous ouvrons, soit nous avons sous les yeux un classeur dont la colonne "F" contient des noms de fichier avec leur répertoire.
    Exemple : "S:\Dossiers C&C\Documents EC\Suivis paiements\XXXXX Mathieu - 0109 - Suivi des paiements.xlsx"
    Certains de ces fichiers existent vraiment d'autres pas. L'objet du module est de faire la distinction entre les fichiers existants ou non en surlignant ceux qui se trouvent réellement dans le répertoire "suivis paiements".

    Tout va bien jusqu'à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rng = Workbooks(TsrFichOri).Worksheets(TsrTabEnvoiManuel).Columns("F:F").Find(What:=fileList(j), LookAt:=xlWhole)
    La variable rng n'est pas valorisée et évidemment, il ne trouve pas ce qu'on lui demande de chercher.

    Si vous avez une idée, elle est la très bienvenue car pour l'avoir retourné dans tous les sens de ma piètre connaissance, je ne vois pas le souci.
    Le code complet est sous la signature.

    Merci d'avance.

    Henri

    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
    Sub HighlightFoundFiles()
     
        ' Initialize necessary objects and variables
        Dim oFSO As Object
        Dim oFolder As Object
        Dim oFile As Object
        Dim fileList() As String
        Dim i As Integer, j As Integer
        Dim path As String
        Dim ws As Worksheet
        Dim rng As Range
        Dim f As String
     
     
        ' Define the path to the folder
        path = "s:\Dossiers C&C\Documents EC\Suivis paiements\"
     
        ' Create a FileSystemObject
        Set oFSO = CreateObject("Scripting.FileSystemObject")
     
        ' Get the folder
       Set oFolder = oFSO.GetFolder(path)
     
        ' Initialize index variable
        i = 0
     
        ' Loop through each file in the folder
        For Each oFile In oFolder.Files
            ' Add file name into array
            ReDim Preserve fileList(i)
            fileList(i) = oFile.Name
            i = i + 1
        Next oFile
     
        ' Loop through each file in the fileList
        For j = LBound(fileList) To UBound(fileList)
            ' Search for the file in Column F
            Set rng = Workbooks(TsrFichOri).Worksheets(TsrTabEnvoiManuel).Columns("F:F").Find(What:=fileList(j), LookAt:=xlWhole)
     
            ' If the file is found
            If Not rng Is Nothing Then
                ' Highlight the cell in yellow
                rng.Interior.Color = RGB(255, 255, 0)
           End If
        Next j
     
    End Sub

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 524
    Par défaut
    Salut,

    Si Rng vaut Nothing, en théorie, c'est que la valeur renvoyée par fileList(j) n'est pas trouvée.
    Vérifie les valeurs contenues dans ton tableau, et les valeurs dans ta colonne (attention, c'est sensible à la casse).

    Notes supplémentaires:
    Des collections sont peut être plus indiquées que des tableaux dynamiques.
    Ta fonction HighlightFoundFiles est beaucoup trop grosse et viole le SRP (https://en.wikipedia.org/wiki/Single...lity_principle).
    Divise la en plusieurs sous fonctions, ça n'en sera que plus facile à maintenir et à debogger.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Bonjour Deedolith,

    Merci pour ta réponse.
    C'est évidemment la première chose que j'ai vérifié durant l'exécution du code et effectivement, files(j) est bien valorisé:

    Malheureusement, je ne peux pas insérer ici la capture d'écran qui en atteste mais de ce côté-là, tout va bien.

    Pour le reste, je suis un pâle amateur. Je vais lire ton article et tenter d'y comprendre quelque chose.

    Belle journée !

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, teste cette méthode avec dictionnaire:

    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
    Sub HighlightFoundFiles()
     
        ' Initialize necessary objects and variables
        Dim oFSO As Object
        Dim oFolder As Object
        Dim oFile As Object
        Dim dict As Object
        Dim path As String
        Dim ws As Worksheet
        Dim cell As Range
        Dim f As String
     
        ' Define the path to the folder
        path = "s:\Dossiers C&C\Documents EC\Suivis paiements\"
     
        ' Create a FileSystemObject
        Set oFSO = CreateObject("Scripting.FileSystemObject")
     
        ' Get the folder
        Set oFolder = oFSO.GetFolder(path)
     
        ' Create a dictionary
        Set dict = CreateObject("Scripting.Dictionary")
     
        ' Loop through each file in the folder
        For Each oFile In oFolder.Files
            ' Add file name into dictionary
            dict.Add oFile.Name, Nothing
        Next oFile
     
        ' Loop through each cell in Column F
        For Each cell In Workbooks(TsrFichOri).Worksheets(TsrTabEnvoiManuel).Columns("F:F").Cells
            ' Get the file name from the cell value
            f = Right(cell.Value, Len(cell.Value) - InStrRev(cell.Value, "\"))
            ' Check if the file name is in the dictionary
            If dict.Exists(f) Then
                ' Highlight the cell in yellow
                cell.Interior.Color = RGB(255, 255, 0)
            End If
        Next cell
     
    End Sub

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Bonjour Franc,

    Merci pour la proposition.
    Je teste et te reviens.

    H.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 524
    Par défaut
    Citation Envoyé par Henri1830 Voir le message
    C'est évidemment la première chose que j'ai vérifié durant l'exécution du code et effectivement, files(j) est bien valorisé:
    Je voulais dire: Vérifie que les valeurs contenue dans ton tableau sont bien présentes dans ta colonne.

    Citation Envoyé par Henri1830 Voir le message
    Je vais lire ton article et tenter d'y comprendre quelque chose.
    C'est assez simple, le SRP nous dit qu'une fonction ne doit avoir qu'une seule responsabilité.
    En d'autre termes: Elle ne doit s'occuper que d'une seule chose.
    Exemple:
    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
    Public Sub UpdateData()
            '// Ouvre le fichier contenant les données
        Dim Fso As Scriptingl.fileSystemObject
        Set Fso New Scripting.fileSystemObject
     
        Dim IStream As Scripting.TextStream
        Set IStream = Fso.OpenTextStream("c:\temp\monFichier.txt")
     
        Dim Data As Collection
        Set Data = New Collection
     
            '// Lecture du fichier
        While Not IStream.AtEndOfFile
            Data.Add Istream.ReadLine
        Wend
     
            '// Mise a jour des données
        Dim Rng As Excel.Range
        Set Rng = ThisWorkbook.Worksheets(1).Range("A1")
     
        Dim Item As Variant
        For Each Item in Data
            Rng.Value = Item
            Set Rng = Rng.Offset(RowOffset:=1)
        Next
    End Sub
    Cette fonction respecte t'elle le SRP ?
    Clairement non, elle fait 2 chose: Lecture d'un fichier, et mise a jour des cellules (soit une chose de trop).

    Pour y remédier, on va la diviser en 3 fonction:
    1 fonction qui lit les données
    1 fonction qui met à jour les cellules.
    1 fonction qui appelle les 2 précédentes.
    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
    Private Function ReadData() As Collection
            '// Ouvre le fichier contenant les données
        Dim Fso As Scriptingl.fileSystemObject
        Set Fso New Scripting.fileSystemObject
     
        Dim IStream As Scripting.TextStream
        Set IStream = Fso.OpenTextStream("c:\temp\monFichier.txt")
     
        Dim Data As Collection
        Set Data = New Collection
     
            '// Lecture du fichier
        While Not IStream.AtEndOfFile
            Data.Add Istream.ReadLine
        Wend
        Set ReadData = Data
    End Function
     
    Private Sub UpdateCells(ByRef Data As Collection)
        Dim Rng As Excel.Range
        Set Rng = ThisWorkbook.Worksheets(1).Range("A1")
     
        Dim Item As Variant
        For Each Item in Data
            Rng.Value = Item
            Set Rng = Rng.Offset(RowOffset:=1)
        Next
    End Sub
     
    Public Sub UpdateCells()
        Dim Data As Collection
        Set Data = ReadData
     
        UpdateCells Data
    End Sub
    Resultat:
    Les fonctions sont plus courtes, plus facile à lire, plus facile à comprendre.
    Si une fonction plante, tu n'as que peut de code à modifier, donc les fonctions sont plus facile à débugger.
    Si une fonction doit évoluer, tu n'as également que peut de code à modifier, donc les fonctions sont plus facile à maintenir.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut @Franc
    Voilà Franc ; testé et approuvé !
    Ton idée fonctionne à la perfection.
    Je ne connaissais pas ce dictionnaire, je vais approfondir et voir ce à quoi ça peut servir.

    Mille mercis en tout cas et belle journée !

    Henri

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut @Deedolith
    J'ignore si les bambins d'aujourd'hui utilise encore cet acronyme mais de mon temps on aurait terminé ta démonstration par : CQFD => ce qu'il fallait démontrer !
    Cet effectivement plus clair avec tous les avantages que tu décris.
    Même si j'ai la solution grâce à Franc, je testerai ta proposition pour le plaisir... et l'efficacité.

    Merci pour le temps que tu as consacré à mon édification.

    Belle journée !

    Henri

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Notepad++ xdebug] Contenu des variables qui ne s'affiche pas
    Par fepano124 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 25/09/2013, 21h53
  2. VBA- Une variable qui ne s'incrémente pas.Pourquoi ?
    Par gwen.s dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/05/2010, 22h24
  3. valeurs de variable qui ne s'affichent pas toujours
    Par crazylia dans le forum MySQL
    Réponses: 2
    Dernier message: 22/04/2010, 16h00
  4. Réponses: 4
    Dernier message: 11/11/2007, 09h41
  5. Variable qui ne prend aucune pas de valeur
    Par bdptaki dans le forum Delphi
    Réponses: 3
    Dernier message: 29/04/2007, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo