Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1372 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Problème avec FormulaR1C1

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec FormulaR1C1

n°1766238
commandera​mo
Posté le 29-07-2008 à 11:13:48  profilanswer
 

Bonjour à tous,
voilà, je fais du VBA depuis deux semaines, je suis encore un peu débutant.
 
J'ai un vrai soucis qui me fait perdre énormément de temps, je cherche à rentrer automatiquement des formules pour calculer les valeurs de certaines cellules. J'utilise pour ce faire la fonction FormulaR1C1, puis des fonctions logiques genre IF, AND, OR, EXACT, T().
 
Le problème est qu'Excel trouve une erreur dans cette ligne, de syntaxe apparemment, au niveau des crochets dans l'expression suivante (c'est un peu long) :
 
IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]="" );OR(EXACT(T(RC[-2 ]);R[-1]C[-2]);RC[-2 ]="" );OR(EXACT(T(RC[-3 ]);R[-1]C[-3]);RC[-3 ]="" );OR(EXACT(T(RC[-4 ]);R[-1]C[-4]);RC[-4 ]="" );OR(EXACT(T(RC[-5 ]);R[-1]C[-5]);RC[-5 ]="" );OR(EXACT(T(RC[-6 ]);R[-1]C[-6]);RC[-6 ]="" );OR(EXACT(T(RC[-7 ]);R[-1]C[-7]);RC[-7 ]="" );OR(EXACT(T(RC[-8 ]);R[-1]C[-8]);RC[-8 ]="" );OR(EXACT(T(RC[-9 ]);R[-1]C[-9]);RC[-9 ]="" );OR(EXACT(T(RC[-10 ]);R[-1]C[-10]);RC[-10 ]="" );OR(EXACT(T(RC[-11 ]);R[-1]C[-11]);RC[-11 ]="" ));"OK";"KO" )
 
 
Donc il ne veut pas des crochets, pourtant il me semble que c'est bien comme ca qu'il faut l'écrire. Dans mon code je n'ai pas tapé de -2, pas de références absolues comme ca, j'ai tapé les lignes suivantes :
 
 Chaine_Temp = "COUNTBLANK(RC[-" & Num_Exig & "]:RC[-1]);"
For m = 1 To Num_Exig
         Chaine_Temp = Chaine_Temp & "OR(EXACT(T(RC[-" & m & " ]);R[" & -k & "]C[-" & m & "]);RC[-" & m & " ]="""" );"
 Next m
Chaine_Temp = Left(Chaine_Temp, Len(Chaine_Temp) - 1)
Chaine_Final = "IF(AND(" & Chaine_Temp & " );""OK"";""KO"" )"
ActiveCell.FormulaR1C1 = Chaine_Final
 
 
J'avais au préalable sélectionné la cellule qu'il fallait.
Pour récapituler, la première formule est celle qu'il m'inscrit dans mon tableau (quand j'ai retiré le signe = de formule, juste pour voir ce qui peut clocher), et la seconde c'est mon code.  
 
Comment faire ??
Merci d'avance.
 

mood
Publicité
Posté le 29-07-2008 à 11:13:48  profilanswer
 

n°1766262
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 11:55:11  profilanswer
 

Bonjour
 
J'ai pas poussé les tests plus loin, mais ta chaine ne ferait pas plus de 256 caracteres ?
Je ne suis plus sur du nombre mais il me semble qu'on etait limité dans Excel avant le 2007...
Et la, brute elle fait 549 caracteres...
 
Cordialement


Message édité par SuppotDeSaTante le 29-07-2008 à 11:57:03

---------------
Soyez malin, louez entre voisins !
n°1766279
86vomito33
Posté le 29-07-2008 à 13:00:41  profilanswer
 

bonjour  
 
juste au cas ou, il te manque pas un egal(=)
Chaine_Final = "=IF(AND(" & Chaine_Temp & " );""OK"";""KO"" )"

n°1766287
commandera​mo
Posté le 29-07-2008 à 13:20:20  profilanswer
 

Alors, ma chaine est bien longue en effet, mais comment faire autrement si je dépasse la limite? Et puis est ce que c'est vraiment un problème?
 
Pour ce qui est du égal, je l'ai enlevé mais c'était seulement pour voir ce qu'il se passe, car si je le mets ca bug. C'est donc un test que j'ai fait de l'enlever. Mais bien sur, quand tout fonctionnera correctement je le remettrai.
 
 
Je vous remercie pour ces premières réponses, mais je vois toujours pas comment m'en sortir.

n°1766291
commandera​mo
Posté le 29-07-2008 à 13:25:42  profilanswer
 

Je précise que j'utilise Excel 2003.
Mais j'ai un vrai problème, je ne sais pas du tout quelle taille fera ma formule, ca peut varier. Puis je n'ai pas qu'une formule de ce genre, mais toute une colonne !  J'obtiens ces différentes formules en concaténant un nombre de chaînes variable. Comment faire pour être sur que ma formule ne soit pas trop longue, si tel est le problème?

n°1766308
86vomito33
Posté le 29-07-2008 à 14:06:55  profilanswer
 

re  
je suis pas persuade que ca vienne de la longueur
si tu essais avec =sum(RC[-11]:RC[-1])
tu as le meme probleme
il sagirait plus des RC

n°1766315
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 14:19:10  profilanswer
 

hum en fait je pense que cela vient plutot des doubles cotes.
 
Je m'explique.
FormulaR1C1 est une propriété qui accepte les données de type string et/ou variant (notament pour les range).
Donc par exemple pour le début :  
IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]="" )
Mais plutot
"IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]="""" )"
 
