Problème avec FormulaR1C1

Problème avec FormulaR1C1 - VB/VBA/VBS - Programmation

Marsh Posté le 29-07-2008 à 11:13:48    

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.
 

Reply

Marsh Posté le 29-07-2008 à 11:13:48   

Reply

Marsh Posté le 29-07-2008 à 11:55:11    

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 !
Reply

Marsh Posté le 29-07-2008 à 13:00:41    

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

Reply

Marsh Posté le 29-07-2008 à 13:20:20    

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.

Reply

Marsh Posté le 29-07-2008 à 13:25:42    

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?

Reply

Marsh Posté le 29-07-2008 à 14:06:55    

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

Reply

Marsh Posté le 29-07-2008 à 14:19:10    

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 !
Reply

Marsh Posté le 29-07-2008 à 14:20:13    

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

Reply

Marsh Posté le 29-07-2008 à 14:22:30    

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 !
Reply

Marsh Posté le 29-07-2008 à 14:28:14    

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 !
Reply

Marsh Posté le 29-07-2008 à 14:28:14   

Reply

Marsh Posté le 29-07-2008 à 14:40:48    

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
Reply

Marsh Posté le 29-07-2008 à 14:43:12    

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 !
Reply

Marsh Posté le 29-07-2008 à 14:44:45    

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

Reply

Marsh Posté le 29-07-2008 à 14:45:12    

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 !
Reply

Marsh Posté le 29-07-2008 à 14:47:17    

autant pour moi jai parle trop vite
effectivement ca marche

Reply

Marsh Posté le 29-07-2008 à 14:50:10    

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 =  )

Reply

Marsh Posté le 29-07-2008 à 14:56:35    

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 !
Reply

Marsh Posté le 29-07-2008 à 15:37:53    

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

Reply

Marsh Posté le 29-07-2008 à 15:42:34    

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
Reply

Marsh Posté le 29-07-2008 à 15:45:43    

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

Reply

Marsh Posté le 29-07-2008 à 15:53:25    

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

Reply

Marsh Posté le 29-07-2008 à 15:53:55    

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 !
Reply

Marsh Posté le 29-07-2008 à 16:01:47    

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 !!!

Reply

Marsh Posté le 29-07-2008 à 16:02:32    

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

Reply

Marsh Posté le 29-07-2008 à 16:03:43    

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 !
Reply

Marsh Posté le 29-07-2008 à 16:04:46    

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


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 29-07-2008 à 16:05:24    

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?

Reply

Marsh Posté le 29-07-2008 à 16:13:16    

Reply

Marsh Posté le 29-07-2008 à 16:16:00    

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

Reply

Marsh Posté le 29-07-2008 à 16:41:19    

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 !
Reply

Marsh Posté le 29-07-2008 à 16:52:50    

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é

Reply

Marsh Posté le 30-07-2008 à 09:14:45    

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 !
Reply

Marsh Posté le 30-07-2008 à 09:28:34    

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.

Reply

Marsh Posté le 30-07-2008 à 10:16:21    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed