Ecrire dans une colonne qui risque de bouger

bonjour

j'ai un cas simple à faire : écrire dans une colonne d'u fichier excel.

Je sais le faire mais j'aimerai svaoir comment prendre en compte les insertions de colonnes sans avoir à retoucher à mon code.

Par exemple, je dois ecrire dans la colonne F.

image

j'ai le code suivant:

Sub ecrire()

For i = 4 To 6

Range("F" & i) = i * 10

Next

End Sub

très simple à faire, dans l'exemple j'écris entre les lignes 4 et 6 mais peu importe. C'est la colonne qui m'interesse.

et si on insère des colonnes entre les colonnes A et G, mon code de fonctionne plus et je dois actualiser le code.

le truc bizarre, c'est que si je dois LIRE la colonne F (et NON ECRIRE), je sais prendre en compte les insertions colonnes.

Mais là, comme je dois écrire dans le fichier, je suis bloqué (la méthode que j'utilise pour la lecture ne peut pas être appliquée).

il faudrait que je puisse identifer position de la colonne au début de mon code

mais je ne sais pas comment prendre en compte la position de cette colonne avec le Range( "F" &i) puisque la colonne F est figée.

je pense qu'i y a une solution avec Cells(ln , cln), car je peux faire varier les variables ln et cln mais comment trouver cln?

si vous avez une autre solution merci

4exemple.xlsm (13.23 Ko)

Bonjour Adnul

Dans le code, il faut effectuer une recherche de la colonne don l'entête contient "titre0"

Mémoriser ce numéro de colonne dans une variable et l'utiliser ensuite dans la boucle, un truc de ce genre

Sub ecrire()
  Dim I As Long
  Dim NumCol As Long, RngSearch As Range

  ' Chercher la colonne
  Set RngSearch = Rows("2:2").Find(What:="titre0", LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False)
  ' Si trouvée
  If Not RngSearch Is Nothing Then
    NumCol = RngSearch.Column
    ' La colonne trouvée on peut inscrire les éléments dans la colonnes suivante
    For I = 4 To 6
      Cells(I, NumCol + 1) = I * 10
    Next
  End If
End Sub

@+

Bonjour

Une solution simple serait de faire ceci :

- Allez dans formules --> gestionnaire de noms
- Créez un nom (par Toto)
- Dans le rubrique en dessous, mettez cette (Fait référence à) formule --> =DECALER(Feuil1!$F$3;;;NBVAL(Feuil1!$F:$F)-1)
- Modifiez votre code comme ceci :

Sub ecrire()
Dim cel As Range

For Each cel In Range("Toto")
cel = cel * 10
Next cel
End Sub

Cordialement

Edit : Salut BrunoM45, ... Oups, je n'avais pas vérifié qu'il y avait une réponse avant de poster...désolé

J'aime bien la solution de Dan.

le truc, c'est que je suis obligé d'écrire dans toutes les cellules de la colonne.

Est-ce que j'ai moyen de faire une syntaxe du genre Range("Toto", ligne)?

"toto" est ma colonne, et "ligne" est une variable qui me permet de balayer les lignes que je veux via un compteur dans une boucle For par exemple.

"toto" est ma colonne, et "ligne" est une variable qui me permet de balayer les lignes que je veux via un compteur dans une boucle For par exemple.

Non toto n'est pas la colonne mais une plage de cellule que vous balayer avec la variable Cel

le truc, c'est que je suis obligé d'écrire dans toutes les cellules de la colonne.

Ben les deux codes le font

Je ne comprends pas trop ce que vous chercher à faire du coup. Donnez un exemple on regardera

j'ai joint un exemple de fichier dans le 1er message si vous pouvez regarder svp

j'ai joint un exemple de fichier dans le 1er message si vous pouvez regarder svp

??? ben je l'ai utilisé pour vous donner ma réponse qui fonctionne

Faites le test dans le fichier que vous avez posté ici.

je vais retester alors

Salut,

A mettre dans ton module "boite à outils" ou Fonction ou autre chacun le nomme comme il veux mais tout le mond doit avoir un module avec ses fonctions personnelles Donc petit code De Pierre Fauconnier que tu pourras utiliser avec n'importe quel tableau, tu lui donnes le nom du tableau et ensuite le Array des valeurs à écrire dans le tableau sans te soucier où sont les colonnes. Position tu le renseignes si tu veux c'est la position de la ligne dans le tableau.

Sub AddRow(TableName, Values, Optional Position As Long)
Dim r As ListRow
Dim l As ListObject
Dim i As Long
    Set l = Range(TableName).ListObject
    If Position = 0 Or Position > l.ListRows.Count Then Position = l.ListRows.Count + 1
    Set r = l.ListRows.Add(Position)
    For i = LBound(Values) To UBound(Values) Step 2
        r.Range(l.ListColumns(Values(i)).Index).Value = Values(i + 1)
    Next
    Set r = Nothing
    Set l = Nothing

End Sub
'// Appel de la procédure
'AddRow "t_Personnel", VBA.Array("Prénom", "Jean", "Nom", "Aymar", "DN", DateSerial(1967, 12, 14), "Actif", True, "Salaire", 123.45)
'//OU
'AddRow "t_Personnel", VBA.Array("Prénom", "Jean", "Nom", "Aymar", "DN", DateSerial(1967, 12, 14), "Actif", True, "Salaire", 123.45), 1

ah oui dernière petite remarque, il faut bien sur avoir un tableau structuré sur une Feuille.

Salut BrunoM45, Dan, Jean-Paul et adnul

Comme est dit :

Les deux codes sont les même.

Soit tu insert la colonne manuellement ou par un code, tu dois donner aux colonnes des entêtes (un nom sur la tête de colonne : la première cellule par exemple) puis dans le code, tu recherches la colonne par son entête et une foi trouvée tu peux utiliser dans une boucle si tu veux te servir à lire ou écrire ou bien autre manip.

ok merci

Rechercher des sujets similaires à "ecrire colonne qui risque bouger"