Le mieux je pense, enfin c'est ce que je fais pour pas me prendre la tete, je créé une variable nommée Guill ayant pour valeur Chr(34) (une double cote, ou encore guillemet)
Ensute je fais appel a cette variable pour eviter les 4 doubles cotes...
 
Guill=Chr(34)
ActiveCell.FormulaR1C1 = "IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]=" & Guill & "" & guill & " )"


Message édité par SuppotDeSaTante le 29-07-2008 à 14:33:00

---------------
Soyez malin, louez entre voisins !
n°1766316
commandera​mo
Posté le 29-07-2008 à 14:20:13  profilanswer
 

Oui, c'est ce que je pensais aussi, d'ailleurs je dis dans mon premier post que le problème vient des crochets. Je suis d'accord avec toi vomito, c'est du côté des RC que ca bug, mais je crois que pourtant c'est la bonne syntaxe.  
Je suis dans l'impasse

n°1766319
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 14:22:30  profilanswer
 

J'ai édité.
 
Les crochets je ne pense pas... Je parle des cotes moi : ""  <(--- ça.
Si je c.c ta chaine dns VBA la string n'est pas bonne.
 
=sum(RC[-11]:RC[-1])   <(--- ca marche tres bien.... Il faut juste le mettre en chaine, avec des doubles cotes justement.
   
ActiveCell.FormulaR1C1 = "=sum(RC[-11]:RC[-1]) "
 


Message édité par SuppotDeSaTante le 29-07-2008 à 14:24:12

---------------
Soyez malin, louez entre voisins !
n°1766329
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 14:28:14  profilanswer
 

Essaie ceci :  
 
Guill = Chr(34) 'Valeur du double cote
ActiveCell.FormulaR1C1 = "IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-2 ]);R[-1]C[-2]);RC[-2 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-3 ]);R[-1]C[-3]);RC[-3 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-4 ]);R[-1]C[-4]);RC[-4 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-5 ]);R[-1]C[-5]);RC[-5 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-6 ]);R[-1]C[-6]);RC[-6 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-7 ]);R[-1]C[-7]);RC[-7 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-8 ]);R[-1]C[-8]);RC[-8 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-9 ]);R[-1]C[-9]);RC[-9 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-10 ]);R[-1]C[-10]);RC[-10 ]=" & Guill & Guill & " );OR(EXACT(T(RC[-11 ]);R[-1]C[-11]);RC[-11 ]=" & Guill & Guill & " ));" & Guill & "OK" & Guill & ";" & Guill & "KO" & Guill & " ) "
 
 
J'ai edité, c'est Chr(34) gros boulay que je suis
Et donc la chaine renvoyée par ce que j'ai mis en haut est :  
=IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]="" );OR(EXACT(T(RC[-2 ]);R[-1]C[-2]);RC[-2 ]="" );OR(EXACT(T(RC[-3 ]);R[-1]C[-3]);RC[-3 ]="" );OR(EXACT(T(RC[-4 ]);R[-1]C[-4]);RC[-4 ]="" );OR(EXACT(T(RC[-5 ]);R[-1]C[-5]);RC[-5 ]="" );OR(EXACT(T(RC[-6 ]);R[-1]C[-6]);RC[-6 ]="" );OR(EXACT(T(RC[-7 ]);R[-1]C[-7]);RC[-7 ]="" );OR(EXACT(T(RC[-8 ]);R[-1]C[-8]);RC[-8 ]="" );OR(EXACT(T(RC[-9 ]);R[-1]C[-9]);RC[-9 ]="" );OR(EXACT(T(RC[-10 ]);R[-1]C[-10]);RC[-10 ]="" );OR(EXACT(T(RC[-11 ]);R[-1]C[-11]);RC[-11 ]="" ));"OK";"KO" )  


