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 :

Deux feuilles identiques et un bloc d'instruction fonctionnant seulement sur une d'elle


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Deux feuilles identiques et un bloc d'instruction fonctionnant seulement sur une d'elle
    Boujour,

    Je suis actuellement coincé sur un détail de l’appli vba que je développe et suis dans l’incapacité de trouver mon erreur via internet étant donné que je ne sais pas ce qu’il l’a provoque.

    Explication :
    J’ai deux feuilles construites exactement de la même façon (copie du tableau de la première feuille dans la deuxième), seule les valeurs des tableaux changent.

    Parmi les colonnes que j’utilise dans la fonction qui ne fonctionne pas :
    - B : format standard mais qui contient des dates
    - I : format heure (pouvant être >24h)
    - J : format standard contenant pour la ligne n la formule : =NO.SEMAINE(Bn)
    - K : format nombre contenant pour la ligne n la formule : =SI(Jn-1=Jn;SI(In<>"";Kn-1+In;Kn-1);SI(In<>"";In;"00:00:00"))

    Les lignes sont ordonnées par ordre croissant de date dans chaque feuilles
    Dans la colonne J on a le numéro de la semaine de la ligne.
    Dans la colonne K on a donc le cumul, ici, du temps de fonctionnement d’une machine, depuis le début de la semaine.

    Une semaine pouvant être à cheval sur deux mois et mes feuilles représentant chacune le fonctionnement sur un mois, j’appellerais ici feuille1 la feuille du moi précédent celui de la feuille2.

    L’idée dans ma fonction défaillante est qu’elle retourne le cumul du temps de fonctionnement de la dite machine pour une semaine donnée en paramètre.
    Vous trouverez ci-joint ma partie du code qui génère une erreur.
    J’ai préféré commenter mon code plutôt que de me lancer dans de trop longues explications. Rapidement mon problème se résume de cette façon : J'utilise un même bloc d'instruction pour traiter mes deux feuilles, celui ci fonctionne pour le première feuille mais génère une erreur pour la deuxième.
    J’ai évidement testé d’autres façons de faire, sans succès, et commence à penser que l’erreur ne vient pas du code.
    Toutes vos propositions de solution sont donc les bienvenues.

    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
     
    Function MaFonction(NumSemaine As Integer) As Double
     
        Dim dateDebut As Date
        Dim dateFin As Date
        Dim i As Integer
        Dim temp As Double
        Dim resu As Double
     
        'je cherche mes date de debut et fin de semaine
        dateDebut = GetDateFinSemaine(NumSemaine)
        dateFin = GetDateDebSemaine(NumSemaine)
     
        resu = 0
        temp = 0
        If Month(dateDebut) = Month(dateFin) Then       'Je n'ai ici besoin que de feuille1 et ça fonctionne bien
            Worksheets("feuille1").Activate
            i = 2
            While Range("J" & i - 1 & "").Value <> "" Or Range("J" & i - 1 & "").Value <> 0 'parcour des lignes de la feuille
                'Si la ligne pointée a un numero de semaine supérieur de celui recherché ... (ou on est a la fin du tableau)
                If Range("J" & i & "").Value > NumSemaine Or Range("J" & i & "").Value = "" Or Range("J" & i & "").Value = 0 Then
                    '... je prend la valeur de la colonne K (cumul du temps) de la ligne d'avant
                    resu = Range("K" & i - 1 & "").Value
                End If
                i = i + 1
            Wend
        ElseIf Month(dateMax) > Month(dateMin) Then     'J'ai ici besoin de mes deux feuilles et ca ne fonctionne pas pour feuille2
            Worksheets("feuille1").Activate
            i = 2
            While Range("J" & i - 1 & "").Value <> "" Or Range("J" & i - 1 & "").Value <> 0
                If Range("J" & i & "").Value > NumSemaine Or Range("J" & i & "").Value = "" Or Range("J" & i & "").Value = 0 Then
                    resu = Range("K" & i - 1 & "").Value
                End If
                i = i + 1
            Wend
            'Tous fonctionne jusqu'ici, resu prend la valeur voulu
     
            Worksheets("feuille2").Activate
            i = 2
            While Range("J" & i - 1 & "").Value <> "" Or Range("J" & i - 1 & "").Value <> 0
                If Range("J" & i & "").Value > NumSemaine Or Range("J" & i & "").Value = "" Or Range("J" & i & "").Value = 0 Then
                'J'utilise les même test et instructions ...
                    temp = Range("K" & i - 1 & "").Value    '... mais ici que ça ne marche pas : erreur d'execution 13 incompatibilité de type
                End If
                i = i + 1
            Wend
            resu = resu + temp
        Else
            resu = 1
            'prévoir ici le chevauchement sur plusieurs années
        End If
        DifCompteurSemaineT3000 = resu * 60 * 24
    End Function
    J’ai de bonne connaissance en programmation de manière générale mais je suis débutant en vba et ne connais donc pas toutes les fonctions/instructions de ce langage.

    Dans l’attente, je vous remercie par avance et vous souhaite une bonne journée.

    PS : Je suis un nouvel utilisateur de ce forum et suis enclin à prendre en compte toutes remarques concernant mes façons de faire.

    Tamaloo

  2. #2
    Invité
    Invité(e)
    Par défaut erreur d'execution 13 incompatibilité de type
    Bonjour,
    Fais un Debug.Print Range("K" & i - 1 & "").Value
    Et regarde la valeur dans la fenêtre d’exécution [CTRL]+[G]
    C’est un numérique ? := 1.1 ou 1,1
    Le problème ne peut venir que de ton code il fonctionne sur une feuille car les data sont conformes sur la deuxième pas forcément et la nuance entre conforme et pas conforme est mince.
    Tu dois vérifier ça et gérer la mise en conformité des données.

    Quand bien même l’utilisateur aurait entré son prénom !!!


    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
    Function MyIsNumerique(V) As Double
    Dim Vcopie As String
    Vcopie = Trim("" & V)
    If IsNumeric(Vcopie) = False Then
        'pas numerique modifie la virgule , en .
        Vcopie = Replace(Vcopie, ",", ".")
    End If
    If IsNumeric(Vcopie) = False Then
        'pas numerique Option régional Windows ?? . ->,
        Vcopie = Replace(Vcopie, ".", ",")
    End If
    MyIsNumerique = Val(Vcopie) 'Si v=Prénom convertie en 0.0 de toutes les façon retourne un numérique.
    End Function
     
    Function MaFonction(NumSemaine As Integer) As Double
     
        Dim dateDebut As Date
        Dim dateFin As Date
        Dim i As Integer
        Dim temp As Double
        Dim resu As Double
     
        'je cherche mes date de debut et fin de semaine
    '    dateDebut = GetDateFinSemaine(NumSemaine)
    '    dateFin = GetDateDebSemaine(NumSemaine)
     
        resu = 0
        temp = 0
        If Month(dateDebut) = Month(dateFin) Then       'Je n'ai ici besoin que de feuille1 et ça fonctionne bien
            Worksheets("feuil1").Activate
            i = 2
            While Range("J" & i - 1 & "").Value <> "" Or Range("J" & i - 1 & "").Value <> 0 'parcour des lignes de la feuille
                'Si la ligne pointée a un numero de semaine supérieur de celui recherché ... (ou on est a la fin du tableau)
                If Range("J" & i & "").Value > NumSemaine Or Range("J" & i & "").Value = "" Or Range("J" & i & "").Value = 0 Then
                    '... je prend la valeur de la colonne K (cumul du temps) de la ligne d'avant
                    resu = Range("K" & i - 1 & "").Value
                End If
                i = i + 1
            Wend
        ElseIf Month(dateMax) > Month(dateMin) Then     'J'ai ici besoin de mes deux feuilles et ca ne fonctionne pas pour feuille2
            Worksheets("feuille1").Activate
            i = 2
            While Range("J" & i - 1 & "").Value <> "" Or Range("J" & i - 1 & "").Value <> 0
                If Range("J" & i & "").Value > NumSemaine Or Range("J" & i & "").Value = "" Or Range("J" & i & "").Value = 0 Then
                    resu = Range("K" & i - 1 & "").Value
                End If
                i = i + 1
            Wend
            'Tous fonctionne jusqu'ici, resu prend la valeur voulu
     
            Worksheets("feuille2").Activate
            i = 2
            While Range("J" & i - 1 & "").Value <> "" Or Range("J" & i - 1 & "").Value <> 0
                If Range("J" & i & "").Value > NumSemaine Or Range("J" & i & "").Value = "" Or Range("J" & i & "").Value = 0 Then
                'J'utilise les même test et instructions ...
                   Debug.Print Range("K" & i - 1 & "").Value
                    temp = MyIsNumerique(Range("K" & i - 1 & "").Value)    '... mais ici que ça ne marche pas : erreur d'execution 13 incompatibilité de type
                End If
                i = i + 1
            Wend
            resu = resu + temp
        Else
            resu = 1
            'prévoir ici le chevauchement sur plusieurs années
        End If
        DifCompteurSemaineT3000 = resu * 60 * 24
    End Function
    Dernière modification par Invité ; 15/02/2013 à 14h59.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Re,

    Merci pour votre réponse rdurupt, rapide, et efficace, ça fonctionne … mieux, je suis confronté à un autre souci mais vous avez réglé le premier.

    Au plaisir de vous relire, encore merci et bonne journée !

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

Discussions similaires

  1. [XL-2010] Associer des valeurs identiques dans deux feuilles différentes
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/01/2014, 14h38
  2. [XL-2007] fusion deux feuille ont un champ identique
    Par abdelaaziz dans le forum Excel
    Réponses: 1
    Dernier message: 10/12/2012, 11h30
  3. [CSS] deux feuilles de style quasi identiques.
    Par titoumimi dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 02/03/2006, 17h23
  4. MSXML2, enchainer deux feuilles de Style
    Par burno dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 10/09/2003, 13h47
  5. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57

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