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 :

Comment manipuler une chaine de caractère sur VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Alternant
    Inscrit en
    Octobre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Alternant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 64
    Par défaut Comment manipuler une chaine de caractère sur VBA
    Bonjour a tous

    Je travailles dans un fichier Excel issu d'une extration qui contient plusieurs lignes (environs 20000) et plusieurs colonnes (environs 20). mon problème
    concerne une colonne qui contient des dates (eg: 02/12/2016): je voudrais supprimer les lignes qui ont une date infèrieure au dernier jour du moi ( c'est à dire celles qui sont differentes du 31/.. ou 30/...), peu importe le mois ou l'année. Je voudrais le faire en utilisant un code sur VBA

    Quelle variable ou fonction puis-je utiliser sur VBA qui désigne le jour, dans la date de ma colonne?

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Y-a-t-il un rapport entre le titre de cette discussion et le problème exposé ?

    Car si ce sont des vraies dates, donc stockées numériquement en interne,
    utiliser soit la fonction de feuille de calculs JOUR (voir l'aide d'Excel) ou l'équivalente côté VBA Day.

    Si ce ne sont pas des dates mais du texte, voir du côté de la fonction VBA Split par exemple …
    Sans compter le tutoriel Manipuler les chaînes de caractères en VB6 et VBA Excel !

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    et les filtres alors il servent a quoi???
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Ce qui veut dire :
    - pour chaque date :
    commencer par déterminer le dernier jour du mois de cette date. C'est tout simplement la veille du premier jour du mois suivant, ce qui se détermine très facilement à l'aide de DateSerial
    Question, donc, avant de parler de suppressions de lignes : sais-tu déterminer le dernier jour du mois d'une date spécifiée, à l'aide de DateSerial ?
    Si non : commence par cela.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    tiré de ma fonction nb_jours de ma contrib calendrier
    exemple sur la date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
     
        NB_JOURS = Day(DateSerial(Year(Date), Month(Date) + 1, 1) - 1)
    MsgBox NB_JOURS
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ce qui s'écrit ainsi, Patricktoulon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateSerial(Year(d), Month(d) + 1, 0)
    où d est la date considérée.
    (Dateserial a certaines particularités ad-hoc).

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Voilà !
    (également exposé dans l'aide VBA, d'ailleurs - avec un exemple encore plus poussé )

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    La définition du dernier jour du mois,a toujours été un peut flou pour moi!

    Je ne parle même pas de février! Mais que ce passe-t-il si le dernier jour du mois est un dimanche, en quoi le dernier jour du mois est important?

    peu importe le mois ou l'année.
    on et bien d'accord tous ce qui est supérieur à 31 est inférieur au 31 du mois suivant!
    Dernière modification par AlainTech ; 14/11/2016 à 21h09.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re Bonjour robert je te suis pas trop sur ta dernière réflexion

    tout les mois ne font pas 31 jours

    et tout ce qui est supérieur a 31 du mois et inferieur au 31 du mois suivant

    est donc déjà un raisonnement faux !!!!!!!!! et même une erreur

    d'ailleur fait le test
    msgbox isdate ("31/11/2016")

    tandis que le 1 du mois - 1 jour est forcement le dernier jours du mois précèdent ca c'est catégorique hein!!!!!!

    pas bien dormis cette nuit mon petit robert
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ce que je voulais dire, c'est que le dernier jour du moi travaillé est peut être le,28 si le 31 est un dimanche, d'ou ma réflexion sur la définition su dernière jour du mois!

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    toi tu parle du dernier jour du mois ouvrable
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Membre confirmé
    Femme Profil pro
    Alternant
    Inscrit en
    Octobre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Alternant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 64
    Par défaut
    Merci pour vos réponses

    ce sont bien des dates en valeurs numérique qui sont stockées dans ma colonne. dans mon code je chercher a prendre en compte uniquement la date du 30 ou 31 rien d'autre

    En utilisant la fonction DateSerial: Function DateSerial(Year As Integer, Month As Integer, Day As Integer) As DateTime, je devrais obligatoirement la calculé dans

    ma feuille Excel? sinon, comme je peut faire appelle a la fonction (DateSerial), ou même à l'argument Day de ma fonction, dans une procédure afin de pouvoir appliquer la condition ci-dessous sur ma colonne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    i=i
    Do
    Range("I" & i).Select
    If Day <> 30 Or Day <> 31 Then
    Rows(i).Delete
    i = i
    Else
    i = i + 1
    End If
    Loop While (Sheets("Extraction").Range("A" & i) <> "")
    Excusez ma syntaxe douteuse. J'espère que mon problème est bien posé

  14. #14
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Patrick, tu as raison dans un contexte lambda
    Robert, tu as raison dans un contexte professionnel soumis à jours ouvrées (et/ou ouvrables)

    dans ce second contexte, il suffit d'espionner le JOURSEM de la date du premier jour du mois suivant, et de retrancher en conséquence

    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
    Sub toto()
    Dim LaDate As Date
    Dim LaDateCherchee As Date
     
    LaDate = CDate("01/08/2016")
     
    Select Case DatePart("w", LaDate, vbMonday, vbFirstFourDays)
        Case 1
            LaDateCherchee = LaDate - 3
        Case 7
            LaDateCherchee = LaDate - 2
        Case Else
            LaDateCherchee = LaDate - 1
    End Select
     
    MsgBox LaDateCherchee
     
    End Sub
    Si l'on souhaite prendre en compte les jours fériés, alors il faudra plutôt travailler par combinaison de plusieurs formules de dates, dont NB.JOURS.OUVRES.INTL (Application.WorksheetFunction.NetworkDays_Intl) en lui fournissant en troisième paramètre une plage Excel (ou un tableau) stockant les jours fériés de l'année observée;

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    remplace 1 par le numéro de ta colonne ou la lettre de ta colonne entre guillemet dans les address
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
    If Day(CDate(Cells(i, 1))) < 30 Then Cells(i, 1).EntireRow.Delete
    Next
    End Sub
    edit oupss c'est le contraire j'ai corrigé
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Et le .Value

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Invité
    Invité(e)
    Par défaut
    si j'ai bien compris le mois de février ne t’intéresses pas!

    si tu change d'avis!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim LaDate as date
    LaDate =Now
    Debug.Print CDate(Format(CDate(Format(LaDate , "yyyy-mm-01")) + 31, "yyyy-mm-01")) - 1
    Debug.Print CLng(CDate(Format(CDate(Format(LaDate , "yyyy-mm-01")) + 31, "yyyy-mm-01")) - 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(i, 1)<> CLng(CDate(Format(CDate(Format(Cells(i, 1), "yyyy-mm-01")) + 31, "yyyy-mm-01")) - 1) Then Cells(i, 1).EntireRow.Delete
    Dernière modification par Invité ; 01/11/2016 à 12h54.

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    normalement ceci devrait fonctionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
    ladate = CDate(Cells(i, 1))
    nbjour = IIf(Month(ladate) = 2, Day(DateSerial(Year(ladate), Month(ladate) + 1,0)), 30)
    If Day(ladate) < nbjour Then Cells(i, 1).EntireRow.Delete
    Next
    End Sub
    il est dur ce robert hein !!!

    au puré c'était 30 ou!!! 31
    voila celle la c'est la bonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
    ladate = CDate(Cells(i, 1))
    If Day(ladate) < Day(DateSerial(Year(ladate), Month(ladate) + 1, 0)) Then Cells(i, 1).EntireRow.Delete
    Next
    End Sub
    voila
    peut etre un app.screenupdating false auusi
    ou alors gérer cela dans un tableau
    la base est la
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Invité
    Invité(e)
    Par défaut
    Patrick il faut tenir compte du passage à l'année suivant

    Si tu fais le premier du mois en cours +31 tu tombe forcément au début du moi suivant et tu passe l'année ans problème!

Discussions similaires

  1. Comment manipuler une chaine de caractère
    Par belmehdi17 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/03/2008, 16h03
  2. Réponses: 9
    Dernier message: 19/12/2006, 12h02
  3. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58
  4. Réponses: 2
    Dernier message: 14/01/2005, 15h40
  5. comment vider une chaine de caractère
    Par gaut dans le forum C
    Réponses: 13
    Dernier message: 12/09/2003, 11h30

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