Problème avec FormulaR1C1 - VB/VBA/VBS - Programmation
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
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"" )"
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.
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?
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
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 & " )"
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
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]) "
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" )
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
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.
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
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
Marsh Posté le 29-07-2008 à 14:47:17
autant pour moi jai parle trop vite
effectivement ca marche
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 = )
Marsh Posté le 29-07-2008 à 14:56:35
86vomito33 a écrit : je v y arrive |
Lol nan, c'etait pour renvoyer la chaine finale avec les guillemets...
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...
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)
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
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.
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"" )"
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 !!!
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???
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 & "]"
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...
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?
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
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])"
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é
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
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.
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
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.