[VBA] ValeurCube R1C1 variables

Fermé
Mr Koffe - 19 janv. 2011 à 10:03
 Mr Koffe - 24 janv. 2011 à 10:40
Bonjour le forum,

je rencontre actuellement un problème avec l'écriture de formule Excel via VBA.
Mise en situation :
dans un onglet d'un fichier Excel j'ai :
en A1 : un pays (on va dire "France")
en A2 : un mois (on va dire "Janvier")
en C3 : 1ere quinzaine et en D3 : 2e quinzaine
en A4 : Paris et en B4 : Chaussures Nike
en A5 : Paris et en B5 : Chaussures Converse
en A6 : Paris et en B6 : Chaussures Adidas
en A7 : Paris et en B7 : Chaussures Flic Flac
en A4 : Lille et en B4 : Chaussures Nike
en A5 : Lille et en B5 : Chaussures Converse
en A6 : Lille et en B6 : Chaussures Adidas
en A7 : Lille et en B7 : Chaussures Flic Flac
et ainsi de suite avec d'autre ville de France.

En cellule C4 j'écris manuellement
=ValeurCube("BasedeDonnées";$A$1;$A$2;C$3;$A4)
Cette formule, si vous ne la connaissez pas, renvoie la valeur d'un indicateur dans une base de données en suivant les critères que nous lui donnons (France, Janvier, etc.)
Mais mon problème n'est pas lié à cette fonction.
Je cherche en fait à comprendre comment fonctionne les Formula R1C1 en vba pour pouvoir écrire cette formule (en prenant en compte les "$") dans toutes les cases du tableau en VBA.
Pour se faire, j'aurai souhaité savoir si nous pouvions introduire un équivalent des "$" dans une notation relative de type R1C1 ? et également si il était possible d'utiliser une variable à la place du 1. Par exemple, est-il possible d'écrire :
i = 4
L = 3
R[i]C[L]

Si vous connaissez un bon tutoriel (gratuit :p) sur l'utilisation des formules en VBA cela fera églament l'affaire.

Merci d'avance pour votre aide.
A voir également:

3 réponses

eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 237
Modifié par eriiic le 19/01/2011 à 12:43
Bonjour tout le monde,

L'enregistreur de macro utilise .formulaR1C1.
Mais tu n'es pas obligé de l'utiliser, tu as également .formula qui te permet d'utiliser les références de type A1 sans te prendre la tête.

D'autre part ces 2 propriétés t'obligent à utiliser le nom anglais des fonctions.
Tu as également .formulaLocal (et .formulaLocalR1C1) qui elles utilisent les noms de fonctions de la langue utilisée.

Ce qui simplifie considérablement l'écriture en vba : un copier-coller de ta fonction.
Puis le remplacement des parties variables (sans oublier de fermer et de rouvrir tes chaines avec " " à chaque remplacement).
Par exemple remplacer A1 par: " & col & lig & "

Sinon le principe est celui expliqué par ccm81 : une chaine concaténée pouvant utiliser des variables.


eric
2
ccm81 Messages postés 10899 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 25 octobre 2024 2 422
19 janv. 2011 à 15:39
>eriiic
merci pour le .formulaLocalR1C1, et dire que je n'y avais jamais pensé !!!!
cordialement
0
Merci à vous deux pour vos réponses avisées :) (notamment eriic, j'avais déjà posté en Octobre et tu avais été d'une grande aide !).
J'ai pu résoudre mon problème en utilisant la réponse de ccm81, la réponse d'eriic m'aura quant à elle permis de comprendre un peu plus comment fonctionnant les différents formula. J'avoue que j'ignorais qu'il y avait moyen d'écrire formula (id est sans le R1C1). Ca m'aurait changé la vie :p.

