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 :

Problème de mise à jour fonction personnalisée


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut Problème de mise à jour fonction personnalisée
    Bonjour,

    J'ai un souci de recalcul (qui ne s'effectue pas donc) sur des cellules qui contiennent une fonction personnalisée.
    Elle marche très bien, si je ré-entre dans la cellule puis valide avec entrée.
    J'ai vu qu'il fallait mettre Application.Volatile, ce que j'ai fait, et qui ne fonctionne pas.
    Pour info ma macro/fonction est dans un autre fichier (ouvert) que celui dans lequel s’effectue le calcul.

    Pour infos voici la fonction, en vous remerciant par avance pour votre indulgence (elle est très moche mais elle fonctionne)


    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
    Function CalculStockFinition(Code As String) As String
    Call declA 'cette sub déclare notament FIN comme une worksheet
    Application.Volatile
    Dim Codes() As String, CompteCabine(2) As Currency
    Codes = Split(Code, "/")
     
     
     
    Dim Resultats(0 To 3)
    'remise à zero  - ----- J'imagine qu'un redim ferait l'affaire ?
        Resultats(0) = 0
        Resultats(1) = 0
        Resultats(2) = 0
        Resultats(3) = 0
     
     
    Dim i As Integer, a As Integer
    For i = 0 To UBound(Codes) - 1
     
            Resultats(0) = Resultats(0) + (RechercheValeur(Codes(i), 6, FIN) / 2)
            If RechercheValeur(Codes(i), 9, FIN) > 0 Then
                CompteCabine(0) = CompteCabine(0) + 1
                CompteCabine(1) = CompteCabine(1) + (RechercheValeur(Codes(i), 6, FIN) / 2)
                CompteCabine(2) = CompteCabine(2) + (RechercheValeur(Codes(i), 8, FIN))
            End If
            Resultats(2) = Resultats(2) + ((RechercheValeur(Codes(i), 5, FIN) + RechercheValeur(Codes(i), 9, FIN)) / 2)
            Resultats(3) = Resultats(3) + (RechercheValeur(Codes(i), 7, FIN) / 2)
     
    Next i
            Resultats(0) = Resultats(0)
            If CompteCabine(1) < 1 Then
                Resultats(1) = 0
            Else
            Resultats(1) = Round((CompteCabine(1) / 420) + 1) * (CompteCabine(2) / CompteCabine(0))
     
            End If
     
            Resultats(2) = Resultats(2)
            Resultats(3) = Resultats(3)
     
    CalculStockFinition = Resultats(0) & "/" & Resultats(1) & "/" & Resultats(2) & "/" & Resultats(3)
     
     
    End Function
    En vous remerciant par avance pour vos suggestions.

    EDIT :
    Cette marco fait recalculer la cellule (alors que le bouton recalcul non)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(3, 14).FormulaR1C1 = Cells(3, 14).FormulaR1C1

  2. #2
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,
    ligne 30 --> Resultats(0) = Resultats(0)
    ligne 38 --> Resultats(2) = Resultats(2)
    ligne 39 --> Resultats(3) = Resultats(3)

    çà fait quoi ?

    et
    RechercheValeur(Codes(i), 5, FIN)
    RechercheValeur(Codes(i), 6, FIN)
    RechercheValeur(Codes(i), 7, FIN)
    RechercheValeur(Codes(i), 8, FIN)

    çà donne quoi ?

    reprend ton code ligne par ligne et met des commentaires...le plus possible (tu pourras toujours en enlever par la suite) ... çà aide ceux qui te relisent mais surtout çà t'aide toi

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut
    Bonsoir mjpmjp,

    J'ai nettoyé et commenté mon code, je vous joins aussi le code de la fonction qui manquait à la compréhension

    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
    Function CalculStockFinition(Code As String) As String
    Call declA 'cette sub déclare notament FIN comme une worksheet
    Application.Volatile
    Dim Codes() As String, CompteCabine(2) As Currency
     
    'La variable Code est un string qui peux, par exemple etre : "LAQ1/VRN3/PLA1/"
    Codes = Split(Code, "/")
     
     
    Dim Resultats(0 To 3)
    'remise à zero  - ----- J'imagine qu'un redim ferait l'affaire ?
        Resultats(0) = 0    'nombre de minute de main d'oeuvre par metre carré de finition
        Resultats(1) = 0    'Nombre de minute de main d'auvre incompréssible
        Resultats(2) = 0    'Cout en matériaux par mettre carré
        Resultats(3) = 0    'Cout matériaux incomprésible
     
     
    Dim i As Integer, a As Integer
    For i = 0 To UBound(Codes) - 1  'on boucle pour passer en revu tous les morceau du code, pzr exemple LAQ1, VRN3 puis PLA1
        'on cherche pour le code lu le nombre de minute de MO par m2 qu'on divise par deux
        Resultats(0) = Resultats(0) + (RechercheValeur(Codes(i), 6, FIN) / 2)
     
        'si la cabine est utilisé
        If RechercheValeur(Codes(i), 9, FIN) > 0 Then
            CompteCabine(0) = CompteCabine(0) + 1                                       'On compte une utilisation cabine
            CompteCabine(1) = CompteCabine(1) + (RechercheValeur(Codes(i), 6, FIN) / 2) 'on compte le temps d'utilisation de la cabine divisé par 2
            CompteCabine(2) = CompteCabine(2) + (RechercheValeur(Codes(i), 8, FIN))     'on compte le temps incompréssible de la cabine
        End If
     
        'on compte le cout de matériel au m2 et incompréssible d'utilisation cabine qu'on divise par 2
        Resultats(2) = Resultats(2) + ((RechercheValeur(Codes(i), 5, FIN) + RechercheValeur(Codes(i), 9, FIN)) / 2)
     
        'Valeur qui n'existe plus mais qu'on garde pour ne pas tout refaire
        Resultats(3) = Resultats(3) + (RechercheValeur(Codes(i), 7, FIN) / 2)
    Next i
     
    If CompteCabine(1) < 1 Then 'si la cabine n'est pas utilisé
        'son temps d'utilisation incompréssible est de 0
        Resultats(1) = 0
    Else                        ' si elle est utilisée
        'on arondi le résultat du calcul d'utilisation cabine
        Resultats(1) = Round((CompteCabine(1) / 420) + 1) * (CompteCabine(2) / CompteCabine(0))
    End If
     
    'on rend un résultat sous forme : "15/0/15,21/0"
    CalculStockFinition = Resultats(0) & "/" & Resultats(1) & "/" & Resultats(2) & "/" & Resultats(3)
     
    End Function

    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
    Function RechercheValeur(ByVal CodeRecherche As String, ColoneValeur As Integer, FeuilleDeRecherche As Worksheet)
    'cette fonction cherche dans une feuille particulière la valeur qui est dans la colone "ColoneValeur" de la ligne qui contient le "CodeRecherche"
     
    Dim grandeurDuCode As Integer
    grandeurDuCode = Len(CodeRecherche)
     
    Dim i As Integer
    For i = 1 To FeuilleDeRecherche.Range("A" & Rows.Count).End(xlUp).Row   'Dans la feuille on boucle sur toutes le lignes
        'si le valeur en colone 1 a une longeur au moin aussi longue que le code recherché
        If Len(FeuilleDeRecherche.Cells(i, 1).Value) >= gandeurducode Then
            'si les premier caractère de la cellule contiènnent le code
            If Left(FeuilleDeRecherche.Cells(i, 1).Value, grandeurDuCode) = CodeRecherche Then
               'la fonction ^prend la valeur de ce qu'il y a dans la ColoneValeur de cette ligne
               RechercheValeur = FeuilleDeRecherche.Cells(i, ColoneValeur).Value
               Exit For
            End If
        End If
    Next i
    End Function

  4. #4
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,

    bravo pour les commentaires et le code !

    pour info, tu peu remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    'si le valeur en colone 1 a une longeur au moin aussi longue que le code recherché
        If Len(FeuilleDeRecherche.Cells(i, 1).Value) >= gandeurducode Then
            'si les premier caractère de la cellule contiènnent le code
            If Left(FeuilleDeRecherche.Cells(i, 1).Value, grandeurDuCode) = CodeRecherche Then
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If InStr(1, FeuilleDeRecherche.Cells(i, 1).Value, CodeRecherche, vbTextCompare) > 0  Then
        RechercheValeur = FeuilleDeRecherche.Cells(i, ColoneValeur).Value
    pour ton problème,

    Pour info ma macro/fonction est dans un autre fichier (ouvert) que celui dans lequel s’effectue le calcul.
    est ce que tu "communique" bien avec ton fichier ?
    par exemple : range("a1").value = Workbook(...).Worksheet(...).range(...).value

    pour tester:
    range("a1").value = FeuilleDeRecherche.range(...).value
    ou msgbox FeuilleDeRecherche.range(...).value
    FeuilleDeRecherche= quoi ?

    J'ai un souci de recalcul (qui ne s'effectue pas donc) sur des cellules qui contiennent une fonction personnalisée.
    Elle marche très bien, si je ré-entre dans la cellule puis valide avec entrée.
    aprés cette ligne : Cells(3, 14).FormulaR1C1 = Cells(3, 14).FormulaR1C1
    ta cellule a toujours le même contenu ?

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut
    mjpmjp, Merci de tes encouragements, et de tes optimisation de mon code :-)

    Pour ce qui est de ma communication avec l'autre fichier et avec les worksheet en générale, au début de ma macro j'appelle la sub DeclA

    La voici :


    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
     
    Public MEN As Worksheet, MAT As Worksheet, BAR As Worksheet, QUI As Worksheet, FIN As Worksheet, STO As Worksheet
    Public CAL As Worksheet, DVI As Worksheet, ITM As Worksheet
    Public DATA As Workbook, DeclaOn As Boolean
     
    Sub declA()
        'si on a déja déclaré tout avec decla on laisse tomber
        If DeclaOn = True Then Exit Sub
        DeclaOn = True
     
        'On check que le fichier Data soit bien ouvert ( si c'est pas le cas on l'ouvre et le masque pour ne pas changer d'active workbook
        FichierDataDejaOuvert ("MM-Deviseur-DATA.xlsm")
     
        Set DATA = Workbooks("MM-Deviseur-DATA.xlsm")
    'on met des raccourci pour aller dans les onglet
        Set MAT = DATA.Worksheets("MATIERES")
        Set MEN = DATA.Worksheets("MEN INT")
        Set BAR = DATA.Worksheets("BAREMES")
        Set QUI = DATA.Worksheets("QUINCAILLERIES")
        Set FIN = DATA.Worksheets("FINITIONS")
        Set CAL = Worksheets("CAL") ' <-- je ne declare pas de workbook car cette macro se lance d'un fichier en particulier, il est donc actif, et il change de nom souvent
        Set STO = DATA.Worksheets("STOCK DE FINITIONS")
        Set DVI = DATA.Worksheets("DEVIS")
        Set ITM = DATA.Worksheets("ITEMS")
    End Sub
    Pour ce qui est de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(3, 14).FormulaR1C1 = Cells(3, 14).FormulaR1C1
    Avant de lancer ce code , en N3 j'ai : #VALEUR!
    Après avoir exécuté le code j'ai : 30/0/30,42/0

  6. #6
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,

    pour la "communication" c'est ok

    en ce qui concerne
    'La variable Code est un string qui peux, par exemple etre : "LAQ1/VRN3/PLA1/"
    attention au dernier "/" qui donne Codes(3)=""

    en suite, quand tu fais ta première recherche, et que tu as trouvé ton Codes(i)
    Resultats(0) = Resultats(0) + (RechercheValeur(Codes(i), 6, FIN) / 2)
    toutes les autres recherches ne sont pas utiles, tu peu directement utiliser la valeur de la colonne "6"
    CompteCabine(1) = CompteCabine(1) + (RechercheValeur(Codes(i), 6, FIN) / 2)
    pour le reste je ne comprend pas ce qui ne va pas, tout à l'air de fonctionner
    peut être dans ta commande d'appel ?

    si tu veux réexplique la ou çà coince
    J'ai un souci de recalcul (qui ne s'effectue pas donc) sur des cellules qui contiennent une fonction personnalisée.
    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

Discussions similaires

  1. [XL-2013] Mise à jour fonction personnalisée
    Par jcs75 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 06/12/2024, 17h08
  2. [XL-2010] Problème de mise à jour d'une textbox en fonction de la valeur d'une combobox
    Par benadry dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/06/2014, 10h22
  3. [XL-2010] Mise à jour Fonction personnalisée
    Par Ashireon dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/05/2013, 13h17
  4. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 11h38
  5. problème de mise à jour de BD
    Par tidiane dans le forum Bases de données
    Réponses: 5
    Dernier message: 04/03/2004, 15h32

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