Message édité par SuppotDeSaTante le 29-07-2008 à 14:33:53

---------------
Soyez malin, louez entre voisins !
mood
Publicité
Posté le 29-07-2008 à 14:28:14  profilanswer
 

n°1766339
86vomito33
Posté le 29-07-2008 à 14:40:48  profilanswer
 

jai aussi 2003 et les RC ne marche pas :)
 
extrait de laide:
If you use a text argument for the range address, you must specify the address in A1-style notation (you cannot use R1C1-style notation)
 
en utilisant un range(cells(activecell.row,activecell.column),cells(activecell.row,activecell.column)) a la place du RC ca pourrait tres bien le faire


Message édité par 86vomito33 le 29-07-2008 à 14:43:29
n°1766340
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 14:43:12  profilanswer
 

Tu saisis quoi dans ton code ?
 
Car sous 2000, Xp, 2003, 2007  
ActiveCell.FormulaR1C1 = "=sum(RC[-11]:RC[-1]) "
Fonctionne.
 
Et de toute facon la construction de sa chaine n'est pas bonne, des guillemets a l'interieure d'une chaine elle meme delimitée par des guillemets ca ne le fait pas.


---------------
Soyez malin, louez entre voisins !
n°1766341
86vomito33
Posté le 29-07-2008 à 14:44:45  profilanswer
 

je copie dans L24 "=sum(RC[-11]:RC[-1])"
 
c bien comme ca ou je me trompe

n°1766342
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 14:45:12  profilanswer
 

Ah bah non...
C'est dans l'editeur de vba...
 
C'est ton code vba qui fait le formular1c1


Message édité par SuppotDeSaTante le 29-07-2008 à 14:46:03

---------------
Soyez malin, louez entre voisins !
n°1766343
86vomito33
Posté le 29-07-2008 à 14:47:17  profilanswer
 

autant pour moi jai parle trop vite
effectivement ca marche

n°1766346
86vomito33
Posté le 29-07-2008 à 14:50:10  profilanswer
 

je v y arrive
:)
 
avec ca ca ne marche pas
guill = Chr(34)
ActiveCell.FormulaR1C1 = "=IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]=" & guill & "" & guill & " )"
 
ct considere comme du texte et pas comme une formule ()tave oublie le =  )

n°1766351
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 14:56:35  profilanswer
 

86vomito33 a écrit :

je v y arrive
:)
 
avec ca ca ne marche pas
guill = Chr(34)
ActiveCell.FormulaR1C1 = "=IF(AND(COUNTBLANK(RC[-11]:RC[-1]);OR(EXACT(T(RC[-1 ]);R[-1]C[-1]);RC[-1 ]=" & guill & "" & guill & " )"
 
ct considere comme du texte et pas comme une formule ()tave oublie le =  )


 
Lol nan, c'etait pour renvoyer la chaine finale avec les guillemets...


---------------
Soyez malin, louez entre voisins !
n°1766367
commandera​mo
Posté le 29-07-2008 à 15:37:53  profilanswer
 

