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 :

array incompatibilité de type


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut array incompatibilité de type
    bonjour,

    je tente de mettre en place un macro de récupération de donnée en mode explicite mais rencontre des soucis avec une incompatibilité de type mais j'ai un doute pour Recap_period_Start, PStart en déclaration de variable
    il faut savoir que je cherche ici a récupérer les lignes concernées contenant Y en colonne 8 puis d'autres à terme mais je voudrais avoir plusieurs array start / end etc

    si je tente un msgbox de de Pstart dans le for cela fonctionne mais c'est au niveau de l'array que cela semble avoir un souci
    fin => ligne de fin
    i => ligne detectée si start ou end
    Pstart => array des i start détectés

    dans mon test Pstart détecte 103 et 126

    aussi je ne vois pas pourquoi
    Recap_period_Start = Join(PStart, ", ")
    MsgBox (Recap_period_Start)

    Aussi je voudrais voir avec recap_period_start 103,126

    une idée svp?
    merci

    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
     
    Private Sub Mail_Recap()
    Dim Rep_page, WP_page, Prj_page As Worksheet
    Dim Fin_Rep, i As Integer
    Dim Recap_period_Start, PStart, PEnd As String
     
    il faut récupérer les données pour périodes, WP, projets, deliverables
    Set Rep_page = Worksheets("Reporting")
    Set WP_page = Worksheets("Work-Packages")
    Set Prj_page = Worksheets("Projects")
     
    Fin_Rep = Rep_page.Range("A" & Rows.Count).End(xlUp).Row
    For i = 0 To Fin_Rep
    i = i + 1
     
    If (Rep_page.Cells(i, 8) = "Y") Then
    PStart = Application.Transpose(i)
    End If
     
    If (Rep_page.Cells(i, 9) = "Y") Then
    PEnd = Application.Transpose(i)
    End If
     
    Next
     
    Recap_period_Start = Join(PStart, ", ")
    MsgBox (Recap_period_Start)

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Bonjour,
    Tu utilises mal la syntaxe de la boucle. Syntaxe de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 10
         MsgBox "Nous sommes à l'itération " & i
    Next i
    Surtout ne pas mettre de i = i + 1, c'est le propre de la boucle de faire ce travail !

    Comme ton i représente une ligne : ne le fais pas commencer à 0, mais 1 !

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    Bonjour,

    merci à vous pour ce retour.
    si je mets For i = 0 To Fin_Rep sans rien alors erreur d'exceution 1004
    si je mets For i=1 to Fin_Rep cela fonctionne
    Du reste si je fais MsgBox (PStart) dans la boucle du i alors cela me renvoi bien la ligne

    peut être est ce du à la ligne d'entête

    toutefois j'ai encore le droit à un incompatibilité de type

    cela semble venir de :

    Recap_period_Start = Join(PStart, ", ")
    MsgBox (Recap_period_Start)

    mais je souhaite simplement faire remonter le numéro de ligne soit i et c'est donc un integer selon moi

    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
     
    Private Sub Mail_Recap()
    Dim Rep_page, WP_page, Prj_page As Worksheet
    Dim Fin_Rep, i, PStart, PEnd, Recap_period_Start As Integer
     
    'il faut récuprérer les données pour périodes, WP, projets, deliverables
    Set Rep_page = Worksheets("Reporting")
    Set WP_page = Worksheets("Work-Packages")
    Set Prj_page = Worksheets("Projects")
     
    Fin_Rep = Rep_page.Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To Fin_Rep
     
    If (Rep_page.Cells(i, 8) = "Y") Then
    PStart = Application.Transpose(i) 'renvoi ici 103 
    End If
     
    If (Rep_page.Cells(i, 9) = "Y") Then
    PEnd = Application.Transpose(i)
    End If
     
    Next
     
    Recap_period_Start = Join(PStart, ", ") 'devrait  renvoyer 103,126
    MsgBox (Recap_period_Start)
    End Sub

    merci à vous pour votre aide

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    si je mets For i = 0 To Fin_Rep sans rien alors erreur d'exceution 1004
    si je mets For i=1 to Fin_Rep cela fonctionne
    C'est ce que je t'ai dit dans mon message précédent => il faut que tu commences à 0, car tu fais appel à la ligne 0 dans Cells(i, 8), or la ligne 0 n'existe pas.

    Tu déclares Recap_Period_Start comme un Integer (donc un entier) et ensuite, tu écris dans ton commentaire qu'il devrait être égal à 103,126. Donc ce n'est pas un entier ...

    Je vois pas bien ce que tu veux faire avec Transpose. Le transposé d'un entier est le même entier. Transpose permet de transposer des plages de cellules.
    En fait, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If (Rep_page.Cells(i, 8) = "Y") Then
    PStart = Application.Transpose(i) 'renvoi ici 103 
    End If
    est équivalent à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If (Rep_page.Cells(i, 8) = "Y") Then
    PStart = i 'renvoi ici 103 
    End If
    Du coup, est-ce que l'objectif de ton code est de trouver la ligne sur laquelle il est écrit "Y" ? Parce que si c'est le cas, il serait plus efficace et rapide d'utiliser Find.

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    Mon but global est en effet de trouver les lignes ayant Y en colonne
    ensuite de tout mettre dans un array

    Avec un arrray start
    un array end
    correspondant à des vérfiications de date


    Une fois tout obtenu de différentes sources et onglets c'est pour envoyer un mail contenant plusieurs informations que je récupérerais avec les lignes...

  6. #6
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    je viens de tenter le find mais celui ci ne me renvoi que la premiere ligne detenant Y et pas les suivantes
    comment procéder pour que le find puisse enregistrer les différentes lignes suivantes dans un array?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With [Reporting].ListObject
        Set d = .ListColumns("Check_Start").Range.Find(what:="Y", LookIn:=xlValues, LookAt:=xlWhole)
     MsgBox (d.Row)
     End With

  7. #7
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Pour trouver toutes les entités de Y, je ne passerais pas par un boucle. Quand on fait ce genre d'opérations, mieux vaut passer par un filtre => https://docs.microsoft.com/fr-fr/off...nge.autofilter. Tu peux utiliser une feuille intermédiaire pour inscrire tes résultats.

    1. Tu filtres sur Y avec AutoFilter.
    2. Tu copies la plage
    3. Tu colles dans la feuille intermédiaire
    4. Tu refais la même chose avec l'autre feuille.
    5. Et le tour est joué !

    C'est plus efficace qu'une boucle.

    Pour ajouter la condition des dates, il faudra aussi filtrer sur les colonnes avec les dates.

  8. #8
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonsoir,

    +1 riaolle, j'évite au maximum les boucles pour ce genre de traitement, bien trop chronophage par rapport aux filtres.

    Pour les filtres, je privilégie aussi tant que faire ce peux, l'utilisation de power query ( couplé à une ou plusieurs table de critères) cfr le tuto de Pierre Fauconnier, qui offre bcp d'avantages et facilite grandement les manipulations de table, qui peuvent s'avérer (très) prise de tête en vba dans certains cas.

    DarkAngel, +1 pour l utilisation des tables structuré, cependant évite les notations à crochet pour les raison énumérés ici

    https://www.developpez.net/forums/bl...se-bonne-idee/

  9. #9
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    je vous remercie pour vos retours.

    je vais me plonger dans vos liens afin d'obtenir la bonne solution
    l'autofilter me semble en effet très pertinent!


    j'ai testé et cela fontionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Worksheets("Reporting").Range("A1").AutoFilter _
     Field:=8, _
     Criteria1:="Y", _
     VisibleDropDown:=True
    comment désormais toutefois pouvoir récupérer les lignes concernées par cette autofilter?

    merci

  10. #10
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    j'ai réussi mais ne trouve pas cela tres optimal:

    autre solution plus adéquat svp?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Worksheets("Reporting").Range("A1").AutoFilter _
     field:=8, _
     Criteria1:="Y", _
     VisibleDropDown:=True
     cnt = 1
     max_x = Worksheets("Reporting").Range("A1048576").End(xlUp).row
    For Each cnt In Intersect(Worksheets("Reporting").UsedRange, Worksheets("Reporting").Range("A2:A" & max_x).SpecialCells(xlCellTypeVisible))
    visiblerow = cnt.row
    MsgBox (visiblerow)
    Next
    mon objectif étant de pouvoir simplement récupérer les lignes contenant Y en colonne 8 cela de différentes feuilles afin de mettre le différent numéro de ligne dans un array en vue de pouvoir générer un mail de condensé d'information...

    avec les numéros de lignes je pourrais aller chercher l'ensemble des informations requises mais je ne sais pas si je m'y prends correctemnt non plus

    merci à vous

  11. #11
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Avec le filtre, quand tu copies-colles, tu copies-colles seulement ce qui est filtré. Donc pas besoin d'utiliser des Visible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub copier()
        Dim derLig As Integer
        Dim sh As Worksheet
     
        derLig = Worksheets("Reporting").Range("A" & Rows.Count).End(xlUp).Row         'chercher la dernière ligne du tableau de recherche
        Set sh = Worksheets.Add                  'créer une feuille intermédaire
     
        Worksheets("Reporting").Range("A1").AutoFilter field:=8, Criteria1:="Y"           'filtrer en colonne A sur Y
        Sheets("Reporting").Range("H1:H" & derLig).Copy Destination:=sh.Range("A1")          'copier la colonne H filtrée vers la feuille intermédiaire
    End Sub

  12. #12
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    merci cela fonction en effet et me reporte les lignes concernées dans l'autre feuille.
    néanmoins mon objectif est de garder le numéro de ligne dans un array

Discussions similaires

  1. [XL-2010] incompatibilité de type array
    Par novice06 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/02/2020, 12h13
  2. Message incompatibilité de type
    Par Daniel MOREAU dans le forum Access
    Réponses: 5
    Dernier message: 10/10/2005, 21h57
  3. incompatibilité de type
    Par zooffy dans le forum Access
    Réponses: 2
    Dernier message: 13/06/2005, 16h12
  4. Incompatibilité de types dans un formulaire
    Par ahage4x4 dans le forum ASP
    Réponses: 3
    Dernier message: 03/05/2005, 16h39
  5. [XSD] Incompatibilité des types xs:ID et xs:IDREF ?
    Par Cpt.FLAM dans le forum Valider
    Réponses: 6
    Dernier message: 08/04/2005, 15h54

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