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 :

écrire dans une cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Par défaut écrire dans une cellule
    Bonjour,

    J'ai un petit problème pour écrire une variable dans une cellule.

    La formule que j'ai l'habitude d'utiliser est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Coaxial").Cells(Index, 4).Value = Total_Ambient
    hors, cette fois je n'appelle pas ma macro dans la même feuille que celle ou je veux écrire ma variable!

    J'ai essayé d'appeler la feuille en question avant d'y écrire quoi que ce soit...
    (with Worksheets("..") end with)
    J'ai même essayé d'activer la cellule...
    (avec .activate)

    Mais rien n'y fait!
    En plus je n'ai même pas de message d'erreur pour m'aider un peu.

    Quelqu'un aurait-il une idée???

    merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    Bonjour

    Ta ligne de code me semble correct et je ne vois que deux possibilité.

    A tu vérifié les valeur de Index et Total_Ambient au moment ou la ligne vas être exécuté avec un point d'arrêt pour vérifier que les valeurs sont bonne.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Par défaut
    J'ai bien vérifié (je viens de le faire!)
    la valeur d'Index est bien celle que j'attendais
    et la valeur de Total_Ambient aussi!

    ce que je ne comprend pas c'est la valeur de Total_ambient j'arrive a l'afficher dans une autre feuille (celle qui apelle ma macro) et cet affichage fonctionne bien!

    CoaxLoss = Total_Ambient

    CoaxLoss est le nom de la fonction que j'apelle dans la feuille 1 et je veux ecrire dans la feuille 2 ("coaxial").

    voila...
    j'en suis perplexe..

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    OK je pense y voir un peu plus clair

    1) Le fait d'écrire CoaxLoss = Total_Ambient n'appelle pas a fonction mais assigne la valeur de Total_Ambient a une variable CoaxLoss

    L’appel à la fonction devrait être du style CoaxLoss(Total_Ambient)

    2) Si j’ai bien compris ta fonction CoaxLoss ce trouve dans le code de la feuille « Coaxial » si tu désire l’appeler tu doit le faire du même endroit.
    Si tu veux pouvoir appeler ta fonction de n’importe ou met la plutôt dans un module

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Par défaut
    héééé non!
    en fait je m'exprime assez mal je pense! (heureusement je ne fais pas d'enseignement!)

    je reprend depuis le début avec plus d'info:

    dans une feuille (apellée "donnéescalcul") j'apelle un module (c'est j'ai mal exprimé mon problème) qui s'apelle "ComputeLoss". ce module fait apel a differentes fonctions dont ma fonction "CoaxLoss".

    j'ai defini Coaxloss comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function CoaxLoss(sCoax As String, sTemp As String, CHAN As String, sSSI As String, DOCON As String, UPCON As String) As Double
    ...
    end function
    donc cette fonction est sencée renvoyé un double. Ce qu'elle fait parfaitement! (j'arrive qd meme a faire quelques trucs )

    dans cette fonction je calcule les pertes de coax (comme son nom l'indique) que je "range" dans la variable "Total_Ambient".

    ensuite j'essaie d'afficher cette variable dans une autre feuille ("coaxial") à l'endroit qui me va bien. cette partie ne fonctionne pas donc je l'ai mise en commentaires tant que je n'ai pas de solution.

    et enfin je dit a ma fonction (CoaxLoss) qu'elle doit prendre la valeur de Total_Ambient pour que ComputeLoss (le module apelé) prenne cette valeur!

    et comme je fait apel a ce module ComputeLoss dans la feuille "donnéescalcul", j'ai ma variable Total_Ambient qui s'affiche là ou il faut!

    sauf que comme c'est pas un petit tableur tout simple, je dois aussi faire une feuille récapitulative des pertes de mes coax, d'ou la feuille "coaxial" ou j'essaie d'afficher cette put..."bip" de variable! (non je ne suis pas énervée.. ça fait juste une semaine que j'essaie de l'afficher... zen!)

    voila.

    j'espere qu'avec tout ca c'est plus claire!

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par pyrene Voir le message
    CoaxLoss = Total_Ambient

    CoaxLoss est le nom de la fonction que j'apelle dans la feuille 1 et je veux ecrire dans la feuille 2 ("coaxial").
    Il y a une grosse incohérence dans ce que tu dis.

    Si CoaxLoss est une fonction, tu ne peux pas lui assigner une valeur ailleurs que dans son propre code.

    Citation Envoyé par pyrene Voir le message
    je dit a ma fonction (CoaxLoss) qu'elle doit prendre la valeur de Total_Ambient pour que ComputeLoss (le module apelé) prenne cette valeur!
    Appeler un module???

    Qu'entends-tu par là?

    Je pense qu'il serait nettement plus simple que tu nous postes la totalité de ton code ou que tu nous joignes le fichier.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Par défaut
    il est vrai que je ne suis pas toujours tres claire.. et en plus je n'utilise pas forcement les bons termes! en meme temps c'est pas mon métier...
    bref voici le code (il est long):

    fonction appellée dans la feuille "donneescalcul" du classeur
    (en gros : en fonction du nom qui se trouve dans la cellule, la fonction va appeler une autre fonction)

    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
    Function ComputeLoss(sName As String, sSSI As String, _
    sTemp As String, sPerfo As String) As Double
     
    Dim LNA As String, DOCON As String, CHAN As String
    Dim RXCOV As String, UPCON As String, Freq As String
    Dim Imux_FA As String, i As Integer, DC_OK As String, UC_OK As String
     
    RXCOV = Left(sSSI, 4)
    LNA = Right(Left(sSSI, 7), 3)
    DOCON = Right(Left(sSSI, 10), 3)
    CHAN = Right(Left(sSSI, 21), 4)
    UPCON = Right(Left(sSSI, 13), 3)
     
        If ((Asc(Left(sName, 1)) > 48) And (Asc(Left(sName, 1)) < 58)) Then
            'Premiere lettre de sName est un chiffre de 1-9
            '1BC/9CP/1DA/1PF/1CT/xSC/xSD/1TP/1TP/1HP/1DP/1CL
            Select Case Right(Left(sName, 3), 2)
                Case "BC"
                    ComputeLoss = IsoLoss(sName, LNA, CHAN)
                Case "CP"
                    ComputeLoss = CoupleurLoss(sName, CHAN, sTemp)
                Case "DA"
                    ComputeLoss = DividerAssemblyLoss(sName, RXCOV, DOCON, UPCON, sTemp, CHAN)
                Case "PF"
                    ComputeLoss = PreselectFilterLoss(sName, CHAN, RXCOV, DOCON, sTemp)
                Case "CT"
                    ComputeLoss = InputTestCoupleurLoss(sName)
                Case "SC"
                    ComputeLoss = SwitchLoss(sName, sSSI)
                Case "SD"
                    ComputeLoss = SwitchLoss(sName, sSSI)
                Case "ST"
                    ComputeLoss = SwitchLoss(sName, sSSI)
                Case "SR"
                    ComputeLoss = SwitchLoss(sName, sSSI)
                Case "TP"
                    ComputeLoss = -0.02
                Case "CL"
                    ComputeLoss = CampLoss(sName, sTemp)
                Case "HP"
                    ComputeLoss = HPILoss(sName, sTemp)
                Case "DP"
                    ComputeLoss = DiplexerLoss(sName, sSSI, sTemp)
                Case "TG"
                    ComputeLoss = -0.12
                Case "TW"
                    ComputeLoss = HPALoss(sName, sSSI, sTemp, sPerfo)
                Case "FL"
                    ComputeLoss = BandPassFilterLoss(sName, sTemp)
                Case "FE"
                    ComputeLoss = InputFilterLoss(sName, sSSI, sTemp)
                Case "NF"
                    ComputeLoss = NRFLoss(sName, sTemp)
                Case "MS"
                    ComputeLoss = OmuxLoss(sName, sSSI, sTemp)
                Case "RE"
                    DC_OK = False
                    ComputeLoss = ExtractValue_LNARX(sName, sSSI, sPerfo, sTemp)
                Case "LN"
                    ComputeLoss = ExtractValue_LNARX(sName, sSSI, sPerfo, sTemp)
                Case "DC"
                    If UPCON = "" Then
                        UC_OK = True
                    End If
                    DC_OK = True
                    ComputeLoss = ExtractValue_DOCON(sName, sSSI, sPerfo, sTemp)
                Case "UC"
                    UC_OK = True
                    ComputeLoss = ExtractValue_UPCON(sName, sSSI, sPerfo, sTemp)
            End Select
     
        Else
            'Le premier caractère de sName est une lettre
            'Axxx/Wxxx/Cxxx/Exxx/
            Select Case Left(sName, 1)
                Case "I"
                    'C'est un imux ou un FA
                    Imux_FA = Right(Left(sName, 6), 2)
                    Select Case Imux_FA
                        Case "ME"
                            ComputeLoss = ImuxFALoss(sName, sSSI, sTemp)
                        Case "FA"
                            ComputeLoss = ImuxFALoss(sName, sSSI, sTemp)
                    End Select
                Case "A"
                    ComputeLoss = AttenLoss(sName)
                Case "W"
                    'Guide
                    ComputeLoss = GuideLoss(sName)
                Case "C"
                    'Coax
                    ComputeLoss = CoaxLoss(sName, sTemp, CHAN, sSSI, DOCON, UPCON)
                Case "E"
                    'Negligé
                    ComputeLoss = 0
            End Select
        End If
     
    End Function

    la fonction CoaxLoss (celle qui me pose probleme) : en gros c'est le calcul des pertes du coax en fonction de plusieurs parametres (nom du canal, type de cable, temperature)

    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
    Function CoaxLoss(sCoax As String, sTemp As String, CHAN As String, sSSI As String, DOCON As String, UPCON As String) As Double
        
        Dim vCell As String, Index As Variant, Test As String, Freq As String, CHAN_Type As String
        Dim Coax_Type As String, Coax_Lenght As Double, Loss_Coax As Double, Conn_Loss As Double
        Dim Taux_Temp As Double, Total_Ambient As Double, Total_Hot As Double
        Dim Name_equip As String, UC_OK As String, DC_OK As String, i As Integer
        Dim Index_coax As Integer, Index_DC As Integer, Index_UC As Integer, Index_SSI As Integer
        
        DC_OK = False
        UC_OK = False
        'recherche du SSI dans l'onglet calcul_ssi_input
        Index_SSI = Application.Match(sSSI, Range("Cosy_SSI_input!A1:A465"), 0)
        'recherche du coax en question dans le SSI qu'on vient de trouver!
        For i = 2 To 108
            Name_equip = Worksheets("Cosy_SSI_input").Cells(Index_SSI, i)
            If Name_equip = sCoax Then
                Index_coax = i
            ElseIf Left(Name_equip, 3) = "1DC" Then
                Index_DC = i
            ElseIf Left(Name_equip, 3) = "1UC" Then
                Index_UC = i
            End If
        Next i
    
        If Index_coax < Index_DC Then
            DC_OK = False
            UC_OK = False
        ElseIf Index_coax > Index_DC Then
            DC_OK = True
            If UPCON = "___" Then
                UC_OK = True
            ElseIf Index_coax < Index_UC Then
                UC_OK = False
            ElseIf Index_coax > Index_UC Then
                UC_OK = True
            End If
        End If
        
        'Find a match for the coax name on Sheet vfeuille
        'Index = Application.Match(sCoax, Range("Coaxial!A1:A925"), 0)
        For Index = 1 To 925
            If InStr(1, Worksheets("Coaxial").Cells(Index, 1), sCoax) Then
                Test = True
                Exit For
            End If
        Next Index
        
        Coax_Type = Worksheets("Coaxial").Cells(Index, "B") 'type du cax
        Coax_Lenght = Worksheets("Coaxial").Cells(Index, "C")   'longueur du coax en mm
        CHAN_Type = Left(CHAN, 2)
        
        Select Case CHAN_Type
            Case "A_"
                Freq = "Bas"    'Bande du bas
            Case "EA", "ER", "FH"
                Freq = "Haut"   'Bande du haut
            Case Else
                Freq = "Autre"  'autre coax des chemin LNA
        End Select
        
        'Recapitulatif des pertes (dB et dB/m)
        Select Case Coax_Type
            Case "5mm(.190)"
                If DC_OK = False Then
                    Loss_Coax = Worksheets("coaxial").Cells(3, "H")
                ElseIf DC_OK = True And UC_OK = True And Freq = "Autre" Then
                    Loss_Coax = Worksheets("coaxial").Cells(4, "H")
                ElseIf DC_OK = True And UC_OK = True And Freq = "Haut" Then
                    Loss_Coax = Worksheets("coaxial").Cells(5, "H")
                ElseIf DC_OK = False And Freq = "Bas" Then
                   Loss_Coax = Worksheets("coaxial").Cells(6, "H")
                ElseIf DC_OK = False And Freq = "Haut" Then
                    Loss_Coax = Worksheets("coaxial").Cells(7, "H")
                End If
            Case "3mm(.190)"
                Loss_Coax = Worksheets("Coaxial").Cells(8, "H")
            Case "3mm(.120)"
                Loss_Coax = Worksheets("Coaxial").Cells(9, "H")
            Case "8mm(.190)"
                Loss_Coax = Worksheets("Coaxial").Cells(10, "H")
            Case "8mm(.290)"
                Loss_Coax = Worksheets("Coaxial").Cells(11, "H")
            Case "Semi rigide"
                Loss_Coax = Worksheets("Coaxial").Cells(12, "H")
        End Select
        Conn_Loss = Worksheets("Coaxial").Cells(13, "H")
        Taux_Temp = 0.2
        
        'Calcul Pertes totales
        Total_Ambient = ((Coax_Lenght * 10 ^ -3) * Loss_Coax) + Conn_Loss
        Total_Hot = (Total_Ambient * (100 - (Loss_Coax * Taux_Temp)) / 100)
    
        'ecrire les pertes dans l'onglet coaxial
        If sTemp = "Ambient" Or sTemp = "Cold" Then
            If Freq = "Bas" Then
                Worksheets("Coaxial").Cells(Index, 4).Value = Total_Ambient
            ElseIf Freq = "Haut" Then
                Worksheets("Coaxial").Cells(Index, 4).Value = Total_Ambient
            ElseIf Freq = "Autre" Then
                Worksheets("Coaxial").Cells(Index, 4).Value = Total_Ambient
            End If
        ElseIf sTemp = "Hot" Then
            Worksheets("Coaxial").Cells(Index, 5).Value = Total_Hot
        End If    
        
    'Display the results.
        If Test = False Then
            MsgBox "Not Found Coaxial"
            MsgBox sCoax
        Else
            Select Case sTemp
                Case "Ambient"
                    CoaxLoss = Total_Ambient
                Case "Hot"
                    CoaxLoss = Total_Hot
                Case "Cold"
                    CoaxLoss = Total_Ambient
            End Select
        End If
    End Function

    la partie qui me prose probleme je l'ai mise en rouge (j'espere que ca fonction la mise en forme..)
    si je met cette partie en commentaire, le reste de la fonctione marche tres bien et j'ai bien ma valeur de perte qui s'affiche dans la feuille "donneescalcul".
    par contre quand elle n'est pas en commentaire, l'exécution pas à pas m'a permis de voir que le code n'etait pas bon uniquement pour les formules

    Worksheets("Coaxial").Cells(Index, 4).Value = Total_Ambient

    ce qui me laisse croire qu'elles ne sont pas bonnes mais je les ai deja utilisé sans aucun probleme.
    la seule difference : ici je demande a ce que ma valeur soit inscrite dans une autre feuille que celle depuis laquelle je fais appel a ma fonction premiere (ComputeLoss).

    voila...
    si quelqu'un a une idee quelconque pour m'aider ca serait bien sympatoche!

    merci

  8. #8
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Dis-moi?

    Tu n'appellerais pas cette fonction dans une formule d'une cellule d'une feuille Excel, par hasard?

    Si c'est le cas, ça ne peut pas marcher.
    Une fonction appelée dans une formule ne peut pas modifier les objets de la feuille.

    Accessoirement, si tu pouvais penser à utiliser les balises [code] (bouton au dessus de l'éditeur) quand tu postes du code, ça m'éviterais de devoir le faire à ta place.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

Discussions similaires

  1. [XL-2000] écrire dans une cellule sans écraser son contenu
    Par mollus dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/06/2011, 14h44
  2. [C#][Excel] Problème pour écrire dans une cellule
    Par MoscoBlade dans le forum C#
    Réponses: 1
    Dernier message: 24/02/2010, 16h54
  3. [VBA] MSHFlexgrid écrire dans une cellule
    Par toutyx dans le forum VBA Access
    Réponses: 1
    Dernier message: 14/06/2007, 11h05
  4. Comment écrire dans une cellule la fonction SUM en vba?
    Par Subkill dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/02/2007, 19h24
  5. Stringgrid: empêcher d'écrire dans une cellule
    Par didier17062006 dans le forum C++Builder
    Réponses: 1
    Dernier message: 12/11/2006, 15h16

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