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 :

Sauvegarde du résultat des fonctions à la réouverture d'un fichier


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ingénieur modélisation énergétique
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : ingénieur modélisation énergétique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut Sauvegarde du résultat des fonctions à la réouverture d'un fichier
    Bonjour à tous,

    Ça fait quelques jours que je suis sur un problème dont je ne trouve pas le bout... J'ai hésité à poser la question dans le forum "conception"

    J'ai créé des fonctions personnalisées dans excel qui fonctionnent bien en règle générale.

    Après sauvegarde, à la réouverture du fichier excel, certaines des cellules où j'ai mis des fonctions personnalisées, le résultat a été remplacé par une erreur #NOM?.
    J'ai filtré ma fonction au complet, mais je ne vois pas de lien avec cette erreur... J'aimerai que le résultat reste afin de n'être pas obligé de recalculer tout ma page car je suis en calcul manuel.


    Avez vous un peu de lumière pour éclairer ma lanterne creuse? Je suis pas mal à bout de mes compétences

    Salutations à vous et je vous remercie d'avance


    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
     
     
    Function Chercher_Abscisse_Ordonnee(code_ashrae As String, abs_ord_type As String, calcul_debit_act As Variant, unite_cal_debit As String, calcul_largeur_act As Variant, _
                                        unite_cal_distance As String, calcul_hauteur_act As Variant, calcul_vitesse_act As Variant, unite_cal_vitesse As String, _
                                        intrant_longueur As Double, unite_int_longueur As String, intrant_angle As Double, intrant_vitesse As Double, unite_int_vitesse As String, _
                                        intrant_superficie As Double, unite_int_superficie As String, intrant_debit As Double, unite_int_debit As String, intrant_distance As Double, _
                                        unite_int_distance As String, intrant_diametre As Double, unite_int_diametre As String, intrant_rayon As Double, unite_int_rayon As String, _
                                        intrant_ratio As Double, calcul_diamhydro_act As Variant, unite_cal_diamhydro As String, calcul_section_act As Variant, _
                                        unite_cal_section As String, calcul_reynolds_act As Variant, Optional ByVal calcul_debit_amont As Variant, _
                                        Optional ByVal calcul_largeur_amont As Variant, Optional ByVal calcul_hauteur_amont As Variant, _
                                        Optional ByVal calcul_diamhydro_amont As Variant, Optional ByVal calcul_section_amont As Variant, _
                                        Optional ByVal calcul_reynolds_amont As Variant) As Variant
     
     
     
        'Déclaration des différentes variables
        Dim ligne As Integer                                                                            'Le numéro de ligne dans laquelle la fonction s'applique actuellement
        Dim colonne As Integer                                                                        'Le numéro de colonne dans laquelle la fonction s'applique actuellement
        Dim verif_intrant_act As Boolean                                                           'Vérifier que tous les intrants de la position actuelle soient remplis
     
        verif_intrant_act = False
     
     
     
        If code_ashrae <> vbNullString And code_ashrae <> "-" And abs_ord_type <> vbNullString And abs_ord_type <> "-" And IsNumeric(calcul_debit_act) And unite_cal_debit <> vbNullString _
            And IsNumeric(calcul_largeur_act) And unite_cal_distance <> vbNullString And IsNumeric(calcul_hauteur_act) And IsNumeric(calcul_vitesse_act) And unite_cal_vitesse <> vbNullString _
            And IsNumeric(calcul_diamhydro_act) And unite_cal_diamhydro <> vbNullString And IsNumeric(calcul_section_act) And unite_cal_section <> vbNullString And IsNumeric(calcul_reynolds_act) Then
     
            verif_intrant_act = True
            If P_ligne_act > 0 Then Call VERIFIER_CELLULE_VIDE("jaune", Range(Cells(P_ligne_act, P_col_comp_longueur), Cells(P_ligne_act, P_col_specifique_unite)))       'Optimiser
        End If
     
     
     
        If verif_intrant_act = True And P_check_cell_vide = False Then                                                                                                                             'Tester si les variables sont renseignées
            'Convertir les différentes variables pour faire correspondre les unités dans les rapports
            calcul_debit_act = calcul_debit_act * Rapport_Debit(unite_cal_debit)                                                                                                                  'Convertir en m³/h
            If IsNumeric(calcul_debit_amont) And calcul_debit_amont > 0 Then calcul_debit_amont = calcul_debit_amont * Rapport_Debit(unite_cal_debit)                             'Convertir en m³/h
            calcul_largeur_act = calcul_largeur_act * Rapport_Longueur(unite_cal_distance)                                                                                                           'Convertir en m
            If IsNumeric(calcul_largeur_amont) And calcul_largeur_amont > 0 Then calcul_largeur_amont = calcul_largeur_amont * Rapport_Longueur(unite_cal_distance)           'Convertir en m
            calcul_hauteur_act = calcul_hauteur_act * Rapport_Longueur(unite_cal_distance)                                                                                                                  'Convertir en m
            If IsNumeric(calcul_hauteur_amont) And calcul_hauteur_amont > 0 Then calcul_hauteur_amont = calcul_hauteur_amont * Rapport_Longueur(unite_cal_distance)              'Convertir en m
            calcul_vitesse_act = calcul_vitesse_act * Rapport_Vitesse(unite_cal_vitesse)                                                                                                                             'Convertir en m
            If intrant_longueur > 0 And unite_int_longueur <> vbNullString Then intrant_longueur = intrant_longueur * Rapport_Longueur(unite_int_longueur)                               'Convertir en m
            If intrant_vitesse > 0 And unite_int_vitesse <> vbNullString Then intrant_vitesse = intrant_vitesse * Rapport_Vitesse(unite_int_vitesse)                                                'Convertir en m/s
            If intrant_superficie > 0 And unite_int_superficie <> vbNullString Then intrant_superficie = intrant_superficie * Rapport_Surface(unite_int_superficie)                                'Convertir en m²
            If intrant_debit > 0 And unite_int_debit <> vbNullString Then intrant_debit = intrant_debit * Rapport_Debit(unite_int_debit)                                                                  'Convertir en m³/h
            If intrant_distance > 0 And unite_int_distance <> vbNullString Then intrant_distance = intrant_distance * Rapport_Longueur(unite_int_distance)                                                      'Convertir en m
            If intrant_diametre > 0 And unite_int_diametre <> vbNullString Then intrant_diametre = intrant_diametre * Rapport_Longueur(unite_int_diametre)                                                      'Convertir en m
            If intrant_rayon > 0 And unite_int_rayon <> vbNullString Then intrant_rayon = intrant_rayon * Rapport_Longueur(unite_int_rayon)                                                               'Convertir en m
            calcul_diamhydro_act = calcul_diamhydro_act * Rapport_Longueur(unite_cal_diamhydro)                                                                                                                          'Convertir en m
            If IsNumeric(calcul_diamhydro_amont) And calcul_diamhydro_amont > 0 Then calcul_diamhydro_amont = calcul_diamhydro_amont * Rapport_Longueur(unite_cal_diamhydro)           'Convertir en m
            calcul_section_act = calcul_section_act * Rapport_Surface(unite_cal_section)                                                                                                                                    'Convertir en m²
            If IsNumeric(calcul_section_amont) And calcul_section_amont > 0 Then calcul_section_amont = calcul_section_amont * Rapport_Surface(unite_cal_section)                           'Convertir en m²
     
     
     
            'Chercher/calculer la valeur des abscisses ou ordonnée selon la catégorie de l'abscisse ou l'ordonnée pour un accessoire donné
            Select Case abs_ord_type
     
            Case "A0/A1":   Select Case code_ashrae
                            Case "SR7_13", "SR7_14", "SR7_15", "SR7_16", "SR7_17"
                                Chercher_Abscisse_Ordonnee = calcul_section_act / intrant_superficie
                            Case "SD1_02", "SD4_01", "SD4_02", "SR4_01", "SR4_02", "SR4_03", "SR1_01"
                                Chercher_Abscisse_Ordonnee = calcul_section_act / calcul_section_amont
                            Case "ED4_01", "ED4_02", "ER2_01", "ER2_02", "ER4_01", "ER4_02", "ER4_03"
                                Chercher_Abscisse_Ordonnee = calcul_section_amont / calcul_section_act
                            End Select
     
            Case "Ab/A0":       Chercher_Abscisse_Ordonnee = intrant_superficie / calcul_section_act
     
     
     
     
          ' BEAUCOUP DE CAS, J'AI DÉBROUSSAILLÉ...
     
     
            Case "y/H":         Chercher_Abscisse_Ordonnee = intrant_distance / calcul_hauteur_act
     
            Case "-":           Chercher_Abscisse_Ordonnee = "-"
     
            End Select
     
        Else
                                Chercher_Abscisse_Ordonnee = vbNullString
        End If
     
    End Function

  2. #2
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Bonjour,
    Le problème c'est que ta fonction ne se recalcule au moment ou la feuille apparait à l'ouverture d'Excel. Essaie d'ajouter dés le début de ta fonction la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.Volatile

  3. #3
    Membre averti
    Homme Profil pro
    ingénieur modélisation énergétique
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : ingénieur modélisation énergétique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut
    J'avais déjà vu cela.

    Le risque c'est que la fonction va se calculer pour chaque cellule, a chaque fois que la fonction est appelée non? donc allongement du temps de traitement?


    Voici le résultat du Application.Volatile
    A gauche avant fermeture. A droite apres ouverture.

    Nom : av fermer.PNG
