XL 2019 Procédure VBA - Adresses absolues

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Rime B

XLDnaute Nouveau
Bonjour,

Je rencontre un petit souci, j'apprécierais votre aide si possible.

Je souhaite mettre en place une procédure VBA qui pourrait prendre une formule complexe utilisant des cellules exprimées en adresses relatives et la transformer en utilisant les mêmes cellules avec des adresses absolues.

Je vous remercie d'avance pour votre aide !

Bonne journée à vous 🙂
 
Bonjour,
Je vous remercie pour votre réponse.
Mon problème est le suivant:
J’ai plusieurs dizaines de cellules qui contiennent des formules comme par exemple : =SI(G10;R10/G10;"")

Je voudrais pouvoir les transformer en formules exprimant les mêmes données exprimées avec adresses absolues ,

ainsi par exemple après application d’une procédure VBA, la même cellule contiendrait la formule =SI($G$10;$R$10/$G$10;"")

le faire à la main en utilisant la touche F4 est fastidieux et très chronophage



Merci d'avance pour votre retour.
 
Avec un petit fichier test ..... cela serait plu simple de répondre.
Dans quelle cellule ? Sur quelle plage ? Les ref de cellules peuvent elles changer ?

Alors au pif et très simple, si la formule est en B3 :
VB:
Sub EnAbsolu()
    Chaine = [B3].Formula
    If Mid(Chaine, 5, 1) <> "$" Then Chaine = Mid(Chaine, 1, 4) & "$" & Mid(Chaine, 5)
    If Mid(Chaine, 10, 1) <> "$" Then Chaine = Mid(Chaine, 1, 9) & "$" & Mid(Chaine, 10)
    If Mid(Chaine, 15, 1) <> "$" Then Chaine = Mid(Chaine, 1, 14) & "$" & Mid(Chaine, 15)
    [B3].Formula = Chaine
End Sub
 
Bonjour le fil

Issu des archives
(nous étions en 2008)
Code:
Sub Convertir_F_ref_absolue_II()
Dim Mycell As Range
Dim Plage As Range
Set Plage = Application.InputBox(Prompt:= _
"Veuillez sélectionner les cellules à dollariser", _
Title:="Addressage absolu", Type:=8)
For Each Mycell In Plage
          If Len(Mycell.Formula) > 0 Then
                'Stores cell's formula as variable
                MyFormula = Mycell.Formula
                'Converts formula to absolute reference style
                NewFormula = Application.ConvertFormula _
                    (Formula:=MyFormula, _
                    fromReferenceStyle:=xlA1, _
                    toReferenceStyle:=xlA1, _
                    toAbsolute:=xlAbsolute)
                'Replaces old formula with new absolute formula
                Mycell.Formula = NewFormula
            End If
        Next
End Sub

et en plus succinct (code de job75)
(Nous étions en 2011)
Code:
Sub Convertir()
Dim cel As Range
For Each cel In Intersect(Selection, ActiveSheet.UsedRange)
  If cel.HasFormula Then _
    cel.Formula = Application.ConvertFormula(cel.Formula, xlA1, , True)
Next
End Sub
 
Bonjour.
Si ça vous intéresse, j'ai une procédure que j'utilise beaucoup, affectée à un bouton de la barre de lancement rapide, et qui fait presque ça, sauf qu'elle laisse en relatif les références à la ligne ou à la colonne de la cellule portant la formule, ce que j'estime être le besoin le plus fréquent.
VB:
Sub Dollars()
   Dim RgSel As Range, Rg As Range
   Set RgSel = Selection
   For Each Rg In RgSel: Dollars1Cel Rg: Next Rg
   End Sub
