Microsoft 365 Coder en vba une formule

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonsoir à toutes et à tous,

Je bute sur un code que je n'arrive pas à faire.

J'ai cette formule dans ma cellule "F7":
=SI(CNUM(GAUCHE(F7;2))<>33;33&DROITE(F7;9);CNUM(DROITE(F9;3)&DROITE(F7;9)))

Je voudrais la traduire en code VBA dans mon code feuille
Private Sub Worksheet_SelectionChange(ByVal R As Range)
If Not Intersect(R, Range("f6:f15")) Is Nothing Then
MsgBoxListeDeChoix

J'ai cette formule dans une cellule :
=SI(CNUM(GAUCHE(F7;2))<>33;33&DROITE(F7;9);CNUM(DROITE(F9;3)&DROITE(F7;9)))
comme suit :
F7 = activecell (cellule active qui n'est jamais la même),
F9 = toujours A1

Auriez-vous le bon code ?
Si besoin, je ferai un petit fichier test.
Je vous remercie,
lionel :)
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Re,
Tu utilises quel événement, double clic, right clic ...?
Ce que j'ai compris
  • En A1 tu as l'indicatif du département d'outremer
  • A droite de la cellule active un n° commençant par 33 ou non
  • Si le n° ne commence pas par 33 tu renvoies 33 suivit des 9 chiffres de droite du n°
  • Si le n° commence par 33 tu renvoies l'indicatif en A1 suivit des 9 chiffres de droite du n°
C'est du moins ce que je comprends de ta formule et de

Est-ce bien ça ?
Amicalement
Alain
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re
Ce que je souhaite est que le code :
ActiveCell.FormulaR1C1 = _
"=IF(VALUE(LEFT(RC[1],2))<>33,33&RIGHT(RC[1],9),R1C[-4]&RIGHT(RC[1],9))"
me renvoie le résultat (la valeur) de la formule qu'elle aurait trouvée ... pas forcément 33
J'utilise :
Code:
Private Sub Worksheet_SelectionChange(ByVal R As Range)
If Not Intersect(R, Range("e7:e14")) Is Nothing Then
ActiveCell.FormulaR1C1 = "=IF(VALUE(LEFT(RC[1],2))<>33,33&RIGHT(RC[1],9),VALUE(RIGHT(R1C[-4],3)&RIGHT(RC[1],9)))"
'renvoyer dans ma cellule la valeur du résultat et NON la formule
End If
End Sub
:)
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Re

With R.offset(0,1)

R=iif(left(.value,2)<>"33", _
clng("33"&right(.value,9)), _
clng(cells(R.row,1)&right(.value,9))

End With

Ici on lit l'indicatif en colonne A sur la même ligne que R (qui devrait être la cellule active puisqu'elle a déclenché l'événement selection_change
Toujours sur mon téléphone, je ne peux pas tester
Amicalement
Alain
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
1648724450375.png
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re

With R.offset(0,1)

R=iif(left(.value,2)<>"33", _
clng("33"&right(.value,9)), _
clng(cells(R.row,1)&right(.value,9))

End With

Ici on lit l'indicatif en colonne A sur la même ligne que R (qui devrait être la cellule active puisqu'elle a déclenché l'événement selection_change
Toujours sur mon téléphone, je ne peux pas tester
Amicalement
Alain
Désolé : ne fonctionne pas :)
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re à tous :)
Bon ... j'ai trouvé en ajoutant simplement ce ch'ti code :
ActiveCell.value = ActiveCell.value

Mais je sais que c'est possible en modifiant directement ce code
:
ActiveCell.FormulaR1C1 = "=IF(VALUE(LEFT(RC[1],2))<>33,33&RIGHT(RC[1],9),VALUE(RIGHT(R1C[-4],3)&RIGHT(RC[1],9)))"

Je ne retrouve pas comment le faire Grrrrrr !!! :mad:
lionel :)
 

cp4

XLDnaute Barbatruc
Bonjour cp4 :)
C'est nickel, je te remercie ...
Juste, je voudrais renvoyer dans la cellule la valeur du résultat de la formule et non la formule "
ActiveCell.FormulaR1C1 = _
"=IF(VALUE(LEFT(RC[1],2))<>33,33&RIGHT(RC[1],9),R1C[-4]&RIGHT(RC[1],9))"
lionel :)
Re, @Usine à gaz , comme ceci
VB:
Private Sub Worksheet_SelectionChange(ByVal R As Range)
    If Not Intersect(R, Range("e7:e13")) Is Nothing Then
        'enregistreur de macro
        R.FormulaR1C1 = "=IF(VALUE(LEFT(RC[1],2))<>33,33&RIGHT(RC[1],9),R1C[-4]&RIGHT(RC[1],9))"
        R = R.Value
    End If
End Sub

@AtTheOne ;), stp pourrais-tu terminer la formule que tu as proposé au post#15

A+
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Re à tous, et cp4
La formule du post #16 ?
Enrichi (BBcode):
With target
          .value=iif(left(.offset(0,1),2)<>"33", _ 
           "33"&right(.offset(0,1),9), _
            [A1]&right(.offset(0,1), 9)
End with
Pas facile avec le clavier du téléphone et mes gros doigts !
Il y avait une erreur dans le dernier .offset
, du coup j'ai rajouté les 0 pour le décalage de ligne.
Je compte sur vous pour tester, moi je ne peux pas, je peux juste apercevoir les fichiers sans macro.
Amicalement
Alain
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Re re re à tous et à @cp4
Le code en entier tel que je le vois (avec R au lieu de Target)
Ce que j'ai compris
  • En A1 tu as l'indicatif du département d'outremer
  • A droite de la cellule active un n° commençant par 33 ou non
  • Si le n° ne commence pas par 33 tu renvoies 33 suivit des 9 chiffres de droite du n°
  • Si le n° commence par 33 tu renvoies l'indicatif A1 suivit des 9 chiffres de droite du n°

Enrichi (BBcode):
Private Sub Worksheet_SelectionChange(ByVal R As Range)
If Not Intersect(R,Range("e7:e14")) Is Nothing Then
   With R
      .value=iif(left(.offset(0,1),2)<>"33", _
      "33"&right(.offset(0,1),9), _
       [A1]&right(.offset(0,1), 9))
   End with
End If
End Sub
Amicalement
Alain
Modif : ajouté parenthèse fermante oubliée
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 735
Messages
2 082 024
Membres
101 873
dernier inscrit
excellllll