[VBA] FormulaR1C1 v FormulaArray

F22Raptor

XLDnaute Impliqué
Bonjour à tous,
Sur ce fichier joint, j'ai deux boutons :
le premier colle des formules R1C1 sur une zone B1:B3.
le second colle des formules ARRAY sur la même zone.


Lorsque je colle R1C1 sur la zone, la référence se décale bien au fur et à mesure des lignes : R[C-1] est bien interprété.
En revanche, en ARRAY, B1 fait référénce à A1, mais idem pour B2, B3, etc ...
La formulaArray ne se décale pas !

Une idée pour avoir les avantages d'une R1C1 en formule matricielle ?

Merci !
 

Pièces jointes

  • array_r1c1.xlsm
    18.4 KB · Affichages: 43

F22Raptor

XLDnaute Impliqué
Re : [VBA] FormulaR1C1 v FormulaArray

hello
En attendant de trouver mieux, je fais d'abord une R1C1 (avec supprespace), qui ne marche donc pas, et je fais ensuite :

Range("B1:B3").FormulaArray = Range("B1:B3").FormulaR1C1

C'est moins bien qu'en une fois, mais c'est rapide
 

F22Raptor

XLDnaute Impliqué
Re : [VBA] FormulaR1C1 v FormulaArray

Salut Dran,
Ca ne marche pas chez moi : et curieusement, la formule ne fait pas référence à A1,A2,A3, mais "la cellule sur laquelle je suis au moment où je clique, colonne [-1]" !

Bon, j'avoue que ma soluce en deux lignes fonctionne correctement, donc je vais rester là-dessus.
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] FormulaR1C1 v FormulaArray

Ajoutez un paramètre RelativeTo. Exemple :
VB:
 If Rg.HasArray Then
      Rg.CurrentArray.FormulaArray = Application.ConvertFormula(LaFormuleR1C1, xlR1C1, xlA1, RelativeTo:=Rg.CurrentArray)
Remarque: Je ne l'avais pas dans le code d'où j'ai extrait cet exemple (c'est une macro qui ajoute automatiquement les dollars seulement là où il faut dans 99,99% des cas) et ça ne me gênait pas, parce que la formule résultant ne comportait plus de référence relative ormis celles à la ligne et à la colonne contenant la formule. Je vous la livre :
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
…Mais j'ai peur que ça ne marche plus avec des formules contenant des référence à des éléments de tableaux (objet ListObject) qui peuvent aussi contenir des crochets droits…
 
Dernière édition:

Discussions similaires

Réponses
1
Affichages
1 K

Statistiques des forums

Discussions
312 581
Messages
2 089 917
Membres
104 306
dernier inscrit
Bouhlal