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 :

Fonction Split - Utilisation


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut Fonction Split - Utilisation
    Bonjour à tous,

    J'ai une cellule comportant 5 tirets (a-b-c-d-e-f-g) dont je voudrais isoler la derniere partie (g) et l'insérer dans une cellule (H) de mon sheet Arbor.
    j'tilise pour cela le code ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(Lig, 8) = ReturnNom(FileItem.Name, 5)
    fait appel au code suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function ReturnNom(CellRef As Integer, ElementNumber As Integer)
    Dim Result() As String
    Result = Split(CellRef, "-")
    ReturnNom = Result(ElementNumber - 1)
    End Function
    Mais rien ne se passe. la colonne H reste vide

    Quelqu'un aurait-il la solution ?

    Un grand merci d'avance

    Habiler

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour vous aider, il faudrait savoir quelle est la valeur de FileItem.Name mais je vois déjà un problème. Si CellRef est l'argument qui représente la cellule contenant "a-b-c-d-e-f-g" il devrait être de type Range ou String mais certainement pas de type Integer, à moins que quelque chose m'échappe.

    La fonction Split renvoie une variable tableau à une dimension en lui passant comme premier argument une chaine de caractères
    Cela m'étonne d'ailleurs que vous n'ayez pas eu un message d'erreur.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut
    Il fallait effectivement mettre as range.

    Mais je n'ai tj rien en colonne H.

    Lorsque dans la cellule je mets = ReturnNom(G2,5) cela me donne le résultat exact.mais la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(Lig, 8) = ReturnNom(FileItem.Name, 5)
    ne donne rien

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il fallait effectivement mettre as range.
    Donc vous avez forcément eu un message d'erreur en la testant.

    Sans avoir une explication complète de ce que vous cherchez à faire, ce que vous avez avant et ce que vous espérez après, et avoir à la fois le code de la fonction et celui de la procédure qui l'invoque, ce sera extrêmement compliqué de vous apportez une aide quelconque.

    Voici un exemple d'une procédure qui pourrait vous inspirer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function GetTable(Text As String, _
               Optional Item As Integer, _
               Optional Separator As String = "-") As Variant
      ' Arguments
      '   Text        Chaine de caractères
      '   [Item]      N° du ème élément à renvoyer
      '   [Separator] Caractère qui sépare les éléments à splitter [d:="-"]
      ' Renvoie la table complète (2 dimensions) ou sous forme de chaîne de caractères, l'un des éléments défini par l'argument Item
      Dim t As Variant
      t = Split(Text, Separator)
      GetTable = IIf(Item, t(Item - 1), Application.Transpose(t)) ' GetTable = IIf(Item, t(Item - 1), t)
    End Function

    Exemple 1 avec en cellule C3, la formule =GetTable(A3)

    Nom : 230308 dvp Split Exemple 1.png