Affichages : 142
Taille : 12,5 KoNom : ap ouverture.PNG
Affichages : 171
Taille : 14,2 Ko

  4. #4
    Membre averti
    Homme Profil pro
    ingénieur modélisation énergétique
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : ingénieur modélisation énergétique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut
    A la fin du Select Case, je fais appelle à une Subroutine, pour vérifier les résultats des rapports du Select Case. Je pensais que cetait pas utile de le mettre tantot, mais cest ça qui bug. Quand je commente cette partie, ca ne bug plus


    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
     
            Case "-":           Chercher_Abscisse_Ordonnee = "-"
     
            End Select
     
            'Appeler la fonction pour vérifier que la valeur trouvée soit comprise dans les limites du tableau
            If P_ligne_act > 0 Then
                colonne = Application.Caller.Column
                    If colonne Mod 2 = 1 Then Call VERIFIER_LIMITES_TABLEAU(code_ashrae, abs_ord_type, Chercher_Abscisse_Ordonnee, P_ligne_act, colonne)
            End If
     
        Else
                                Chercher_Abscisse_Ordonnee = vbNullString
        End If
     
    End Function
    Puis la sub de vérification

    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
     
     
    '### VÉRIFIER SI LA VALEUR TROUVÉE EN ORDONNÉE/ABSCISSE EST COMPRISE DANS LES LIMITES DU TABLEAU
     
    Sub VERIFIER_LIMITES_TABLEAU(code_ashrae As String, abs_ord_type As String, abs_ord_valeur As Variant, ligne As Variant, colonne As Variant)
     
        'Déclaration des différentes variables
        Dim tab1_pre_ligne As Integer                                                                   'le numéro de la première ligne du tableau des coefficients
        Dim tab1_pre_colonne As Integer                                                                 'le numéro de la première colonne du tableau des coefficients
        Dim tab1_der_ligne As Integer                                                                   'le numéro de la dernière ligne du tableau des coefficients
        Dim tab1_der_colonne As Integer                                                                 'le numéro de la dernière colonne du tableau des coefficients
        Dim tab1_onglet As String                                                                       'Le nom de l'onglet dans lequel le tableau des coefficients se trouve
        Dim tab1_plage_coor As Range                                                                    'La plage des cellules des valeurs en coordonnées carthésiennes du tableau des coefficients
        Dim tab1_plage_min As Double                                                                    'La valeur minimum de la plage de coordonnées du tableau
        Dim tab1_plage_max As Double                                                                    'La valeur maximale de la plage de coordonnées du tableau
        Dim aff_msg As Boolean                                                                          'La condition d'afficher le message d'avertissement si l'abs_ord n'est pas dans le tableau
        'Dim code_ashrae As String                                                                      'Le code ASHRAE de l'accessoire sélectionné
        'Dim abs_ord_type As String                                                                     'La nom de la catégorie de l'abscisse ou ordonnée
        'Dim abs_ord_valeur As Double                                                                   'La valeur de l'abscisse/ordonnée précédemment calculéé
        'Dim ligne As Integer                                                                           'Le numéro de ligne dans laquelle la fonction s'applique actuellement
        'Dim colonne As Integer                                                                         'Le numéro de colonne dans laquelle la fonction s'applique actuellement
     
     
     
        If abs_ord_type <> vbNullString And abs_ord_type <> "-" And abs_ord_type <> "Flow" _
                    And IsNumeric(ligne) And IsNumeric(colonne) And IsNumeric(abs_ord_valeur) Then      'Tester si les variables sont renseignées
            aff_msg = False
            tab1_pre_ligne = Chercher_Donnee_Tableau_Recap(code_ashrae, "tab1_pre_ligne")
            tab1_pre_colonne = Chercher_Donnee_Tableau_Recap(code_ashrae, "tab1_pre_colonne")
            tab1_der_ligne = Chercher_Donnee_Tableau_Recap(code_ashrae, "tab1_der_ligne")
            tab1_der_colonne = Chercher_Donnee_Tableau_Recap(code_ashrae, "tab1_der_colonne")
            tab1_onglet = Chercher_Donnee_Tableau_Recap(code_ashrae, "Onglet")
     
    '        With Sheets(tab1_onglet)
                Select Case colonne                                                                     'Sélectionner le type de plage de coordonnées en fonction du numéro de colonne
                Case P_col_val1_ordonnee1
                    Set tab1_plage_coor = Range(Sheets(tab1_onglet).Cells(tab1_pre_ligne, tab1_pre_colonne), _
                                                            Sheets(tab1_onglet).Cells(tab1_der_ligne, tab1_pre_colonne))   'Sélectionner la première colonne du tableau des coefficients
                Case P_col_val1_ordonnee2
                    Set tab1_plage_coor = Range(Sheets(tab1_onglet).Cells(tab1_pre_ligne, tab1_pre_colonne + 1), _
                                                            Sheets(tab1_onglet).Cells(tab1_der_ligne, tab1_pre_colonne + 1)) 'Sélectionner la deuxième colonne du tableau des coefficients
                Case P_col_val1_abscisse
                    Set tab1_plage_coor = Range(Sheets(tab1_onglet).Cells(tab1_pre_ligne, tab1_pre_colonne), _
                                                            Sheets(tab1_onglet).Cells(tab1_pre_ligne, tab1_der_colonne))   'Sélectionner la première ligne du tableau des coefficients
                End Select
            End With
     
            With Range(Cells(ligne, colonne - 1), Cells(ligne, colonne))                                'Modifier les caractéristiques des cellules nécessaires à l'interpolation
                tab1_plage_min = Application.WorksheetFunction.Min(tab1_plage_coor)                     'Chercher le minimum de la plage des coordonnées du tableau
                tab1_plage_max = Application.WorksheetFunction.Max(tab1_plage_coor)                     'Chercher le maximum de la plage des coordonnées du tableau
     
                If abs_ord_valeur >= tab1_plage_min And abs_ord_valeur <= tab1_plage_max Then           'Vérifier que la valeur calculé par la fonction est contenu dans la plage des coordonnées
                    .Font.Color = RGB(0, 0, 0)                                                          'Colorier le contenu en rouge
                Else
                    .Font.Color = RGB(255, 0, 0): P_count_limites_coeff = P_count_limites_coeff + 1     'Incrémenter le nombre de cas en dehors de la plage des coordonnées du tableau et colorier en noir
                    If P_count_limites_coeff = 1 Then aff_msg = True                                    'Changer la conditions de l'affichage de l'alerte
                End If
            End With
        Else
            Range(Cells(ligne, colonne - 1), Cells(ligne, colonne)).Font.Color = RGB(0, 0, 0)           'Colorier le contenu en noir quand il y a une coordonnée sans valeur présentement
        End If
     
        'Messages d'alerte FR et EN
        If aff_msg = True And P_langue = "Français" And P_check_activesheet = False Then
            MsgBox ("Attention," & Chr(10) & Chr(10) & "La recherche du coefficient de perte de charge ne peut être effectuée. " & "La valeur de la relation « " & _
            abs_ord_type & " » est en dehors des bornes du tableau des coefficients." & Chr(10) & Chr(10) & "Valeur actuelle :     " & Format(abs_ord_valeur, "# ##0.00") _
            & Chr(10) & "Limites min et max pour cette relation :     " & tab1_plage_min & "  et  " & tab1_plage_max & Chr(10) & Chr(10) & Chr(10) & _
            "Cet avertissement s'applique a toutes les cellules en rouges dans les colonnes Axe-Y et Axe-X.")
        ElseIf aff_msg = True And P_langue = "English" And P_check_activesheet = False Then
            MsgBox ("Warning," & Chr(10) & Chr(10) & "Research of the loss pressure coefficient can't be performed. " & "The value of the relation « " & _
            abs_ord_type & " » is out of bounds from the coefficients table." & Chr(10) & Chr(10) & "Present value :     " & Format(abs_ord_valeur, "# ##0.00") _
            & Chr(10) & "For this relation, the boundaries are :     " & tab1_plage_min & "  et  " & tab1_plage_max & Chr(10) & Chr(10) & Chr(10) & _
            "This caution is relevant for all the red cells in columns Y Axis and X Axis.")
        End If
     
    End Sub

Discussions similaires

  1. [XL-2007] Liaison des fonctions - macro complémentaires - partage de fichier Excel
    Par corentinBEG dans le forum Conception
    Réponses: 3
    Dernier message: 15/01/2015, 01h09
  2. Réponses: 2
    Dernier message: 14/02/2011, 19h30
  3. [Dates] Appeler des fonctions sans attendre leurs résultats
    Par ipeteivince dans le forum Langage
    Réponses: 6
    Dernier message: 05/02/2008, 12h22
  4. Afficher des résultats en fonction d'une valeur de liste
    Par subnox dans le forum VBA Access
    Réponses: 13
    Dernier message: 14/08/2007, 11h54
  5. Réponses: 6
    Dernier message: 20/07/2006, 11h25

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