Bon ca ne marche toujours pas je crois. J'ai essayé ma formule avec le guill, ben rien de neuf, ca fait toujours l'erreur, même si la formule m'a toujours l'air bonne, et que Guill est bien remplacé par des guillemets.
Pourquoi dis tu que cela fonctionne vomito?
J'y arrive toujours pas...

n°1766368
86vomito33
Posté le 29-07-2008 à 15:42:34  profilanswer
 

non non
 
par contre en utilisant un range(cells(activecell.row,activecell.column),cells(activecell.row,activecell.column)) a la place du RC ca pourrait tres bien le faire
 
 
EDIT:
je reste persuade que le RC ne fonctionnera pas mais jai le droit de me tro;per :)
 
extrait de laide:  
If you use a text argument for the range address, you must specify the address in A1-style notation (you cannot use R1C1-style notation)


Message édité par 86vomito33 le 29-07-2008 à 15:43:48
n°1766370
commandera​mo
Posté le 29-07-2008 à 15:45:43  profilanswer
 

Oh purée j'avais pas vu ca !!
Oki, bah c'est super ca j'essaye ta méthode !!!
Merci, je te tiens au courant

n°1766375
commandera​mo
Posté le 29-07-2008 à 15:53:25  profilanswer
 

Bon bah là non plus ca marche pas, il me dit qu'il y'a une erreur sur activecell.row.

n°1766376
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 15:53:55  profilanswer
 