Affichages : 82
Taille : 5,2 Ko


    Exemple 2 la formule =GetTable(A3;2) renverra le mot "train" en cellule C3 soit le deuxième élément de la chaîne

    Je ne sais pas quelle version vous utiliser mais si vous avez la version 365, la fonction FRACTIONNER.TEXTE éventuellement combinée avec une autre fonction devrait pouvoir vous aider sans passer par du VBA
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    470
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 470
    Points : 149
    Points
    149
    Par défaut
    Voici le code appelant NomSeul. Le but est que en colonne H se trouve ce qui se trouve après le dernier tiret des cellules de la colonne G.
    Il s'agit d'une arborescence d'un répertoire.


    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 Sub LoadFichiersBoucle(RepDeBase, Lig&)  'appel récursif
    On Error GoTo Suite '(vérif ok) err causée par .Path/.Files sur certains dossiers win
    'Dim NomSeul As Range
    Set SourceFolder = oFSO.GetFolder(RepDeBase)
    For Each FileItem In SourceFolder.Files
    ===>    'NomSeul = ReturnNom(FileItem.Name, 5)
        Lig = Lig + 1
        T& = Int(FileItem.Size / 1024)
        L = Len(FileItem.Name)
        If L > LenFichName Then LenFichName = L
        'afficher l'emplacement du fichier ou l'exécuter
                If OptionLienEmplacement Then
                ActiveSheet.Hyperlinks.Add Anchor:=Cells(Lig, 1), Address:=RepDeBase, TextToDisplay:=CStr(FileItem.Name) '
                Else
                    If FSiExtentionFichOkLien(FileItem.Name) = True Then
                    ActiveSheet.Hyperlinks.Add Anchor:=Cells(Lig, 1), Address:=FileItem.Path, TextToDisplay:=CStr(FileItem.Name)
                    Else
                    ActiveSheet.Hyperlinks.Add Anchor:=Cells(Lig, 1), Address:=RepDeBase, TextToDisplay:=CStr(FileItem.Name) '
                    End If
        End If
        Cells(Lig, 2) = FileItem.DateLastModified 'date
        Cells(Lig, 3) = T& + (1 And T& < 1) 'taille
        ActiveSheet.Hyperlinks.Add Anchor:=Cells(Lig, 4), Address:=RepDeBase '< chemin complet, TextToDisplay:=CStr(SourceFolder.Name)
        Cells(Lig, 6) = RepDeBase '< chemin complet, TextToDisplay:=CStr(SourceFolder.Name)
        Cells(Lig, 7) = CStr(FileItem.Name)
     ===>   'Cells(Lig, 8) = NomSeul
        If Lig Mod 20 = 0 Then Application.StatusBar = Lig - 1 & " Fichiers": DoEvents
    Next
    If InclusSousRep = vbYes Then
       For Each SubFolder In SourceFolder.SubFolders
        If (SubFolder.Attributes And 1024) = 0 Then LoadFichiersBoucle SubFolder.Path, Lig
       Next
    End If
    Suite:
    End Sub
    ' *******Affiche le nom uniquement à l'aide de la fonction SPLIT() ******************

    Function ReturnNom(CellRef As Range, ElementNumber As Integer)
    Dim Result() As String
    Result = Split(CellRef, "-")
    ReturnNom = Result(ElementNumber - 1)
    End Function

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai des doutes quant au fait que FileItem.Name soit un objet Range. Pour moi c'est un objet Fso si je me réfère aux lignes qui précède
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set SourceFolder = oFSO.GetFolder(RepDeBase)
    For Each FileItem In SourceFolder.Files
    ===>    'NomSeul = ReturnNom(FileItem.Name, 5)
    ' ......
    Next
    donc il me semble que vous devriez avoir un message d'erreur lors de l'appel à la fonction et pour moi le premier argument de la fonction doit être typé comme un String

    Dans l'exemple ci-dessous, la fonction renvoie bien "Suis"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub TestReturnNom()
      MsgBox ReturnNom("Allo-Je-Suis-Là", 3)
    End Sub
     
    Function ReturnNom(CellRef As String, ElementNumber As Integer)
      Dim Result() As String
      Result = Split(CellRef, "-")
      ReturnNom = Result(ElementNumber - 1)
    End Function
    Cependant si vous devez toujours renvoyer le dernier éléments séparé par un tiret. Je modifierais le code comme vous pouvez le voir ci-dessous ce qui vous permet de toujours avoir le dernier élément quelques soit son nombre

    J'ai modifié le nom de l'argument car manifestement, ce n'est pas le contenu d'une cellule qui est concernée mais bien une chaine de caractères, même si plus tard vous faites référence à à la valeur contenue dans une cellule cela fonctionnera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function ReturnNom(Text As String)
      Dim Result As Variant
      Result = Split(Text, "-")
      ReturnNom = Result(UBound(Result))
    End Function
    Dans ces exemples ci-dessous nous aurons toujours le dernier élément renvoyé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub TestReturnNom()
      MsgBox ReturnNom("La-pomme-tombe-de-l'arbre")
      MsgBox ReturnNom("Ceci-est-un-Exemple")
      MsgBox ReturnNom("Un-Exemple")
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 058
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonjour

    la fonction TEXTE.APRES est disponible avec les dernières versions d'Excel 365

    Pour récupérer ce qu'il y a après la 6eme occurrence du -
    Pour récupérer ce qu'il y a après la dernière occurrence du -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =TEXTE.APRES(A1;"-";-1)
    Stéphane

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Hello,
    pour aller chercher la dernière partie d'un "Split" tu devrais pouvoir utiliser la fonction VBA inStrRev
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub TestSplit()
       Dim strTest, NomSeul
       strTest = "Mon-Fichier-en-plusieurs-parties-avec-tiret"
       NomSeul = Right(strTest, Len(strTest) - InStrRev(strTest, "-"))
       Debug.Print NomSeul
    End Sub
    et pour ton utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim NomComplet As String
     NomComplet = CStr(FileItem.Name)
     Cells(Lig, 7) = NomComplet
     Cells(Lig, 8) = Right(NomComplet, Len(NomComplet) - InStrRev(NomComplet, "-"))
    où alors à la place utiliser la formule à Raccourcix dans la feuille en colonne H

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Utilisation fonction split
    Par julien terrier dans le forum Langage
    Réponses: 6
    Dernier message: 19/07/2016, 15h34
  2. [XL-2003] Utilisation de la fonction split
    Par TEnergie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/04/2012, 10h37
  3. Comment utiliser la fonction split
    Par developpeur82 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 13/04/2010, 14h22
  4. Réponses: 2
    Dernier message: 15/05/2008, 22h26
  5. probleme utilisation fonction split
    Par Lnmex dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/07/2006, 16h40

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