XL 2013 Formule en vba

ZAKAO

XLDnaute Junior
Bonjour tout le monde,

J'espère que vous allez tous bien.

Je me demandais si quelqu'un arrive à écrire la formule suivante :
=SI(G4=1;SIERREUR(INDIRECT("Ecoulement!G" & LI+LIGNE()-4);0);"NA")
Avec : la formule en O4 et LI une cellule nommée qui porte une valeur INT

En vba avec .formuleR1C1

J'ai essayé comme ceci mais sans effet... C'est les guillemets autour de Ecoulement!G qui me pose problème.
VB:
"=IF(RC" & LCHE & "=1,IFERROR(INDIRECT("""" & F_ECOULEMENT.name & "!G""" & LI+ROW()-4),0),""NA"")"

Je vous remercie d'avance en vous souhaitant une bonne journée.

Bien cordialement,
ZAKAO
 
C

Compte Supprimé 979

Guest
Bonjour ZAKAO,

Normalement comme ceci 🤔
VB:
    ActiveCell.Formula2R1C1 = _
        "=IF(RC[-1]=1,IFERROR(INDIRECT(""Ecoulement!G"" & LI+ROW()-4),0),""NA"")"

Si cela fonctionne je te donnerais une petite astuce 😜

A+
 

ZAKAO

XLDnaute Junior
Bonjour tout le monde, je m'excuse pour ma réponse tardive. Ce matin même j'ai testé vos trois solutions et elles fonctionnent parfaitement et je vous en remercie.

Seulement, le nom de la feuille est variable et peut être amenée à changer au fil du temps, donc je souhaite appeler le nom de la feuille avec la fonction "F_ECOULEMENT.name" (="Ecoulement").

C'est à ce moment là que j'ai vraiment des difficultés.

En soit je pourrai protéger le classeur et le changement de noms des onglets mais je suis vraiment curieux de pourquoi je n'arrive pas à intégrer correctement cette fonction dans la formuleR1C1...

Encore une fois je vous remercie en vous souhaitant une agréable journée.

Bien cordialement,
ZAKAO
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne comprends plus trop (si j'ai jamais compris) pourquoi vous voulez utiliser la fonction INDIRECT dans la formule si vous réinstallez celle ci chaque fois que la feuille change. Si c'est juste à cause du numéro de ligne il vaudrait mieux utiliser OFFSET ou INDEX.
 

ZAKAO

XLDnaute Junior
Bonjour.
Je ne comprends plus trop (si j'ai jamais compris) pourquoi vous voulez utiliser la fonction INDIRECT dans la formule si vous réinstallez celle ci chaque fois que la feuille change. Si c'est juste à cause du numéro de ligne il vaudrait mieux utiliser OFFSET ou INDEX.
Mon classeur se décompose en deux onglets : le premier = livrables et le second = écoulement.

Ici, dans le premier onglet à la colonne état d'avancement, on retrouve la formule qui appelle le résultat présent dans la deuxième feuille. Or la deuxième feuille est dynamique en fonction du temps, du nombre de livrables, du découpage de la finance de ces livrables... Donc il faut que je les appelle avec une adresse dynamique.
1681371149808.png


Dans la formule "LI" est équivalent à 91, la première ligne en rose de cette feuille. Il y a d'autres données au dessus de ce tableau et en-dessous de celui-ci. Si vous avez d'autres idées, je suis bien entendu preneur.
1681371380061.png
 

Dranreb

XLDnaute Barbatruc
Ne pourrait-on avoir un classeur plutôt que des images ?
Ça ne change rien au fait que la fonction INDIRECT n'est intéressante justement que si c'est le nom de la feuille qui est dynamique. Mais dans ce cas il ne doit pas y être figé en constante mais contenu dans une autre cellule par exemple ou obtenu par une expression.
Ne pourriez vous aussi mettre un nom dans le classeur qui désigne la plage livrable (Si ce n'est pas déjà un tableau Excel) … Il nous manque tout du contexte dans lequel vous voulez exécuter cette macro.
 
Dernière édition:

ZAKAO

XLDnaute Junior
Ne pourrait-on avoir un classeur plutôt que des images ?
Ne pourriez vous aussi mettre un nom dans le classeur qui désigne la plage livrable (Si ce n'est pas déjà un tableau Excel) … Il nous manque tout du contexte dans lequel vous voulez exécuter cette macro.
Non je ne peux pas.

Je sais tout cela, ce n'est pas la première fois que je viens sur ce forum mais ce classeur n'est pas ma propriété. Donc je suis sincèrement désolé de ne pas pouvoir répondre à vos attentes.

Faire tout le contexte prendrait malheureusement des heures sans le doc donc je ne viens sur le forum qu'avec de toutes petites questions ciblées.

Vous m'avez fait une remarque sur la formule, je vous ai décrit ce qu'elle fait. Elle appelle une valeur correspondante dans un autre onglet qui a un contenu dynamique.

Si vous avez d'autres idées de formule pour réaliser la chose, je suis preneur. J'essaierai alors de l'adapter à mon cas mais je suis bien conscient que vous ne pourrez pas me parachuter une réponse dans ces conditions :)

Merci pour votre aide.

Bien cordialement,
ZAKAO
 

Dranreb

XLDnaute Barbatruc
Essayez ça :
VB:
Option Explicit
Private CelSrc As Range
Sub InstallerRenvoi()
   If CelSrc Is Nothing Then
      Set CelSrc = ActiveCell
      If MsgBox("1ère source possible d'un futur renvoi à prévoir :" _
         & vbLf & CelSrc.Address(False, False, xlA1, True), vbOKCancel, "Installer renvoi") _
      = vbCancel Then Set CelSrc = Nothing
      Exit Sub: End If
   Selection.FormulaR1C1 = "=IF(RC7=1,IFERROR(" & CelSrc.Address(False, True, xlR1C1, True, Selection) & ",0),""NA"")"
   If MsgBox("Faut-il conserver cette cellule comme 1er source possible ?" _
      & vbLf & CelSrc.Address(False, False, xlA1, True), vbYesNo, "Installer renvoi") _
      = vbNo Then Set CelSrc = Nothing
   End Sub
 

Dranreb

XLDnaute Barbatruc
Autre solution plus simple :
VB:
Option Explicit
Sub InstallerRenvoi()
   Dim CelSrc As Range
   On Error Resume Next
   Set CelSrc = Application.InputBox("1ère cellule source ?", Type:=8)
   If Err Then Exit Sub
   Selection.FormulaR1C1 = "=IF(RC7=1,IFERROR(" _
      & CelSrc.Address(False, True, xlR1C1, True, Selection) _
      & ",0),""NA"")"
   End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 234
Membres
103 162
dernier inscrit
fcfg