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 :

Value like ne fonctionne pas


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut Value like ne fonctionne pas
    Bonjour,

    Dans ma procédure j'ai mis la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     If Tab_ECM(i, 21).Value Like "*report*" Then
    '
    J'ai un message d'erreur à l'exécution (erreur 424, objet requis) ?

    Ce que je voudrais:
    Si la condition est respectée (c'est à dire si la donnée Tab_ECM(i,21) contient le mot "report" alors exécute ce qui suit sinon sort du endif et itère sur i.

    Voici ce que j'ai indiqué juste avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    '
    'Recherche du numéro de la dernière ligne
    '
    derniere_ligne = Range("A1").End(xlDown).Row
    '
    '
    Dim Tab_ECM()
    ReDim Tab_ECM(derniere_ligne - 2, 50)
    '
    Des suggestions ?

    Cdlt.
    Jérôme.

  2. #2
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour,
    Citation Envoyé par licpegpon Voir le message
    J'ai un message d'erreur à l'exécution (erreur 424, objet requis) ?
    Tab_ECM(i, 21) ne serais-ce pas un tableau mémoire ?
    Alors pourquoi .Value ?

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour

    Et ce n'est pas ainsi que l'on affecte une plage à une matrice ...
    Voilà comment on le fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    derniere_ligne = Range("A1").End(xlDown).Row
    Tab_ECM = Range(Cells(1, 1), Cells(derniere_ligne - 2, 50)).Value
    En sus de ce qu'a pointé du doigt Anasecu, que je salue au passage
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Ce tableau contient des valeurs mises en mémoire ce doit être ce que vous dites (pas spécialiste) si je comprends bien je dois supprimer .value....?
    Cdlt.
    Jérôme

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Merci beaucoup à tous les deux....

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    La proposition de unparia remplace les déclarations dim et redim c est cela ?

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    La proposition de unparia remplace les déclarations dim et redim c est cela ?
    Bien évidemment (je pensais avoir été très clair en ce qui concerne cet aspect).
    Au passage : si tu avais essayé, tu n'aurais même pas eu besoin de poser cette question

    Cà, + l'observation justifiée de Anasecu, bien évidement également (une matrice n'a pas de propriété Value).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Je ne suis plus devant l ordinateur ceci explique cela. Je réponds via mon portable.
    Merci bcp.

    Cdlt
    Jérôme

  9. #9
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour unparia

    le .Value est sans doute dû aux conseils de bien préciser les objets : c'est fait même pour ceux qui n'en ont pas

    Bonne soirée à toi.

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour anasecu. Il faut alors espérer que licpegpon sait que sous VBA une matrice n'est pas un objet.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    A l'exécution j'ai le message suivant :

    Nom : Capture1.JPG
