Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Procédure VBA - Adresses absolues

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
 

Rime B

XLDnaute Nouveau
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.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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
 

Staple1600

XLDnaute Barbatruc
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
 

Dranreb

XLDnaute Barbatruc
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
 

Rime B

XLDnaute Nouveau
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.
 

Dranreb

XLDnaute Barbatruc
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".
 

fanch55

XLDnaute Barbatruc
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]
 

Dranreb

XLDnaute Barbatruc
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.
 

Discussions similaires

Réponses
3
Affichages
350
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…