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 :

Récupérer >, < et texte [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut Récupérer >, < et texte
    Bonjour,

    J'ai actuellement ce code :

    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
    Sub RecuperationComplete(typeAnalyse As String, nomCellule As String, formeA As Integer)
    Dim recupVar As String, recupVal As String
    Dim NewLig As Long
    Dim i As Integer
     
    Set wbkAnalyse = ThisWorkbook
    Set shAnalyse = wbkAnalyse.Sheets("contrôle arrivage-final")
     
    On Error GoTo errorValidation
    For i = cNumLigneDebutTableau To cNumLigneFinTableau
        If shAnalyse.Range(nomCellule & i) <> "" Then
            With shExemple
                NewLig = .Cells(Rows.Count, 1).End(xlUp).Row + 1
    'Première cellule on met la forme d'analyse (numéro dans Waste)
                .Range("C" & NewLig).Value = formeA
    'Cellule suivante On récupère le numéro de lot
                .Range("E" & NewLig).Value = shAnalyse.Range(cNumLot).Value
                .Range("A" & NewLig).Value = shAnalyse.Range(cNumLot).Value
    'Cellule suivante On récupère le type d'analyse
                .Range("D" & NewLig).Value = typeAnalyse
    'Cellule suivante On récupère le code d'analyse
                .Range("G" & NewLig).Value = shAnalyse.Range("AA" & i).Value
    'Cellule suivante On récupère la valeur de la mesure
                .Range("I" & NewLig).Value = shAnalyse.Range(nomCellule & i).Value
    'Cellule suivante On récupère le numéro de commande traitement
                .Range("F" & NewLig).Value = shAnalyse.Range(nomCellule & cNumLigneCmdTraitement).Value
    'Cellule suivante on récupère la description du code d'analyse
                .Range("M" & NewLig).Value = shAnalyse.Range("A" & i).Value
            End With
        End If
    Next i
    Exit Sub
     
    errorValidation:
    'Appelle la procédure qui envoit un mail à JFM en cas d'erreur
    'Il faut récupérer : nom procédure, nom fichier, nom numéro lot, code erreur excel, description erreur
    Call EnvoiMailErreurValidation("RecuperationComplete", wbkAnalyse.Name, Err.Number, Err.Description, wbkAnalyse.Path)
    End Sub
    Ce code me permet en fonction de la colonne passé en paramètre de récupérer toutes les valeurs de la colonne et de les mettre à la première ligne vide de mon fichier.
    Cependant cela se complique, si la valeur contient "<" je récupère la valeur qui suit dans la colonne J si la valeur contient ">" je récupère la valeur qui suit dans la colonne K et si la valeur contient du texte (en grande majorité ce sont des nombres) je la met dans la colonne L...

    Je penche dessus actuellement grâce à des Mid ou InStr mais j'avoue que de l'aide ne serait pas de trop...notamment comment puis je faire ma boucle qui vérifie que ma valeur contient du texte et non pas du chiffre...

    Merci d'avance...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Problème a peu près résolu voici mon code :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    '---------------------------------------------------------------------------------------
    ' Procedure : RecuperationComplete
    ' Author    : Administrateur
    ' Date      : 30/09/2010
    ' Purpose   : Récupère toutes les variables du fichier analyse de la colonne demandée
    '---------------------------------------------------------------------------------------
    Sub RecuperationComplete(typeAnalyse As String, nomCellule As String, formeA As Integer)
    Dim recupVar As String, recupVal As String
    Dim NewLig As Long
    Dim i As Integer, positionMaximum As Long, positionMinimum As Long
    Dim EstNumerique As Boolean
    Dim valeurNonNumérique As Boolean
     
    EstNumerique = True
     
     
    Set wbkAnalyse = ThisWorkbook
    Set shAnalyse = wbkAnalyse.Sheets("contrôle arrivage-final")
     
    On Error GoTo errorValidation
    For i = cNumLigneDebutTableau To cNumLigneFinTableau
        If shAnalyse.Range(nomCellule & i) <> "" Then
            valeurNonNumérique = False
            positionMaximum = InStr(shAnalyse.Range(nomCellule & i).Value, "<")
            positionMinimum = InStr(shAnalyse.Range(nomCellule & i).Value, ">")
            EstNumerique = IsNumeric(shAnalyse.Range(nomCellule & i).Value)
            With shExemple
                NewLig = .Cells(Rows.Count, 1).End(xlUp).Row + 1
                If positionMaximum <> 0 Then
                    valeurNonNumérique = True
                    .Range("J" & NewLig).Value = Mid(shAnalyse.Range(nomCellule & i).Value, positionMaximum + 1)
                ElseIf positionMinimum <> 0 Then
                    valeurNonNumérique = True
                    .Range("K" & NewLig).Value = Mid(shAnalyse.Range(nomCellule & i).Value, positionMinimum + 1)
                ElseIf EstNumerique = False Then
                    valeurNonNumérique = True
                    .Range("L" & NewLig).Value = shAnalyse.Range(nomCellule & i).Value
                End If
    'Première cellule on met la forme d'analyse (numéro dans Waste)
                .Range("C" & NewLig).Value = formeA
    'Cellule suivante On récupère le numéro de lot
                .Range("E" & NewLig).Value = shAnalyse.Range(cNumLot).Value
                .Range("A" & NewLig).Value = shAnalyse.Range(cNumLot).Value
    'Cellule suivante On récupère le type d'analyse
                .Range("D" & NewLig).Value = typeAnalyse
    'Cellule suivante On récupère le code d'analyse
                .Range("G" & NewLig).Value = shAnalyse.Range("AA" & i).Value
    'Cellule suivante On récupère la valeur de la mesure
                If valeurNonNumérique = True Then
                    .Range("I" & NewLig).Value = ""
                Else
                    .Range("I" & NewLig).Value = shAnalyse.Range(nomCellule & i).Value
                End If
    'Cellule suivante On récupère le numéro de commande traitement
                .Range("F" & NewLig).Value = shAnalyse.Range(nomCellule & cNumLigneCmdTraitement).Value
    'Cellule suivante on récupère la description du code d'analyse
                .Range("M" & NewLig).Value = shAnalyse.Range("A" & i).Value
            End With
        End If
    Next i
    Exit Sub
     
    errorValidation:
    'Appelle la procédure qui envoit un mail à JFM en cas d'erreur
    'Il faut récupérer : nom procédure, nom fichier, nom numéro lot, code erreur excel, description erreur
    Call EnvoiMailErreurValidation("RecuperationComplete", wbkAnalyse.Name, Err.Number, Err.Description, wbkAnalyse.Path)
    End Sub
    Je récupère bien donc les chiffres si < ou > et des lettres dans la colonne correspondante.
    Il me reste une chose à gérer cependant, si par exemple < 3 % je ne dois récupérer que la valeur 3 et pas le % comment puis je faire en gros pour récupérer que mon numérique après < ?? Même chose si j'ai 35,2% comment faire pour ne récupérer que le 35,2 ?
    J'ai aussi le cas 1<x<2 avec 1 qui va à la colonne K et 2 qui va à la colonne J...

    Merci d'avance
    Windows XP
    Delphi 7

    WinDev Mobile 17

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Je pense avoir résolu le cas 1<x<2 mais je ne sais pas si c'est très propre si vous pouvez m'aider à l'optimiser si besoin...

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    //Déclaration variable
    Public OccurDeuxiemeSigne As Integer
     
     
    Function NbOccurences(chaine As String, caractère As String) As Integer
     
    OccurDeuxiemeSigne = 0
    For n = 1 To Len(chaine)
        If Mid(chaine, n, 1) = "<" Then
            c = c + 1
            If c = 2 Then
                OccurDeuxiemeSigne = n
            End If
        End If
    Next
    NbOccurences = c
     
    End Function
     
    '---------------------------------------------------------------------------------------
    ' Procedure : RecuperationComplete
    ' Author    : Administrateur
    ' Date      : 30/09/2010
    ' Purpose   : Récupère toutes les variables du fichier analyse de la colonne demandée
    '---------------------------------------------------------------------------------------
    Sub RecuperationComplete(typeAnalyse As String, nomCellule As String, formeA As Integer)
    Dim recupVar As String, recupVal As String
    Dim NewLig As Long, positionTemp As Long
    Dim i As Integer, nbOccur As Integer
    Dim positionMaximum As Long, positionMinimum As Long
    Dim EstNumerique As Boolean, valeurNonNumérique As Boolean
    Dim Cible As String, varTemp As String, premierePartie As String, deuxiemePartie As String
     
     
    EstNumerique = True
     
     
    Set wbkAnalyse = ThisWorkbook
    Set shAnalyse = wbkAnalyse.Sheets("contrôle arrivage-final")
     
    On Error GoTo errorValidation
    For i = cNumLigneDebutTableau To cNumLigneFinTableau
        If shAnalyse.Range(nomCellule & i) <> "" Then
            ValTemp = ""
            positionTemp = 0
            valeurNonNumérique = False
            positionMaximum = InStr(shAnalyse.Range(nomCellule & i).Value, "<")
            positionMinimum = InStr(shAnalyse.Range(nomCellule & i).Value, ">")
            EstNumerique = IsNumeric(shAnalyse.Range(nomCellule & i).Value)
            nbOccur = NbOccurences(shAnalyse.Range(nomCellule & i).Value, "<")
     
     
            With shExemple
                NewLig = .Cells(Rows.Count, 1).End(xlUp).Row + 1
                If nbOccur = 2 Then
                    valeurNonNumérique = True
                    positionTemp = InStr(shAnalyse.Range(nomCellule & i).Value, "<")
                    .Range("K" & NewLig).Value = Left(shAnalyse.Range(nomCellule & i).Value, positionTemp - 1)
                    positionTemp2 = Len(shAnalyse.Range(nomCellule & i).Value) - OccurDeuxiemeSigne
                    .Range("J" & NewLig).Value = Right(shAnalyse.Range(nomCellule & i).Value, positionTemp2)
                ElseIf positionMaximum <> 0 Then
                    valeurNonNumérique = True
                    .Range("J" & NewLig).Value = Replace(Mid(shAnalyse.Range(nomCellule & i).Value, positionMaximum + 1), "%", "")
                ElseIf positionMinimum <> 0 Then
                    valeurNonNumérique = True
                    .Range("K" & NewLig).Value = Replace(Mid(shAnalyse.Range(nomCellule & i).Value, positionMinimum + 1), "%", "")
                ElseIf EstNumerique = False Then
                    valeurNonNumérique = True
                    .Range("L" & NewLig).Value = shAnalyse.Range(nomCellule & i).Value
                End If
                'Première cellule on met la forme d'analyse (numéro dans Waste)
                .Range("C" & NewLig).Value = formeA
                'Cellule suivante On récupère le numéro de lot
                .Range("E" & NewLig).Value = shAnalyse.Range(cNumLot).Value
                .Range("A" & NewLig).Value = shAnalyse.Range(cNumLot).Value
                'Cellule suivante On récupère le type d'analyse
                .Range("D" & NewLig).Value = typeAnalyse
                'Cellule suivante On récupère le code d'analyse
                .Range("G" & NewLig).Value = shAnalyse.Range("AA" & i).Value
                'Cellule suivante On récupère la valeur de la mesure
                If valeurNonNumérique = True Then
                    .Range("I" & NewLig).Value = ""
                Else
                    .Range("I" & NewLig).Value = shAnalyse.Range(nomCellule & i).Value
                End If
                'Cellule suivante On récupère le numéro de commande traitement
                .Range("F" & NewLig).Value = shAnalyse.Range(nomCellule & cNumLigneCmdTraitement).Value
                'Cellule suivante on récupère la description du code d'analyse
                .Range("M" & NewLig).Value = shAnalyse.Range("A" & i).Value
            End With
        End If
    Next i
    Exit Sub
     
    errorValidation:
    'Appelle la procédure qui envoit un mail à JFM en cas d'erreur
    'Il faut récupérer : nom procédure, nom fichier, nom numéro lot, code erreur excel, description erreur
    Call EnvoiMailErreurValidation("RecuperationComplete", wbkAnalyse.Name, Err.Number, Err.Description, wbkAnalyse.Path)
    End Sub
    Donc pour ce code je déclare une variable globale Public OccurDeuxiemeSigne As Integer pour stocker la position de la deuxième <. J'ai une fonction qui me permet de calculer le nombre d'occurences de "<" par la même occasion j'affecte la position de la deuxième "<" dans ma variable. Et donc dans ma boucle principale si mon Nombre d'occurences = 2 soit 2 <.... je récupère la première partie en récupérant la position de la première < et je fais un Left jusque là.
    Puis avec la position de la deuxième < je fais un right jusque là ... en ayant au préalable soustrait la position à la longueur totale de ma chaine avec un Len ...

    J'attends vos lumières si vous pouvez ...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  4. #4
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    pour éviter la boucle sur le string et Mid regarde à INSTR dans l'aide en ligne.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    POur éviter ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function NbOccurences(chaine As String, caractère As String) As Integer
     
    OccurDeuxiemeSigne = 0
    For n = 1 To Len(chaine)
        If Mid(chaine, n, 1) = "<" Then
            c = c + 1
            If c = 2 Then
                OccurDeuxiemeSigne = n
            End If
        End If
    Next
    NbOccurences = c
     
    End Function
    J'ai regardé l'aide Excel mais je vois pas ...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  6. #6
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    INSTR te renvoie la première position d'une sous-chaine dans une chaine.

    Excellent moyen de tester si < est dans ta chaine et où en une seule instruction.

    Si c'est ce que tu veux faire.

    Mais c'est juste une suggestion. laisse tomber si tu es satisfait de ton Mid car il est propre.

    A+
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 03/07/2009, 16h27
  2. [C# 3.5] Récupérer et manipuler le texte d'une fenêtre
    Par Yukizz dans le forum Windows Forms
    Réponses: 0
    Dernier message: 12/05/2009, 10h27
  3. [MySQL] récupérer la moitié du texte via une requete SQL
    Par wallawalla dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/02/2009, 23h43
  4. Récupérer une zone de texte dans recordset
    Par lionking03 dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/07/2008, 22h55

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