Ca chez moi, ca marche tres bien :
        "=IF(AND(COUNTBLANK(R[19]C[5]:R[19]C[15])<11,OR(EXACT(T(R[19]C[5]),R[14]C[5]),R[19]C[5]="""" ),OR(EXACT(T(R[19]C[6]),R[14]C[6]),R[19]C[6]="""" ),OR(EXACT(T(R[19]C[7]),R[14]C[7]),R[19]C[7]="""" ),OR(EXACT(T(R[19]C[8]),R[14]C[8]),R[19]C[8]="""" ),OR(EXACT(T(R[19]C[9]),R[14]C[9]),R[19]C[9]="""" ),OR(EXACT(T(R[19]C[10]),R[14]C[10]),R[19]C[10]="""" ),OR(EXACT(T(R[19]C[11]),R[14]C[11]),R[19]C[11]="""" )*OR(EXACT(T(R[19]C[12]),R[14]C[12]),R[19]C[12]="""" ),OR(EXACT(T(R[19]C[13]),R[14]C[13]),R[19]C[13]="""" ),OR(EXACT(T(R[19]C[14]),R[14]C[14]),R[19]C[14]="""" ),OR(EXACT(T(R[19]C[15]),R[14]C[15]),R[19]C[15]="""" )),""OK"",""KO"" )"


---------------
Soyez malin, louez entre voisins !
n°1766386
commandera​mo
Posté le 29-07-2008 à 16:01:47  profilanswer
 

Moi aussi, mais dans mon code, avec les "lettres" c'est à dire pas en mettant directement les numéros des lignes et des colonnes, j'y arrive pas. Mais là c'est vrai ca marche c'est très encourageant !!!

n°1766388
commandera​mo
Posté le 29-07-2008 à 16:02:32  profilanswer
 

Et qu'est ce que c'est que ce signe * dans la formule, j'avais rien mis de tel moi???

n°1766389
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 16:03:43  profilanswer
 

Bah il suffit de remplacer le numero soit de R soit de C par ta variable...
Genre
 
"R[" & Var & "]C[" & Var2 & "]"


---------------
Soyez malin, louez entre voisins !
n°1766392
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 16:04:46  profilanswer
 

Lol l'etoile c'est une erreur de frappe, c'est un point virgule a mettre...


---------------
Soyez malin, louez entre voisins !
n°1766395
commandera​mo
Posté le 29-07-2008 à 16:05:24  profilanswer
 

Oups j'ai une peur subitement, R[-4]C[2] ca désigne bien la cellule qui se situe 4 lignes avant et deux colonnes après la cellule active?

n°1766403
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 16:13:16  profilanswer
 
n°1766409
commandera​mo
Posté le 29-07-2008 à 16:16:00  profilanswer
 

BAh non ca marche pas avec les lettres dje69r, vomito doit avoir raison. En fait j'en sais rien, mais ca ne fonctionne pas. lol

n°1766431
SuppotDeSa​Tante
Aka dje69r
Posté le 29-07-2008 à 16:41:19  profilanswer
 

Bah ecoutes, si je fais un test tout bete :
A1 la somme de B1 à B10
Ca, ca marche tres bien :
     
    Var = 1
    Var2 = 9
    ActiveCell.FormulaR1C1 = "=SUM(RC[" & Var & "]:R[" & Var2 & "]C[" & Var & "])"
 
Ca me renvoit bien la chaine :  
"SUM(RC[1]:R[9]C[1])"


Message édité par SuppotDeSaTante le 29-07-2008 à 16:42:02

---------------
Soyez malin, louez entre voisins !
n°1766437
commandera​mo
Posté le 29-07-2008 à 16:52:50  profilanswer
 

Bah oui mais du coup je vois pas ce qui est faux dans mon programme, la dernière version que je t'ai envoyée sur ton mail, où j'ai fait les changements que tu m'as indiqué (le Guill par exemple). Dès que je remet le = ca bug complètement...
Je suis vraiment pas doué

n°1766620
SuppotDeSa​Tante
Aka dje69r
Posté le 30-07-2008 à 09:14:45  profilanswer
 

Bonjour
 
J'ai du mal a exploiter ton fichier etant donné qu'il est vierge...
 
Ajoute un point d'arret ici :
                    ActiveCell.FormulaR1C1 = Chaine_Final
Et juste au dessus tu fais un :
                    Debug.Print Chaine_Final
 
Et donne moi le resultat du Chaine_Final
 
Car sans les infos qui sont construites avant le calcul des ok/ko je peux pas faire grand chose...
Ou alors file un fichier avec les infos construites juste avant le calcul ok/ko...
 
Cordialement


Message édité par SuppotDeSaTante le 30-07-2008 à 09:19:26

---------------
Soyez malin, louez entre voisins !
n°1766622
commandera​mo
Posté le 30-07-2008 à 09:28:34  profilanswer
 

Bon, je peux pas tester tout de suite ce que tu m'as dit, mais je suis très impatient de le faire. Je t'envoie ce que tu m'as demandé dès que je peux.

n°1766640
86vomito33
Posté le 30-07-2008 à 10:16:21  profilanswer
 

yep
 
heureusement que jai pas abandonne, jai fini par trouve UNE solution
 
Sub test()
l = ActiveCell.Row
C = ActiveCell.Column
Num_Exig = A DEFINIR
Chaine_Temp = "COUNTBLANK(" & Chr(64 + C - Num_Exig) & "" & l & ":" & Chr(64 + C - 1) & "" & l & " ),"
For m = 1 To Num_Exig
Chaine_Temp = Chaine_Temp & "OR(EXACT(T(" & Chr(64 + C - m) & "" & l & " )," & Chr(64 + C - m) & "" & l - k & " )," & Chr(64 + C - m) & "" & l & "="""" ),"
Next m
Chaine_Temp = Left(Chaine_Temp, Len(Chaine_Temp) - 1)
Chaine_Final = "=IF(AND(" & Chaine_Temp & " ),""OK"",""KO"" )"
ActiveCell = Chaine_Final
End Sub


Message édité par 86vomito33 le 30-07-2008 à 14:16:59
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Problème avec FormulaR1C1

 

Sujets relatifs
[Problème] OpenGL, glBegin(GL_TRIANGLES)Probleme SSLV2
[Résolu] problème background-repeatProbleme particulié en xhtml/css - FIXED
Probleme TeXnicCenter compilation[HTML][JavaScript] Problème d'accès à l'état d'une checkbox via JS
Probleme de communication PHP/JS 'Edit in place'[RESOLU] Open Office Basic : Problème for each
probleme envoi mail avec MIME::Liteproblème de requête - FREETEXTTABLE (SQL serveur)
Plus de sujets relatifs à : Problème avec FormulaR1C1


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR