Se connecter avec
S'enregistrer | Connectez-vous

Excel : modification d'une range dans une boucle

Dernière réponse : dans Programmation

Bonjour,

J'essaie d'afficher un tableau de String sous forme de vecteur colonne dans Excel.
Voici mon code :

  1. Sub tableau(ByRef s() As String)
  2. ' Ecrit en tableau (vecteur colonne) le vecteur passé en paramètre
  3. Dim i As Long, row As Long
  4. Dim col As String
  5. col = ColumnLetter(ActiveCell.Column)
  6. row = ActiveCell.row
  7. For i = 1 To UBound(s)
  8. Range(col & (row + i)).Value = s(i)
  9. Next i
  10. End Sub


Malheureusement, le code plante à la 1ère itération de la boucle. J'ai pourtant vérifié au débuggage que le paramètre col & (row+i) donnait bien quelque chose sous la forme "A3", et que s(i) était bien reconnu comme un String, mais la fonction s'arrête tout simplement à cette ligne, sans même créer une erreur...

Si quelqu'un a une idée...
Merci !

Autres pages sur : excel modification range boucle

Lassé par la pub ? Créez un compte
Expert Programmation

salut,

Je pense que tu confonds .Range() et .Cells()

Essaye avec .Cells() (un ptit F1 pour la syntaxe si tu n'est pas sur !!)

---------------------
edit : il va ptet falloir que tu change la def de ta colonne... a voir
Expert Programmation

Salut,

Il n'y a effectivement pas confusion de ta part, mais l'utilisation de la méthode Cells() en lieu et place de Range() dans ce cas est plus judicieux.

Car en effet, quel alambic !!! Avec une fonction ColumnLetter(), avec deux variables, etc.

Voilà le code que oozenot ( :hello:  ) te proposait de créer :
  1. Dim i As Long, row As Long, col As Long
  2.  
  3. col = ActiveCell.Column
  4. row = ActiveCell.row
  5. For i = LBound(s) To UBound(s)
  6. Cells(row + i, col).Value = s(i)
  7. Next

C'est quand même plus simple et plus clair.

Si je me permets de lui gâcher le plaisir de te voir trouver toi-même cette solution, c'est que je propose une autre attaque du problème. On fait des calculs savants (euh, en fait une bête addition :D  ) alors qu'on ne cherche qu'à se décaler de i cases. Allons :
  1. Dim i As Long
  2.  
  3. For i = LBound(s) To UBound(s)
  4. ActiveCell.Offset(i).Value = s(i)
  5. Next
Ça me paraît encore plus simple, et donc encore plus facile à comprendre.

Merci pour vos réponses. C'est effectivement une écriture plus simple pour faire la même chose, mais ça ne marche toujours pas :( 

Voici le code simplifié que j'utilise maintenant :

  1. Sub tableau(s() As String)
  2. ' Ecrit en tableau (vecteur colonne) le vecteur passé en paramètre
  3. Dim i As Long
  4. Range("A5").Value = s(1) ' ligne ajoutée pour test
  5. For i = LBound(s) To UBound(s)
  6. ActiveCell.Offset(i).Value = s(i)
  7. Next i
  8. End Sub


Au debugage, il détecte bien que s(1) est "S", mais il s'arrête à cette ligne. Plus rien ne se passe, comme si j'avais appuyé sur stop :( 
Expert Programmation

salut !

Est ce que par hasard il ne te dirais pas <subscript out of range> ?
Si oui il est temps de nommer tes feuilles !!

essaye aussi d'initialiser la variable i avant la boucle et puis sinon ben...
attends une réponse de zeb... je n'ai pas d'idée !!!

+
Expert Programmation

T'as juste un problème avec ton tableau :spamafote: 
Que donne ce code ?
  1. Sub tableau(s() As String)
  2. MsgBox LBound(s) & " to " & UBound(s)
  3. End Sub


---------------

Fais-moi plaisir, vire-moi ce i derrière le Next. On est plus en 1985 ! Aujourd'hui, c'est l'indentation qui permet de voir la structure du code ;) 

J'ai trouvé l'explication sur un autre forum. En fait, j'appelais le sub tableau dans une fonction que je tapais dans une cellule Excel. Or il semblerait qu'une fonction tapée dans une cellule ne peut pas modifier d'autres cellules que la cellule concernée.

C'est tout bête, mais il fallait le savoir...

Merci pour votre aide !
Lassé par la pub ? Créez un compte