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 :

Mettre une adresse dans une variable et ecrire une valeur à cette adresse. [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut Mettre une adresse dans une variable et ecrire une valeur à cette adresse.
    Bonjour,

    Je bute sur un problème relativement simple
    Je boucle sur une colonne, quand je trouve une certaine valeur je veux sauvegarder l'adresse d'une cellule.
    plus tard en trouvant une autre valeur, je veux écrire une information à l'adresse précédemment sauvegardée dans ma variable et la remettre à blanc.

    Malgé la consultation du tuto sur les variables (qui d'ailleurs ne parle pas du type RANGE), je ne trouve pas la solution.
    http://silkyroad.developpez.com/vba/tableaux/

    Si je déclare ma variable Lprod AS Range, j'ai une erreur 91 quand je veux sauvegarder l'adresse de la cellule (ligne 10)
    Si je déclare ma variable Lprod As String, j'ai erreur une erreur de compilation qualificateur incorrect quand je lance la macro avec la variable Lprod en surlignée en bleu là où je suis sensé ecrire la valeur "F" ( ligne 14)
    Si je ne déclare pas ma variable j'ai une erreur 424 quand je veux écrire dans cette adresse. ( ligne 14)
    Le code
    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
     
    Sub Fin()
    Dim Of, Act, NoF, LProd As String
     
    Range("AM2").Select
    NoF = "X"
    Do While Not IsEmpty(ActiveCell)
     
    If ActiveCell.Value = "PRODUCTION" Then
    LProd = ActiveCell.Offset(0, 9).Address
    End If
     
    If ActiveCell.Offset(0, -13).Value <> ActiveCell.Offset(-1, -13).Value Then
    LProd.Value = "F"
    LProd = Nothing
    End If
     
    ActiveCell.Offset(1, 0).Select
     
    Loop
    End Sub
    Comment faire pour ce cas ?
    Merci

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Malgé la consultation du tuto sur les variables (qui d'ailleurs ne parle pas du type RANGE), je ne trouve pas la solution
    Le tutoriel référencé traite spécifiquement des variables tableaux et est en quelques sortes un complément d'un autre tutoriel du même auteur Utiliser les variables en VBA Excel où tu trouveras au chapitre II-K. Object les explications sur les variables objets.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    MErci pour ta réponse, Philippe,

    Je m'étais trompé dans le copier coller du lien et j'étais bien sur les variables;
    Par contre je n'avais pas fait le lien objet range.

    Mais je n'arrive toujours pas à faire fonctionner la séquence.
    Soyons clair c'est pour comprendre, car j'ai utilisé une autre solution temporairement la colonne ne changeant pas je récupère la ligne
    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
     
    Sub Fin()
    Dim Of, Act, NoF, LProd As Range 'String
     
    Range("AM2").Select
    NoF = "X"
    Do While Not IsEmpty(ActiveCell)
     
    If ActiveCell.Value = "PRODUCTION" Then
    'LProd = ActiveCell.Row
    Set LProd = ActiveCell.Offset(0, 13).Address
    End If
     
    If ActiveCell.Offset(0, -13).Value <> ActiveCell.Offset(-1, -13).Value Then
    'Cells(LProd, 48).Value = "F"
    'LProd = ""
    LProd.Value = "F"
    LProd = Nothing
    End If
     
    ActiveCell.Offset(1, 0).Select
     
    Loop
    End Sub

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si je lis la ligne 11 du code de ta procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set LProd = ActiveCell.Offset(0, 13).Address
    Tu confonds Objet et propriété
    Un objet a des propriétés et des méthodes donc si tu souhaites qu'une variable soit un objet Range ce sera plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set LProd = ActiveCell.Offset(0, 13)
    LProd devient l'objet de la 13ème cellule à droite de la cellule active et une variable objet hérite des propriétés et méthodes de cet objet.
    Tu peux donc ensuite connaître l'adresse de cet objet en écrivant par exemplePar contre si tu veux simplement conserver l'adresse de la 13ème colonne à droite de la cellule active alors tu utilises une variable de type String comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LProd = ActiveCell.Offset(0, 13).Address
    que tu peux ensuite utiliser avec un objet Range comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(LProd).Value = 10
    Attention toutefois qu'alors l'adresse est par exemple A20 et que si tu souhaites obtenir l'adresse complète (Classeur, feuille, cellule) il faut utiliser l'argument nommé External en lui passant True comme valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LProd = ActiveCell.Offset(0, 13).Address(external:=True)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    Merci BEAUCOUP Philippe pour ce petit cours qui m'a permis de comprendre mon erreur.
    effectivement à partir en auto didacte, on manipule des éléments sans chercher à les comprendre et on mélange les genres.

    en tout cas, c'est bien clair et bien sûr cela fonctionne. je pourrais donc reprendre cette procédure avec l'adresse indépendamment du fait que la colonne ou la ligne soit fixe ou pas.

    encore merci.

  6. #6
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Ton code en plus propre (les Select/Selection, moins on en mets, mieux on se porte).
    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
    Sub Fin()
    Dim LProd As Range
    Dim Ligne As Long
     
    For Ligne = 2 To Cells(Rows.Count, "AM").End(xlUp).Row
       If Cells(Ligne, "AM").Value = "PRODUCTION" Then
           Set LProd = Cells(Ligne, "AV")
       End If
     
        If Cells(Ligne, "Z").Value <> Cells(Ligne - 1, "Z").Value Then
            LProd.Value = "F"
            Set LProd = Nothing
        End If
    Next Ligne
     
    End Sub
    Si je déclare ma variable Lprod AS Range, j'ai une erreur 91 quand je veux sauvegarder l'adresse de la cellule (ligne 10)
    C'est normal puisque l'adresse est une donnée String. On ne peut pas la mettre dans une variable Range.
    Range est un objet donc, pour l'assignée, il faut commencer la ligne avec un Set.
    https://msdn.microsoft.com/fr-fr/lib.../gg251642.aspx

    Si je déclare ma variable Lprod As String, j'ai erreur une erreur de compilation qualificateur incorrect quand je lance la macro avec la variable Lprod en surlignée en bleu là où je suis sensé ecrire la valeur "F" ( ligne 14)
    Il faudrait dans ce cas l'utiliser sous la forme Range(Lprod).
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    Merci à Menhir pour le complément et pour le nettoyage
    Denis

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

Discussions similaires

  1. Lire une ligne et mettre le résultat dans des variables
    Par www.rubis dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 06/05/2014, 15h23
  2. [VB6]Ecrire une fonction dans ma feuille Excel
    Par ToxiK dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 08/06/2006, 20h04
  3. ecrire une chaine dans un fichier [prob]
    Par rogerio dans le forum C++
    Réponses: 5
    Dernier message: 31/05/2006, 02h20
  4. Réponses: 6
    Dernier message: 07/04/2006, 01h10
  5. Extraire pls morceaux d'une chaine dans des variables!
    Par baillador dans le forum Langage
    Réponses: 10
    Dernier message: 05/04/2006, 13h21

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