indirect vers référence cellule

17 réponses
Avatar
LaurentC
Bonjour

Au cours d'une Sub(), j'écris l'adresse d'une première cellule.address
dans une seconde sous la forme $B$12, plus loin j'utilise la fonction
indirect() vers la seconde cellule et retrouve le contenu de la
première cellule B12, ok c'est super ça fonctionne ... euf, ça
fonctionne jusqu'Í  ce que j'insère une ligne plus haut que la ligne 12
... le contenu attendu se retrouve en B13 et mon adresse n'est plus
bonne :-(

Y a t'il moyen d'écrire dans une cellule la référence d'une cellule et
non son adresse ?
Une référence qui bougerait lorsque j'insère une ligne ou colonne pour
désigner le même contenu ...

Merci pour vos idées
@+Laurent

10 réponses

1 2
Avatar
Jc
Bonjour LaurentC
Je me permet de te répondre sur un sujet paru dans PonxOffice auquel
ne ne pouvais répondre (pas les droits).
Il s'agit plus d'une réflexion que d'une réponse Í  ce problème
Si tu n'est pas le bon LaurentC tant pis et mille excuses pour la
"pollution"...
<Après mÍ»re réflexion, LaurentC a écrit :
<
<Bonjour Í  tous
<
<J'essaye de visualiser mes performances sur les titres de mon PEA.
Pour< celÍ  je tapisse une feuille Excel 365 avec tout un tas de cellule
< avec la fonction historique.actions() pointant vers différents
couples< de nom valeur / date début / date fin.
<
<Si il y a peu de cellule et donc peu de requête, ça fonctionne bien.
<Si j'abuse un peu, je me retrouve avec des cellules marquées #BUSY !
< qui finissent pas se remplir.
<Si j'abuse beaucoup, Í  la fin je me retrouve avec des cellules
marquées< #CONNEXION !
<... et Í  la fin ça marche plus du tout (lÍ  tout de suite le service
web< ne me répond pas du tout).
<
<Savez vous si il y a des limites dans l'usage de cette fonction ?
<
<Autre question :
<Lorsque Excel cherche des valeurs avec la fonction
historique.actions()
<, il marque dans la cellule (plus ou moins longtemps) #BUSY ! et tout
en< bas Í  gauche de mon Excel, Í  coté de "Prêt", il écrit "Calculer"
...
< Ce calculer reste lÍ  jusqu'Í  ce que toutes les cellules ne soient
plus
< #BUSY ! ok.
<
<Comment détecter cette état "Calculer" en VBA.
Bonjour,
comme MichD je ne connais pas.
Néanmoins si je comprends bien le problème il s'agit d'un temps
d'attente qui enfle de manière exponentiel rapporté au nombre de
fonction Historique.Action() utilisé.
Dans ce cas, s'il n'y a qu'une utilisation de Historique.Action() ça
va.
Il est peut-être possible, par VBA, de créer une boucle inscrivant
Historique.Action() un par un.
Une fois l'un inscrit, calculer, copier le résultat et coller la valeur
au même endroit ou ailleur et passer Í  la cote suivante.
Pour contourner le problème temporel.
En espérant t'avoir apporté une piste de réflexion bonne soirée.
--
______________________________________________
Jc
Avatar
MichD
Le 10/05/22 Í  11:13, LaurentC a écrit :
Bonjour
Au cours d'une Sub(), j'écris l'adresse d'une première cellule.address
dans une seconde sous la forme $B$12, plus loin  j'utilise la fonction
indirect() vers la seconde cellule et retrouve le contenu de la première
cellule B12, ok c'est super ça fonctionne ... euf, ça fonctionne jusqu'Í 
ce que j'insère une ligne plus haut que la ligne 12 ... le contenu
attendu se retrouve en B13 et mon adresse n'est plus bonne :-(
Y a t'il moyen d'écrire dans une cellule la référence d'une cellule et
non son adresse ?
Une référence qui bougerait lorsque j'insère une ligne ou colonne pour
désigner le même contenu ...
Merci pour vos idées
@+Laurent

Bonjour,
Désolé, j'ai de la difficulté Í  comprendre ton problème, ce que la macro
doit faire.
Si tu utilises une adresse absolue de cellule comme $B$12, tu vas avoir
des difficultés. Utilise plutÍ´t une adresse relative comme ceci :
MaCellule = Range("A1").address(0,0) , les 2 paramètres 0 signifient que
la lettre et la ligne ont un format du type B12 (voir l'aide d'Excel en
utilisant la touche F1 lorsque le curseur est sur Address), si tu copies
cette ligne vers le bas en VBA, elle va s'incrémenter...
Si c'est possible, apporte un supplément d'information et aussi les
quelques lignes de code de la macro et ce que tu n'arrives pas Í  écrire
comme code pour ce dont tu veux faire.
MichD
Avatar
ThierryP
Bonjour Laurent,
Une idée comme ça..... Pourquoi ne pas nommer ta cellule, ainsi tu y fais référence
dans ta macro avec Range("toto") et tu ne t'occupes plus de son adresse.
ThierryP
Avatar
LaurentC
Bonjour Thierry
Une idée comme ça..... Pourquoi ne pas nommer ta cellule, ainsi tu y fais
référence dans ta macro avec Range("toto") et tu ne t'occupes plus de son
adresse.

VoilÍ  une chouette solution ... sauf que j'ai des centaines de lignes
dans ma feuille et qu'Í  peu près 1 ligne sur 2 aura une référence du
genre ... donc ça fait des centaines de noms et celÍ  devriendra vite
ingérable :-(
Merci pour cette idée.
@+Laurent
Avatar
LaurentC
Bonjour Jc
Je suis bien le même LaurentC :-)
J'ai tenté de mettre en oeuvre comme tu dis mais Í  la fin ça ne le fait
pas ... en fait la boucle tourne, rempli la cellule attendue avec la
formule Historique.Action() et passe Í  la suivante.
VBA écrit la formule puis passe au suivant sans attendre que la requête
ai donné son résultat. Donc quand j'abuse (feuille avec plus de 100
requêtes), VBA a écrit toutes les formules dans toutes les cellules et
on attend le téléchargement des requêtes (Excel marque en bas Í  droite
"Calculer" et les cellules qui n'ont pas encore reçu leur requête sont
notées #BUSY!).
Pour le newsgroup Ponx, il est en lecture seule avec les identifiants v
et v. Envoie un email Í  bot arobase ponx.fr avec DEMANDE dans l'objet,
tu recevras un email avec des login et mot de passe qui t'ouvriront ces
newsgroup en écriture.
@+Laurent
Bonjour LaurentC
Je me permet de te répondre sur un sujet paru dans PonxOffice auquel ne ne
pouvais répondre (pas les droits).
Il s'agit plus d'une réflexion que d'une réponse Í  ce problème
Si tu n'est pas le bon LaurentC tant pis et mille excuses pour la
"pollution"...
<Après mÍ»re réflexion, LaurentC a écrit :
<
<Bonjour Í  tous
<
<J'essaye de visualiser mes performances sur les titres de mon PEA. Pour<
celÍ  je tapisse une feuille Excel 365 avec tout un tas de cellule
< avec la fonction historique.actions() pointant vers différents couples< de
nom valeur / date début / date fin.
<
<Si il y a peu de cellule et donc peu de requête, ça fonctionne bien.
<Si j'abuse un peu, je me retrouve avec des cellules marquées #BUSY !
< qui finissent pas se remplir.
<Si j'abuse beaucoup, Í  la fin je me retrouve avec des cellules marquées<
#CONNEXION !
<... et Í  la fin ça marche plus du tout (lÍ  tout de suite le service web< ne
me répond pas du tout).
<
<Savez vous si il y a des limites dans l'usage de cette fonction ?
<
<Autre question :
<Lorsque Excel cherche des valeurs avec la fonction historique.actions()
<, il marque dans la cellule (plus ou moins longtemps) #BUSY ! et tout en<
bas Í  gauche de mon Excel, Í  coté de "Prêt", il écrit "Calculer" ...
< Ce calculer reste lÍ  jusqu'Í  ce que toutes les cellules ne soient plus
< #BUSY ! ok.
<
<Comment détecter cette état "Calculer" en VBA.
Bonjour,
comme MichD je ne connais pas.
Néanmoins si je comprends bien le problème il s'agit d'un temps d'attente qui
enfle de manière exponentiel rapporté au nombre de fonction
Historique.Action() utilisé.
Dans ce cas, s'il n'y a qu'une utilisation de Historique.Action() ça va.
Il est peut-être possible, par VBA, de créer une boucle inscrivant
Historique.Action() un par un.
Une fois l'un inscrit, calculer, copier le résultat et coller la valeur au
même endroit ou ailleur et passer Í  la cote suivante.
Pour contourner le problème temporel.
En espérant t'avoir apporté une piste de réflexion bonne soirée.
Avatar
LaurentC
Salut MichD
Je vais essayé d'être plus clair ...
Dans la cellule P139 j'ai la valeur 100 (appelons cette cellule toto).
Dans la cellule B2 j'ai la référence P139 ou $P$139 (le problème est le
même).
Dans une autre cellule, si j'écris =INDIRECT(B2), la cellule affiche
100, ok.
Si j'insère une ligne entre les lignes 99 et 100, ma cellule P139
(toto) se retrouve en P140, ma cellule B2 pointe toujours vers P139 et
ma formule indirect ne fonctionne plus :-(
L'idée de ThierryP est judissieuse mais semble innaplicable puisque
j'ai actuellement plusieurs centaines de lignes et en aurait plus
bientÍ´t.
merci pour ton aide.
@+Laurent
Au cours d'une Sub(), j'écris l'adresse d'une première cellule.address dans
une seconde sous la forme $B$12, plus loin  j'utilise la fonction
indirect() vers la seconde cellule et retrouve le contenu de la première
cellule B12, ok c'est super ça fonctionne ... euf, ça fonctionne jusqu'Í  ce
que j'insère une ligne plus haut que la ligne 12 ... le contenu attendu se
retrouve en B13 et mon adresse n'est plus bonne :-(
Y a t'il moyen d'écrire dans une cellule la référence d'une cellule et non
son adresse ?
Une référence qui bougerait lorsque j'insère une ligne ou colonne pour
désigner le même contenu ...
Merci pour vos idées
@+Laurent

Bonjour,
Désolé, j'ai de la difficulté Í  comprendre ton problème, ce que la macro doit
faire.
Si tu utilises une adresse absolue de cellule comme $B$12, tu vas avoir des
difficultés. Utilise plutÍ´t une adresse relative comme ceci :
MaCellule = Range("A1").address(0,0) , les 2 paramètres 0 signifient que la
lettre et la ligne ont un format du type B12 (voir l'aide d'Excel en
utilisant la touche F1 lorsque le curseur est sur Address), si tu copies
cette ligne vers le bas en VBA, elle va s'incrémenter...
Si c'est possible, apporte un supplément d'information et aussi les quelques
lignes de code de la macro et ce que tu n'arrives pas Í  écrire comme code
pour ce dont tu veux faire.
MichD
Avatar
ThierryP
Re,
J'ai vu ta réponse Í  MichD.
Ne connaissant pas ton fichier, je vais poser une question bête... Pourquoi es-tu obligé d'insérer des lignes plutÍ´t que d'en ajouter ?
Sinon, une piste (basée sur une piste que j'avais trouvé il y a très très longtemps....) :
'########################################################
Public x As Long, y As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
x = Range("A" & Cells.Rows.Count).End(xlUp).Row
End Sub
Et puis :
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("A" & Cells.Rows.Count).End(xlUp).Row > x Then
y = Range("A" & Cells.Rows.Count).End(xlUp).Row
Call Cherche(y)
End If
End Sub
'########################################################
Et pour remplacer :
'########################################################
Sub Cherche(fin As Long)
Dim plage, cellule, ligne
Set plage = Me.Range("A1:A" & fin)
Application.EnableEvents = False
For Each cellule In plage
On Error GoTo suite
ligne = Val(Right(cellule, Len(cellule) - 1))
cellule.Value = Replace(cellule.Value, ligne, ligne + 1)
suite:
Next
Application.EnableEvents = True
End Sub
'########################################################
Le tout ͠ mettre ͠ ta sauce bien sͻr !
ThierryP
Avatar
LaurentC
Salut Thierry
Pourquoi
es-tu obligé d'insérer des lignes plutÍ´t que d'en ajouter ?

C'est un poil compliqué ... j'essaye de gérer mes achats et ventes sur
mon PEA.
exemple
le 02/02/2020 j'achète 10 titres Orange
le 10/02/2020 je vends une partie de la position : vente de 8 titres
Je souhaite savoir quel est l'impact de cette vente sur mon résultat.
Pour celÍ  j'insère une ligne en dessous de la ligne du 02/02 pour
spliter ma ligne d'achat en 2 lignes.
le 02/02/2020 j'achète 2 titres Orange
le 02/02/2020 j'achète 8 titres Orange
Et comme ça je peux lettrer ma vente et mon achat avec la même quantité
et trouver ma marge pour cette ligne. Vu que les lignes achat 8 et
vente 8 sont lettrées, je sais qu'il me reste 2 titres en stock ...
merci Í  tous
@+Laurent
Avatar
MichD
Le 11/05/22 Í  03:46, LaurentC a écrit :
Salut MichD
Je vais essayé d'être plus clair ...
Dans la cellule P139 j'ai la valeur 100 (appelons cette cellule toto).
Dans la cellule B2 j'ai la référence P139 ou $P$139 (le problème est le
même).
Dans une autre cellule, si j'écris =INDIRECT(B2), la cellule affiche
100, ok.
Si j'insère une ligne entre les lignes 99 et 100, ma cellule P139 (toto)
se retrouve en P140, ma cellule B2 pointe toujours vers P139 et ma
formule indirect ne fonctionne plus :-(
L'idée de ThierryP est judissieuse mais semble innaplicable puisque j'ai
actuellement plusieurs centaines de lignes et en aurait plus bientÍ´t.

Moi, j'essayerais comme ça :
En P139 ==> la valeur 100
En B2 au lieu d'écrire l'adresse de la cellule P139, j'inscrirais la
formule suivante : ="P"&LIGNE((DECALER($P139;;;;)))
Dans une autre cellule : Tu peux inscrire la formule : Indirect(B2)
Lorsque tu ajoutes une ligne, la formule en B2 retournera P140, la
nouvelle adresse de la cellule contenant la valeur 100. La cellule
contenant la formule =Indirect(B2) retournera 100.
MichD
Avatar
LaurentC
Salut
Moi, j'essayerais comme ça :
En P139 ==> la valeur 100
En B2 au lieu d'écrire l'adresse de la cellule P139, j'inscrirais la formule
suivante : ="P"&LIGNE((DECALER($P139;;;;)))
Dans une autre cellule : Tu peux inscrire la formule : Indirect(B2)
Lorsque tu ajoutes une ligne, la formule en B2 retournera P140, la nouvelle
adresse de la cellule contenant la valeur 100. La cellule contenant la
formule =Indirect(B2) retournera 100.

en 1 mot : excellent !
Je peux ajouter d'autres qualificatifs ;-)
Vraiment chouette
Pile poil
...
Je comprends pas tout bien ...
Ligne() ça va.
Decaler(), dans cet usage je ne comprends pas
j'ai enlevé un jeu de parenthèses
je ne comprends pas le $ dans décaler, ça semble fonctionner
J'en ai pas super besoin mais parce que je suis curieux (et aussi un
gros abuseur) ça serait bien que ça fonctionne aussi pour les colonnes,
j'ai essayé
=COLONNE(DECALER(B2;;;;))&LIGNE(DECALER(B2;;;;))
Alors ça fonctionne (ça incérmente quand j'insère des ligne et colonne)
mais ça renvoie 22 pour désigner B2 ... c'est pas terrible, comment
remplacer le premier 2 par B ?
Nomnbreux merci
@+Laurent
1 2