Private Sub Dollars1Cel(ByVal Rg As Range)
   Dim ZOrg As String, lig As Long, Col As Long, SplO() As String, ZRés As String, N As Long, _
      Maju As String, P As Long, C As String * 1, SplF() As String ', PDéb As Long, PFin As Long
   ZOrg = Rg.FormulaR1C1: If ZOrg = "" Then Exit Sub
   lig = Rg.Row: Col = Rg.Column
   SplO = Split(ZOrg, "["): ZRés = SplO(0)
   For N = 1 To UBound(SplO)
      Maju = ""
      For P = Len(ZRés) To 1 Step -1
         C = Mid$(ZRés, P, 1): If C = LCase(C) Then Exit For
         Maju = C & Maju: Next P
      If Maju = "R" Then
         SplF = Split(SplO(N), "]"): ZRés = ZRés & lig + SplF(0) & SplF(1)
      ElseIf Maju = "C" Or Maju = "RC" Then
         SplF = Split(SplO(N), "]"): ZRés = ZRés & Col + SplF(0) & SplF(1)
      Else
         ZRés = ZRés & "[" & SplO(N)
         End If
      Next N
   If ZRés <> ZOrg Then
      On Error Resume Next
      Application.Calculation = xlCalculationManual
      If Rg.HasArray Then
         Rg.CurrentArray.FormulaArray = Application.ConvertFormula(ZRés, xlR1C1, xlA1) ', RelativeTo:=Rg.CurrentArray)
         If Err Then MsgBox "Range(" & Rg.CurrentArray.Address(True, True) & ").FormulaArray =" _
            & vbLf & """" & ZRés & """ ==> erreur " & Err.Number & " :" _
            & vbLf & Err.Description, vbExclamation, "Mettre les ""$""."
      Else
         Rg.FormulaR1C1 = ZRés
         If Err Then MsgBox "Range(" & Rg.Address(True, True) & ").FormulaR1C1 =" _
            & vbLf & """" & ZRés & """ ==> erreur " & Err.Number & " :" _
            & vbLf & Err.Description, vbExclamation, "Mettre les ""$""."
         End If
      Application.Calculation = xlCalculationAutomatic
      On Error GoTo 0
      End If
   End Sub
 
Dans quelle cellule ? Sur quelle plage ? Les ref de cellules peuvent elles changer ?

Alors au pif et très simple, si la formule est en B3 :
VB:
Sub EnAbsolu()
    Chaine = [B3].Formula
    If Mid(Chaine, 5, 1) <> "$" Then Chaine = Mid(Chaine, 1, 4) & "$" & Mid(Chaine, 5)
    If Mid(Chaine, 10, 1) <> "$" Then Chaine = Mid(Chaine, 1, 9) & "$" & Mid(Chaine, 10)
    If Mid(Chaine, 15, 1) <> "$" Then Chaine = Mid(Chaine, 1, 14) & "$" & Mid(Chaine, 15)
    [B3].Formula = Chaine
End Sub
merci, mais ca ne repond pas dans tous les cas comme par exemple le cas des cellules ou le nom de la colonne comporte plusieurs lettres.
 
C'est pour ça que ma macro part de la formule style R1C1 où les références relatives aux lignes et colonnes différentes de celles de la cellule concernée sont spécifiées entre crochets droits derrière "R", "C" ou "RC".
 
Re,
Avec un petit fichier test et un peu plus de détail sur la demande, cela serait plu simple de répondre.
On peut tourner en rond longtemps sans un petit effort de votre part.
mais ca ne répond pas tout à fait à mon problème.
Ca ne veut pas dire grand chose, sauf à jouer aux devinettes. 😉
 
Alors je pense que la solution de @Staple1600 devrait convenir.
Bonjour à tous,
Le post de @Staple1600 fonctionne parfaitement sur des formules ayant des adresses de base ou des Noms simples.
En cas de formules faisant référence à des éléments de tableau structuré avec des crochets, le code devient destructif dans la mesure où le convertformula remplace la formule par #Valeur ( pas de retour arrière ...) [expérience vécue et non résolue] 😭
 
Notez que comme aucune des cellules intervenant dans votre formule en exemple n'est sur la même ligne ni la même colonne qu'elle, ma Sub Dollars le fait, exactement, après sélection de la cellule D8.
Pour que ça se fasse aussi pour celles là, utilisez la méthode Application.ConvertFormula comme le préconise @Staple1600.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
511
Réponses
1
Affichages
277
Réponses
10
Affichages
771
Retour