Donner une valeur à une cellule en fonction d'une variable

Bonjour,

Je suis débutant en macro.

Dans la macro suivante:

  • je sélectionne la cellule comportant la valeur "z-z FIN"
  • je copie et insère la ligne active
  • je déclare une variable correspondant au numéro de la ligne

Je souhaite maintenant mettre une valeur ( cellule vide : "") à la cellule "C - numéro_ligne".

Merci de votre aide

Sub Sélectionner_cellule_valeur()

'Sélection de la cellule comportant la valeur "z-z FIN"

Cells.Find("z-z FIN").Select

'Sélectionner la ligne activée, copier, insérer la ligne copiée

Rows(ActiveCell.Row).Select

Selection.Copy

Selection.Insert Shift:=x1Down

'Déclaration de la variable

Dim numéro_ligne As Integer

'Attribution d'une valeur à la variable

numéro_ligne = ActiveCell.Row

--> ligne dont la syntaxe ne fonctionne pas

Range( "C - variable numero_ligne") = ""

End Sub

Bonsoir,

Remplace :

Range( "C - variable numero_ligne") = ""

par :

Range("C" & numero_ligne) = ""

Super merci Raja


Raja,

Si vous avez une idée pour éviter la surcharge des lignes

Sub Sélectionner_cellule_valeur()

'Sélection de la cellule comportant la valeur "z-z FIN"

Cells.Find("z-z FIN").Select

'Sélectionner la ligne activée, copier, insérer la ligne copiée

Rows(ActiveCell.Row).Select

Selection.Copy

Selection.Insert Shift:=x1Down

'Déclaration de la variable

Dim numéro_ligne As Integer

'Attribution d'une valeur à la variable

numéro_ligne = ActiveCell.Row

Range("C" & numéro_ligne) = ""

Range("D" & numéro_ligne) = ""

Range("E" & numéro_ligne) = ""

Range("F" & numéro_ligne) = ""

Range("G" & numéro_ligne) = ""

Range("H" & numéro_ligne) = ""

Range("I" & numéro_ligne) = ""

Range("J" & numéro_ligne) = ""

End Sub

Bonjour MONNIER, bonjour le fil, bonjour le forum,

La répétition du dernier bout pourrait être remplacée par une seule ligne :

Range("C" & numéro_ligne & ":J" & numéro_ligne) = ""

Le nom de la variable pourrait aussi être plus court. Ex. : NoLign

Joseph

Bonjour, Salut retraite8,

Une autre manière de procéder :

Range(Cells(numéro_ligne, "C"), Cells(numéro_ligne, "J")).ClearContents

Bonjour,

C'est un exercice ? Ou le but est d'obtenir un résultat réel à la fin ?

Car si c'est un exercice, on peut alors le passer au crible pour voir comment et pourquoi faire autrement que la façon dont c'est fait dans la macro, pour produire un code efficace...

Cela a alors un intérêt purement didactique.

Mais si l'objectif est réel, coller une ligne par insertion sur elle-même, ce qui la duplique, pour ensuite remplacer le contenu qu'on vient de mettre par du texte vide (on n'efface pas, on met du texte !)...

Cordialement.

Bonjour

Merci pour vos réponses.

Non ce n'est pas un exercice, mais un besoin pour tableau avec formulaire que je construis step by step.

Bonne journée

Non ce n'est pas un exercice, mais un besoin

Alors là, cela m'époustoufle !

Car supposons que l'expression z-z FIN se trouve sur la ligne 100 :

On la cherche, on la trouve, donc sur la ligne 100.

On copie cette ligne, la ligne 100.

On colle la copie par insertion d'une ligne, toujours en ligne 100.

On obtient donc deux lignes identiques, la nouvelle ligne 100 et l'ancienne devenue 101.

On récupère le numéro de ligne de cette fameuse ligne 100, toujours.

Et ce pour aller déposer dans 8 cellules de cette ligne 100, cellule par cellule, une valeur texte nulle, totalement parasite dans la mesure où elle n'est nécessitée par rien (sinon à la rigueur la peur du "vide"), valeur qui remplacera celle que l'on vient de coller l'instant précédent !

Je pense qu'il faut une solide imagination pour trouver dans cette suite autre chose qu'une succession d'actions purement gratuites, dont le seul lien entre elles est de ne servir à rien, quoi que l'on fasse avant, et quoi que l'on fasse après !

Et là je m'en tiens juste à l'observation brute de ce qui se passe, sans lien avec les problèmes de construction du code : bâti exclusivement sur des sélections, donc approximatif, sans qualification des expressions d'objets, et nécessairement plus lent, utilisation de Find non sécurisé, sans cadrage de la recherche (feuille entière), déclaration de variable au milieu du code exécutable, copie de ligne entière non cadrée sur les données (sachant que le fait de copier ou non demeure discutable, mais qu'on ne peut le trancher en l'état des informations...), énumération d'affectations à des cellules consécutives...

Problèmes méritant discussion préalable à une réécriture raisonnée du code, dans le cadre d'un exercice, qui peut fort bien être gratuit dans le but d'étudier la syntaxe de telle ou telle action. Mais si l'on est dans le "réel", j'avoue ne pas comprendre !

Bonjour

Je pensais que ce site livrait une opportunité à une auto-formation sur Excel VBA et que le forum laissait libre d'expression les débutants, mais visiblement Mr Ferrand expert qualifié en Excel en juge autrement ; jugement d'ailleurs quelque peu blessant !!

C'est dommage.

SI MrFerrand est disponible et souhaite réaliser mes tableaux gratuitement, je suis ouvert à lui exposer mon cahier des charges.

A+

Bonsoir,

Que je sache ! Nul n'attente à la libre expression des demandeurs ou débutants, à laquelle ont tout aussi également droit les non débutants et autres intervenants ! Basculer la discussion sur ce thème est donc hors sujet.

Basculer d'une discussion technique sur un plan moral ou éthique est également hors de propos (le truc habituel des politiciens professionnels qui ne mène nulle part)...

Je reste donc sur le plan technique, je n'oublie jamais cependant que la technique est au service de finalités qui, elles, ne sont pas techniques (ou pas que), et qui demeure un critère d'appréciation essentiel qu'il n'y a pas lieu d'ignorer.

Je traduis donc ce que fait ta macro en "VBA-standard" si j'ose dire :

Sub Test()
    Dim dln%, c As Range
    With ActiveSheet
        Set c = .UsedRange.Find("z-z FIN")
        If Not c Is Nothing Then
            .Range("C" & c.Row).Resize(, 8).Insert xlShiftDown, xlFormatFromRightOrBelow
            .Range("C" & c.Row).Resize(, 8).Value = ""
        End If
    End With
End Sub

Voilà donc ce qui est fait, de façon directe sans multiples détours... Hormis l'insertion de valeurs "", qui est quelque chose à ne jamais faire, on introduit une ligne dans une plage à un emplacement donné, au format de la ligne qui suit, ligne qui devrait être restée vide (là elle ne l'est pas !).

Si le sujet était Insérer une ligne vide dans une plage... la discussion se cantonnerait à la façon d'opérer, et l'on pourrait diversifier les solutions en fonction du contexte, dès lors que ce dernier serait indiqué... Mais le sujet n'était point celui-ci, les détours pris font naturellement se poser des questions sur la finalité réelle et le statut même de la discussion.

Je conçois que tu puisses ne pas vouloir répondre aux questions que tu génères... Il suffit de le dire, et c'est tout !

Mais inutile de jouer à te sentir blessé quand on te dit que ta succession d'opérations est absurde, en dresser la liste le fait clairement apparaître (ou burlesque selon le point de vue qu'on prend). La discussion stricte demeure sur les éléments (manquants) susceptibles de donner un sens à chaque opération et à leur succession. Sens qui demeure absent, à moins que je ne vois plus clair !

Rechercher des sujets similaires à "donner valeur fonction variable"