Cependant (y'a toujours un cependant ... :) ) je rencontre actuellement un autre problème.
L'idéal pour que je vous l'expose serai que je mette un fichier excel en pièce jointe. Pourriez vous m'indiquer un site sur lequel je pourrai stocker mon fichier, à l'image de imagehack pour les images.

Merci encore.
0
Pour information, le problème rencontré est un problème lié à unechaine de caractère trop longue dans une variable VBA, et je reçois un message d'erreur lorsque je veux attribuer à une cellule le contenu de mon "string" sous forme de formule R1C1.
Le message est : "Mémoire insuffisante".
Je préfererai donc vous fournir mon fichier , plutot que de vous donner des informations éventuellement incomplètes.
0
ccm81 Messages postés 10899 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 25 octobre 2024 2 422
Modifié par ccm81 le 19/01/2011 à 10:26
bonjour

une formule style R1C1 est une chaine de caractere, qui doit etre exactement celle qui figure dans une cellule excel, on l'obtient en concatenant simplement les différentes parties de la formule

un exemple avzec un nom de feuille

Const f1 = "'Feuil1'"   
dim b1 as string   

  b1 = "=" & f1 & "!R" & lig & "C" & col1 - 1   
  Cells(i, co2).FormulaR1C1 = b1


et pour ton exemple de reference absolue ($)

i = 4
L = 3
R[i]C[L]

f = "=R" & i & "C" & L
qui donnera dans la feuille excel
=L4C3
ou
=$C$4
selon le style choisi (L1C1 ou A1)

bonne suite
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 237
20 janv. 2011 à 13:48
Bonjour,

Le message est : "Mémoire insuffisante
Essaie déjà en fermant et relançant excel...
Pour déposer un fichier : cijoint.fr et coller ici le lien fourni.
eric
0
Rebonjour Eriiic, voici le lien vers mon fichier :
http://www.cijoint.fr/cjlink.php?file=cj201101/cij4AZitYJ.xls
En lançant le code, j'obtiens une erreur "Mémoire insuffisante" lorsque je suis sur l'ensemble de la population française.
De plus j'ai l'impression que ma variable TxtPopu est inadaptée et ne stocke pas comme je l'aurai souhaité tout les informations que j'y envoie.
Bonne réception.

Edit : J'ai bien essayer de redémarrer mon ordinateur avant de relancer le code, mais ça ne marche toujours pas.
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 237
Modifié par eriiic le 20/01/2011 à 20:21
lorsque je suis sur l'ensemble de la population française
Ah oui ? Et on fait comment pour y être ??

De toute façon je ne peux rien tester pour l'instant, tu utilises une fonction d'excel 2007 : _xlfn.CUBEMEMBER ?

eric
0
Bonjour Eriiic,

lorsque je suis sur l'ensemble de la population française
Dans l'onglet Popu j'ai différent segment de la population française.
Je navigue parmi ces segments de colonne en colonne, et si un segment est composé de plusieurs sous segments, ces derniers sont écrits dans les lignes dessous. Le code parcours les colonnes 1 à 1 et s'arrette sur les sous segments si il y en a.

Concernant la fonction d'Excel 2007, sauf erreur de ma part, ce n'est pas la racine du problème. On pourra remplacer cette fonction par n'importe quelle autre fonction d'Excel, à partir du moment ou chaque fonction prend suffisamment de place pour "remplir" la variable et/ou la formule Excel.
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 237
21 janv. 2011 à 19:38
Bonsoir,

J'ai relevé 2 erreurs au même endroit, à partir de la ligne 1506.
D'une part formule trop longue (>1024 pour excel 2003, sur 2007 il faudra que tu sois <=8192), d'autre part à ce moment cette formule se termine par '+'
J'ai ajouté des lignes dans ton code pour que la macro s'arrete juste avant l'erreur et liste qcq variables.
A toi de voir ce qui cloche dans la construction de ta formule...

D'ailleurs vu le nombre et le type de calcul il serait plus intéressant de n'inscrire que le résultat dans la cellule (si c'est possible pour ton projet).
Et lorsque tu auras fini de déboguer d'ajouter au début application.screenupdating=false , et de le rétablir avec TRUE en fin de macro

Les versions 2003 et 2007 du fichier modifié : http://www.cijoint.fr/cjlink.php?file=cj201101/cij7VstHKI.zip

eric
0
Merci beaucoup, pour ton aide et tes informations.
Il est possible d'inscrire directement le résultat dans la cellule, j'avais bien tenté un Evaluate mais sans succès.
Je retourne vaquer à mes occupations, en n'ommetant pas de te remercier une fois encore.
Bonne semaine à toi et à la prochaine :)
0