Affichages : 545
Taille : 18,0 Ko

    Je n'avais pas ce message dans la précédente version. Ce message est apparu lorsque j'ai remplacé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Tab_ECM()
    ReDim Tab_ECM(derniere_ligne - 2, 50)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tab_ECM = Range(Cells(1, 1), Cells(derniere_ligne - 2, 50)).Value
    Voici le code complet ci-dessous :

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    Sub macro()
    '
    Dim derniere_ligne As Long
    Dim i As Long
    Dim Dossier_racine As String
    '
    'Saisie du dossier racine (valeur par défaut "P:\EXPORT"
    Dossier_racine = InputBox("Select the folder where the database is located", "Data base folder", "P:\EXPORT")
    '
    '------ ON OUVRE LE FICHIER "schema.xml_temporary.xlsx" ET ON VA DANS L'ONGLET "schema.xml_temporary" ------
    '
    Workbooks.Open Filename:=Dossier_racine & "\" & "schema.xml_temporary.xlsx"
    Sheets("schema.xml_temporary").Activate
    '
    'Recherche du numéro de la dernière ligne
    '
    derniere_ligne = Range("A1").End(xlDown).Row
    '
    'MsgBox ("Dernière ligne = ") & derniere_ligne
    '
    MsgBox ("The storage of the database will begin")
    '
    Tab_data = Range(Cells(1, 1), Cells(derniere_ligne - 2, 50)).Value
    '
    '
    'Enregistrement des valeurs dans le tableau
        For i = 0 To derniere_ligne - 2
     
            Tab_data(i, 0) = Range("A" & i + 2)
            Tab_data(i, 1) = Range("B" & i + 2)
            Tab_data(i, 2) = Range("C" & i + 2)
            Tab_data(i, 3) = Range("D" & i + 2)
            Tab_data(i, 4) = Range("E" & i + 2)
            Tab_data(i, 5) = Range("F" & i + 2)
            Tab_data(i, 6) = Range("G" & i + 2)
            Tab_data(i, 7) = Range("H" & i + 2)
            Tab_data(i, 8) = Range("I" & i + 2)
            Tab_data(i, 9) = Range("J" & i + 2)
            Tab_data(i, 10) = Range("K" & i + 2)
            Tab_data(i, 11) = Range("L" & i + 2)
            Tab_data(i, 12) = Range("M" & i + 2)
            Tab_data(i, 13) = Range("N" & i + 2)
            Tab_data(i, 14) = Range("O" & i + 2)
            Tab_data(i, 15) = Range("P" & i + 2)
            Tab_data(i, 16) = Range("Q" & i + 2)
            Tab_data(i, 17) = Range("R" & i + 2)
            Tab_data(i, 18) = Range("S" & i + 2)
            Tab_data(i, 19) = Range("T" & i + 2)
            Tab_data(i, 20) = Range("U" & i + 2)
            Tab_data(i, 21) = Range("V" & i + 2)
            Tab_data(i, 22) = Range("W" & i + 2)
            Tab_data(i, 23) = Range("X" & i + 2)
            Tab_data(i, 24) = Range("Y" & i + 2)
            Tab_data(i, 25) = Range("Z" & i + 2)
            Tab_data(i, 26) = Range("AA" & i + 2)
            Tab_data(i, 27) = Range("AB" & i + 2)
            Tab_data(i, 28) = Range("AC" & i + 2)
            Tab_data(i, 29) = Range("AD" & i + 2)
            Tab_data(i, 30) = Range("AE" & i + 2)
            Tab_data(i, 31) = Range("AF" & i + 2)
            Tab_data(i, 32) = Range("AG" & i + 2)
            Tab_data(i, 33) = Range("AH" & i + 2)
            Tab_data(i, 34) = Range("AI" & i + 2)
            Tab_data(i, 35) = Range("AJ" & i + 2)
            Tab_data(i, 36) = Range("AK" & i + 2)
            Tab_data(i, 37) = Range("AL" & i + 2)
            Tab_data(i, 38) = Range("AM" & i + 2)
            Tab_data(i, 39) = Range("AN" & i + 2)
            Tab_data(i, 40) = Range("AO" & i + 2)
            Tab_data(i, 41) = Range("AP" & i + 2)
            Tab_data(i, 42) = Range("AQ" & i + 2)
            Tab_data(i, 43) = Range("AR" & i + 2)
            Tab_data(i, 44) = Range("AS" & i + 2)
            Tab_data(i, 45) = Range("AT" & i + 2)
            Tab_data(i, 46) = Range("AU" & i + 2)
            Tab_data(i, 47) = Range("AV" & i + 2)
            Tab_data(i, 48) = Range("AW" & i + 2)
            Tab_data(i, 49) = Range("AX" & i + 2)
            Tab_data(i, 50) = Range("AY" & i + 2)
        Next
    '
    'Fin de mise en mémoire
    '
    'Fermeture du fichier "schema.xml_temporary.xlsx" sans sauvegarder
    '
    Workbooks("schema.xml_temporary.xlsx").Close False
    '
    MsgBox ("Data extraction will begin")
    '
    'Extraction des lignes 
    '
    For i = 0 To derniere_ligne - 2
    '
    If Tab_data(i, 21) Like "*report*" Then
    '
        Cells(i + 2, 1) = Tab_data(i, 0)
        Cells(i + 2, 2) = Tab_data(i, 1)
        Cells(i + 2, 3) = Tab_data(i, 2)
        Cells(i + 2, 4) = Tab_data(i, 3)
        Cells(i + 2, 5) = Tab_data(i, 4)
        Cells(i + 2, 6) = Tab_data(i, 5)
        Cells(i + 2, 7) = Tab_data(i, 6)
        Cells(i + 2, 8) = Tab_data(i, 7)
        Cells(i + 2, 9) = Tab_data(i, 8)
        Cells(i + 2, 10) = Tab_data(i, 9)
        Cells(i + 2, 11) = Tab_data(i, 10)
        Cells(i + 2, 12) = Tab_data(i, 11)
        Cells(i + 2, 13) = Tab_data(i, 12)
        Cells(i + 2, 14) = Tab_data(i, 13)
        Cells(i + 2, 15) = Tab_data(i, 14)
        Cells(i + 2, 16) = Tab_data(i, 15)
        Cells(i + 2, 17) = Tab_data(i, 16)
        Cells(i + 2, 18) = Tab_data(i, 17)
        Cells(i + 2, 19) = Tab_data(i, 18)
        Cells(i + 2, 20) = Tab_data(i, 19)
        Cells(i + 2, 21) = Tab_data(i, 20)
        Cells(i + 2, 22) = Tab_data(i, 21)
        Cells(i + 2, 23) = Tab_data(i, 22)
        Cells(i + 2, 24) = Tab_data(i, 23)
        Cells(i + 2, 25) = Tab_data(i, 24)
        Cells(i + 2, 26) = Tab_data(i, 25)
        Cells(i + 2, 27) = Tab_data(i, 26)
        Cells(i + 2, 28) = Tab_data(i, 27)
        Cells(i + 2, 29) = Tab_data(i, 28)
        Cells(i + 2, 30) = Tab_data(i, 29)
        Cells(i + 2, 31) = Tab_data(i, 30)
        Cells(i + 2, 32) = Tab_data(i, 31)
        Cells(i + 2, 33) = Tab_data(i, 32)
        Cells(i + 2, 34) = Tab_data(i, 33)
        Cells(i + 2, 35) = Tab_data(i, 34)
        Cells(i + 2, 36) = Tab_data(i, 35)
        Cells(i + 2, 37) = Tab_data(i, 36)
        Cells(i + 2, 38) = Tab_data(i, 37)
        Cells(i + 2, 39) = Tab_data(i, 38)
        Cells(i + 2, 40) = Tab_data(i, 39)
        Cells(i + 2, 41) = Tab_data(i, 40)
        Cells(i + 2, 42) = Tab_data(i, 41)
        Cells(i + 2, 43) = Tab_data(i, 42)
        Cells(i + 2, 44) = Tab_data(i, 43)
        Cells(i + 2, 45) = Tab_data(i, 44)
        Cells(i + 2, 46) = Tab_data(i, 45)
        Cells(i + 2, 47) = Tab_data(i, 46)
        Cells(i + 2, 48) = Tab_data(i, 47)
        Cells(i + 2, 49) = Tab_data(i, 48)
        Cells(i + 2, 50) = Tab_data(i, 49)
        Cells(i + 2, 51) = Tab_data(i, 50)
    '
      Else
    '
    End If
    '
    Next
    '
    Range("A1").Select
    '
    MsgBox ("Data extraction completed")
    '
    End Sub

    Voici le message que j'avais avec les lignes de commandes dim et redim :

    Nom : Capture.JPG
Affichages : 420
Taille : 17,4 Ko

    Merci par avance.

    Cdlt.
    Jérôme

  12. #12
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Pardi ..les indices que j'ai mis en rouge sont impossibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To derniere_ligne - 2
     
            Tab_data(i, 0) = Range("A" & i + 2)
    En te rappelant que la matrice Tab_data est automatiquement construite par VBA en deux dimensions dont, pour chacune, le premier index est 1et non 0
    Tu l'aurais sans doute découvert en regardant le lbound et le ubound de la matrice

    ET surtout : --->> je ne vois pas pourquoi tu veux reconstruire une matrice qui l'est déjà (construite) !
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    J'ai vu sur le net qu'une matrice partait toujours de 0 sauf si on spécifiait option Base 1 (me semble t-il) en tout début de procédure.

    Trouvé :
    Rappelez-vous que la numérotation d'un tableau commence à 0 (c'est une norme en programmation, autant prendre de bonnes habitudes dès le début même s'il est possible de modifier cela en VBA).

    Après, je suis très humble car débutant j'avoue ne pas tout comprendre (ubound, ...).

    Avec la première boucle je mets en mémoire la totalité de la base de données contenue dans le fichier "schema.xml_temporary.xlsx" (j'ai vérifié via msgbox et j'ai bien les bonnes valeurs) et avec la deuxième boucle je n'extrais que les lignes qui m'intéressent (celles qui contiennent "report"..... Je ne comprends mon (mes) erreurs ? Que veux-tu dire par : je ne vois pas pourquoi tu veux reconstruire une matrice qui l'est déjà (construite)

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    J'ai vu sur le net qu'une matrice partait toujours de 0 sauf si on spécifiait option Base 1
    Ce qui est exact, lorsque l'on construit soi-même une matrice, sans spécifier Option Base.
    Mais là, ce n'est pas toi, qui la construis, cette matrice, mais VBA/Excel.
    Et si j'y ajoute ceeci :
    Après, je suis très humble car débutant j'avoue ne pas tout comprendre (ubound, ...).
    Pardonne-moi, mais maintenant j'arrête là car je ne me sens pas la force de transformer cette discussion en cours particulier.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  15. #15
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    Quand on ne sait pas on ne sait pas d'où mes questions j'en conviens binaires pour un initié....
    Bref, une âme charitable pour m'expliquer simplement ce que je dois corriger dans ma procédure ?
    Mon objectif : faire fonctionner cette macro....ni plus ni moins...même si les choses ne sont pas faites dans les règles de l'art...

    Cdlt.
    Jérôme.

  16. #16
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour,
    Citation Envoyé par licpegpon Voir le message
    une âme charitable pour m'expliquer simplement ce que je dois corriger dans ma procédure ?
    Voilà une façon de faire ce que tu souhaites en utilisant ce que t'expliquait unparia (salut à toi)
    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
    Option Explicit
     
    Sub macro()
    '
    Dim derniere_ligne As Long
    Dim i As Long, lig As Long, col As Long
    Dim Dossier_racine As String
    Dim Tab_data
    '
    'Saisie du dossier racine (valeur par défaut "P:\EXPORT"
    Dossier_racine = InputBox("Select the folder where the database is located", "Data base folder", "P:\EXPORT")
    '
    '------ ON OUVRE LE FICHIER "schema.xml_temporary.xlsx" ET ON VA DANS L'ONGLET "schema.xml_temporary" ------
    '
    Workbooks.Open Filename:=Dossier_racine & "\" & "schema.xml_temporary.xlsx"
    Sheets("schema.xml_temporary").Activate
    '
    'Recherche du numéro de la dernière ligne
    '
    derniere_ligne = Cells(Rows.Count, "A").End(xlUp).Row
    '
    'MsgBox ("Dernière ligne = ") & derniere_ligne
    '
    MsgBox ("The storage of the database will begin")
    '
    'Enregistrement des valeurs dans le tableau
    Tab_data = Range(Cells(1, 1), Cells(derniere_ligne - 2, 50)).Value
    '
    'Fin de mise en mémoire
    '
    'Fermeture du fichier "schema.xml_temporary.xlsx" sans sauvegarder
    '
    Workbooks("schema.xml_temporary.xlsx").Close False
    '
    MsgBox ("Data extraction will begin")
    '
    'Extraction des lignes sur la feuille
    '
    lig = 3
    For i = 1 To UBound(Tab_data)
    '
        If Tab_data(i, 21) Like "*report*" Then
            For col = 1 To UBound(Tab_data, 2)
                Cells(lig, col) = Tab_data(i, col)
            Next col
            lig = lig + 1
        End If
    '
    Next i
    '
    Range("A1").Select
    '
    MsgBox ("Data extraction completed")
    '
    End Sub
    Avec une seule ligne tu remplis ton tableau et avec une seule ligne tu récupères la ligne de données sélectionnée sur ta feuille active du classeur de la macro.

    Si tu regardes un peu le code tu devrais comprendre le fonctionnement.

  17. #17
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Bonsoir anasecu,
    Depuis mon dernier message j ai effectué pas mal de modifs. Notamment je me suis aperçu que ma matrice d entrée de données à mémoriser s' étendait sur la zone A2 : AY 397374 (dernière ligne non vide). C est à dire 51 colonnes et 397373 lignes.
    Ensuite dans ma deuxième boucle je boucle dorénavant de i =1 à derniere_ligne -1. Je ne récupère les données mémorisées de toute la ligne considérée que si les cellules situées à la 22eme colonne (à partir de la 2eme ligne du fichier d entrée de données (xlsx) contiennent le mot "report". Si ce n'est pas le cas je passe à la ligne suivante.
    Ce qui m etonne dans ton code c est que Tab_data est bien déclaré comme un tableau par contre son type (variant, string, ...) n est pas défini ? Est ce normal ?
    Je dis cela car la colonne 22 contient du texte et pleins d autres symboles éventuellement. Dans l état actuel de la macro j'ai une erreur de compatibilité à l execution (erreur 13). Le curseur me signale l erreur à la ligne où il y a l instruction "like". J ai essayé avec dim Tab_data as variant, même résultat, ça plante....
    Je dois joindre un court extrait de mon fichier d entrée de données (celui qui fait pratiquement 400 000 lignes) afin que tu vois les formats des différentes colonnes. Je vais essayer de faire cela demain matin mais celà dépendra de ma disponibilité. C est pas gagné...D autre part je dois anonymiser les données car c est confidentiel. Cela va me prendre un peu de temps. Il faudrait que je prépare un fichier d environ 20-30 lignes et 51 colonnes avec des formats compatibles avec le fichier original...
    Une question : je pense comprendre la commande Ubound quand il n y a qu une dimension mais par contre quand il y en a deux ? Ubound(....,2) ? Qu est ce que ça signifie ?
    Enfin j écris cela de mémoire, n étant pas devant l ordinateur avec mon smartphone qui commence à dater. J espère ne pas m etre trompé.
    Quoi qu il en soit merci beaucoup pour ton aide.
    Cdlt.
    Jérôme

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    j'ai plusieurs choses qui me titille dans ton code

    en premier lieu ton inputbox qui selon moi n'est pas vraiment approprié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Saisie du dossier racine (valeur par défaut "P:\EXPORT"
    Dossier_racine = InputBox("Select the folder where the database is located", "Data base folder", "P:\EXPORT")
    puisque la racine est sensé être modifiée avec quand même une valeur par défaut, pourquoi ne te sert tu pas de Application.FileDialog
    tu a la possibilité avec initialfilename de mettre une racine par défaut

    voir aide (F1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     'Create a FileDialog object as a File Picker dialog box.
        Set fd = Application.FileDialog(msoFileDialogFilePicker)
    la seconde chose
    pourquoi ne rempli tu pas une variable tableau plutôt que cell par cell lors de ta double boucle imbriquée, et a la fin du scrute de ta base injecter le tableau dans la destination ??

    parce que on pourrait alors partir du principe que tu n'a pas besoins de variable tableau
    sachant qu'(une/double) boucle en lecture sur une plage ne va pas moins vite que la même chose avec une variable tableau
    tu scrute tout simplement ta plage et tu retranscrit dans la destination même address d'après ce que j'ai compris de ton code
    tu aurais le même résultat

    je dit cela bien qu'il est préférable d'utiliser des variables tableaux dans l'examens de grande plage mais tel que tu l'utilise tu n'en a pas vraiment besoins tu n'aurais ainsi pas de soucis de base 0 ou 1

    j'ajouterais pour finir qu'un simple filtre(autofilter) sur la base que tu ouvre en récupérant le speciallscells(xlvisible)ferait ma fois très bien l'affaire pas de boucle pas de ....
    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

  19. #19
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Bonjour Patricktoulon,

    Indiqué comme Débutant ?? hum hum ...

    Avant toute chose, méa culpa, j'ai proposé également ma requête sur EXCEL downloads.

    Etant non initié à la programmation VBA il m'arrive de poser des questions (beaucoup trop semble t-il) basiques pour certains initiés et donc il s'en suit régulièrement un arrêt brutal des échanges extrêmement fructueux au demeurant jusque là. Dommage ....
    Mon objectif est avant tout de faire fonctionner correctement mes procédures (sans que celles-ci soient parfaitement conformes aux règles de l'art) tout en respectant des délais (très souvent) très serrés de mon (mes) clients. Ceci explique pourquoi parfois je n'ai pas d'autre recourt que de partir chez XLD, ...

    D'ailleurs une proposition : pourquoi ne pas rajouter une option dans les messages où l'on indiquerait le ou les autres sites sur lesquels on a posé la question ? Un ascenseur sur lequel d'abord on indique le site et ensuite une autre case où l'on indiquerait le lien vers cette question ? Le monde des helpers est très vaste ....

    Bref, ci-après la dernière mouture de mon code (après nombreux échanges sur XLD) :

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    Sub macro()
    '
    Dim derniere_ligne As Long
    Dim i As Long
    Dim statusBarInitial As Long
    Dim Dossier_racine As String
    'Dim Tab_data() As Variant
    '
    'Saisie du dossier racine (valeur par défaut "P:\EXPORT"
    Dossier_racine = InputBox("Select the folder where the ECM database is located", "Data base folder", "P:\EXPORT")
    '
    '------ ON OUVRE LE FICHIER "schema.xml_temporary.xlsx" ET ON VA DANS L'ONGLET "schema.xml_temporary" ------
    '
    Workbooks.Open Filename:=Dossier_racine & "\" & "schema.xml_temporary.xlsx"
    Sheets("schema.xml_temporary").Activate
    '
    'Recherche du numéro de la dernière ligne
    '
    derniere_ligne = Range("A" & Rows.Count).End(xlUp).Row
    '
    MsgBox ("Dernière ligne = ") & derniere_ligne
    '
    MsgBox ("The storage of the database will begin")
    '
    'Cette ligne suffit à elle seule pour remplir le tableau !!
    'La zone mise en mémoire part de la 2ème ligne --> Range("A2") et "derniere_ligne - 1"
    'Le tableau contient 51 colonnes
    '
    Tab_data = Range("A2").Resize(derniere_ligne - 1, 51).Value
    '
    'Fin de mise en mémoire
    '
    'Fermeture du fichier "schema.xml_temporary.xlsx" sans sauvegarder
    '
    Workbooks("schema.xml_temporary.xlsx").Close False
    '
    MsgBox ("Data extraction will begin")
    '
    '
    'Extraction des lignes pour lesquelles "*Report*" apparait en 22ème colonne
    '
    For i = 1 To derniere_ligne - 1
    '
    '
    If Tab_data(i, 22) Like "*Report*" Then
    '
        Cells(i + 2, 1) = Tab_data(i, 1)
        Cells(i + 2, 2) = Tab_data(i, 2)
        Cells(i + 2, 3) = Tab_data(i, 3)
        Cells(i + 2, 4) = Tab_data(i, 4)
        Cells(i + 2, 5) = Tab_data(i, 5)
        Cells(i + 2, 6) = Tab_data(i, 6)
        Cells(i + 2, 7) = Tab_data(i, 7)
        Cells(i + 2, 8) = Tab_data(i, 8)
        Cells(i + 2, 9) = Tab_data(i, 9)
        Cells(i + 2, 10) = Tab_data(i, 10)
        Cells(i + 2, 11) = Tab_data(i, 11)
        Cells(i + 2, 12) = Tab_data(i, 12)
        Cells(i + 2, 13) = Tab_data(i, 13)
        Cells(i + 2, 14) = Tab_data(i, 14)
        Cells(i + 2, 15) = Tab_data(i, 15)
        Cells(i + 2, 16) = Tab_data(i, 16)
        Cells(i + 2, 17) = Tab_data(i, 17)
        Cells(i + 2, 18) = Tab_data(i, 18)
        Cells(i + 2, 19) = Tab_data(i, 19)
        Cells(i + 2, 20) = Tab_data(i, 20)
        Cells(i + 2, 21) = Tab_data(i, 21)
        Cells(i + 2, 22) = Tab_data(i, 22)
        Cells(i + 2, 23) = Tab_data(i, 23)
        Cells(i + 2, 24) = Tab_data(i, 24)
        Cells(i + 2, 25) = Tab_data(i, 25)
        Cells(i + 2, 26) = Tab_data(i, 26)
        Cells(i + 2, 27) = Tab_data(i, 27)
        Cells(i + 2, 28) = Tab_data(i, 28)
        Cells(i + 2, 29) = Tab_data(i, 29)
        Cells(i + 2, 30) = Tab_data(i, 30)
        Cells(i + 2, 31) = Tab_data(i, 31)
        Cells(i + 2, 32) = Tab_data(i, 32)
        Cells(i + 2, 33) = Tab_data(i, 33)
        Cells(i + 2, 34) = Tab_data(i, 34)
        Cells(i + 2, 35) = Tab_data(i, 35)
        Cells(i + 2, 36) = Tab_data(i, 36)
        Cells(i + 2, 37) = Tab_data(i, 37)
        Cells(i + 2, 38) = Tab_data(i, 38)
        Cells(i + 2, 39) = Tab_data(i, 39)
        Cells(i + 2, 40) = Tab_data(i, 40)
        Cells(i + 2, 41) = Tab_data(i, 41)
        Cells(i + 2, 42) = Tab_data(i, 42)
        Cells(i + 2, 43) = Tab_data(i, 43)
        Cells(i + 2, 44) = Tab_data(i, 44)
        Cells(i + 2, 45) = Tab_data(i, 45)
        Cells(i + 2, 46) = Tab_data(i, 46)
        Cells(i + 2, 47) = Tab_data(i, 47)
        Cells(i + 2, 48) = Tab_data(i, 48)
        Cells(i + 2, 49) = Tab_data(i, 49)
        Cells(i + 2, 50) = Tab_data(i, 50)
        Cells(i + 2, 51) = Tab_data(i, 51)
    '
      Else
    '
    End If
    '
    Next
    '
    Range("A1").Select
    '
    MsgBox ("Data extraction completed")
    '
    End Sub
    A l'exécution du code j'ai l'erreur suivante :

    Nom : Capture5.JPG
Affichages : 393
Taille : 17,4 Ko

    le pb se situe à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Tab_ECM(i, 22) Like "*report" Then
    Cdlt.
    Jérôme

  20. #20
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour licpegpon
    Citation Envoyé par licpegpon Voir le message
    Ce qui m etonne dans ton code c est que Tab_data est bien déclaré comme un tableau par contre son type (variant, string, ...) n est pas défini ? Est ce normal ?
    Ton tableau a 50 colonnes avec des informations diverses et donc c'est impossible de les typer autrement qu'en "variant" ce qui est implicite en VBA.

    j'ai une erreur de compatibilité à l execution (erreur 13). Le curseur me signale l erreur à la ligne où il y a l instruction "like".
    Cela est probablement dû à ce que tes données soient issues d'une formule en erreur qu'il faut tester au préalable.

Discussions similaires

  1. [AC-2016] le code vba select from where like ne fonctionne pas avec moi
    Par hama2am dans le forum Access
    Réponses: 3
    Dernier message: 26/02/2019, 09h24
  2. SQL select like ne fonctionne pas sur une base csv
    Par MisterJeanP dans le forum MkFramework
    Réponses: 2
    Dernier message: 07/08/2014, 22h19
  3. [AC-2010] SQL - Like ne fonctionne pas!
    Par captainmakeu dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 28/01/2014, 21h01
  4. <td colspan="<c:out value='${x}'/>" > Ne fonctionne pas
    Par Fused dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 12/10/2009, 17h52

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