Enlever @ dans formule créé par itération via VBA

10classeur1.xlsx (12.72 Ko)

Bonjour à tous,

Avant tout de chose, les tableaux croisés dynamiques ne sont pas adaptés dans mon cas car l'outil que j'ai créé est un outil de calcul utilisant des tableaux à taille et nombre variable selon les inputs de l'utilisateur qui réalise ensuite des calculs itératifs pour optimiser certaines variables.

Comme c'est un peu compliqué je vais illustrer avec un exemple simple même si ce ne correspond pas exactement au but recherché mais la structure sera la même que celle de l'outil.

Prenons le cas d'une concession automobile vendant X modèles de voitures et où Y vendeurs y travaillent.

Le nombre de ventes mensuelles de chaque voiture est rangé dans tableaux par modèle comme ceci

Il y a donc X tableaux de ce type.

Voiture 1

jan

fev

mars

marc

voiture 1

voiture 4

voiture 8

jean

voiture 1

voiture 3

voiture 9

paul

voiture 2

voiture 1

voiture 5

Afin de réaliser des statistiques l'utilisateur renseigne un tableau de ce type où chaque case est une liste déroulante avec le nom des modèles de voiture

jan

fev

mars

marc

voiture 1

voiture 4

voiture 8

jean

voiture 1

voiture 3

voiture 9

paul

voiture 2

voiture 1

voiture 5

Le tableau suivant est obtenu à côté.

jan

fev

mars

marc

10

4

8

jean

12

2

6

paul

5

7

3

Je sais que cela ne semble pas du tout optimisé pour l'exemple mais moi j'ai vraiment besoin que cela fonctionne comme ceci pour mon besoin.

Je n'ai pas trouvé meilleur exemple pour illustrer désolé.

J'ai joint un fichier exemple pour que vous vous fassiez une meilleur idée du rendu.

Mon problème vient du VBA, tous ces tableaux sont générés correctement sauf le dernier avec les résultats.

La formule qui affiche le résultat est un enchainement de SI, ou en fonction du modèle renseigné dans le deuxième tableau, la recherche (via INDEX/EQUIV) ne se fait pas dans le même tableau (car il y a X tableaux 1).

Ainsi cette formule a une taille qui varie en fonction du nombre de modèle et donc je la construis avec une boucle For :

For r = 1 To 12

formule = ""

For u = 1 To NBMODEL

cellule_model = Cells(,).Address

nom_model = Cells(,).Address

tableau_vente = Range(Cells(,), Cells(,)).Address

colonne_vendeur = Range(Cells(,),Cells(,)).Address

ligne_mois = Range(Cells(,), Cells(,)).Address

vendeur = Cells(,).Address

mois= Cells(,).Address(True, False)

formule = formule + "IF(" & cellule_model & "=" & nom_model & ",INDEX(" & tableau_vente & ",EQUIV(" & vendeur & "," & colonne_vendeur & ",0),EQUIV(" & mois & "," & ligne_mois & ",0)),"

Next

formule = formule + "0"

For u = 1 To NBMODEL

formule = formule + ")"

Next

Cells(,).Formula = "=" & formule & ""

Next

Le problème que lorsque la formule est écrite, je me retrouve avec @ devant chaque SI et chaque EQUIV et les cases ne se calculent pas (erreur #NOM?). Apparemment, ce serait une réaction de sécurité d'Excel pour je ne sais quelle raison.

Si je fais ctrl H sur les tableaux pour les enlever à la main ça fonctionne parfaitement mais si je fais un ctrl H via VBA :

Range().Select

Selection.Replace What:="@", Replacement:="", LookAt:=xlPart, _

SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2

Et là toutes les cases sont en erreur #NOM? encore et je suis obligé de rentrer manuellement dans chaque case, faire entrer pour que cela fonctionne.

Et cela même si l'option de calcul de la feuille est en automatique. (faire Calculer maintenant et Calculer la feuille ne fonctionnent pas).

Comment faire pour se débarrasser automatique des @ sans que cela ne vienne perturber la recherche de la formule ?

Merci d'avance pour votre aide,

bonjour azerty 1234, et si vous utilisez formula2

Cells(,).Formula2 = "=" & formule & ""

Bonjour Bart,

Merci pour la proposition, je ne connaissais pas cette option.

J'ai essayé, je n'ai plus l'@ dans les formules par contre toutes mes cases ont l'erreur #NOM?.

Et comme précédemment, je suis obligé de rentrer dans chaque case une par une et faire entrer pour que la formule s'exécute :/

Cdt,

Bonjour

a tout hasard rajouter *1 après la concaténation ?

FINDRH

Bonjour,

Je ne suis pas sur de comprendre comment l'intégrer à la formule car j'ai des erreurs en essayant.

Pourriez-vous me l'indiquez à partir de cette ligne de code s'il vous plait ?

Cells(,).Formula2 = "=" & formule & ""

Merci d'avance,

Bonjour,
Et si tu joignais un xlsm à ta demande ?
J'ai du mal avec Cells(,).address !...
Cdlt.

c'est un mélange d'anglais (IF) et français (EQUIV), non ??

Bonsoir

Si tu passes en revue tes cellules avec enter et que ça marche c'est que le contenu des cellules est en format texte. Quand j'ai des chiffres en, alpha, je mets 1 dans une cellule vide, je la copie et fais collage spécial -valeur - multiplier sur la zone et mes alpha spont convertis....

Ton pb semble similaire

ou essayer
Cells(,).Formula2 = Cells(,)*1

A tout hasard

Cordialement

FINDRH

ps ce pb a déja été traité sur ce forum il n'y a pas longtemps....

Bonsoir Azerty1234,

J'ai du mal avec Cells(,).address !...

Je reprendrais comme Jean-Eric, cette syntaxe est incorrecte.

A la rigueur on peut utiilser Cells(, C).Address ou C représente une valeur numérique pour la colonne. Excel corrigera l'absence de la valeur ligne par le chiffre 1.

Apparemment, ce serait une réaction de sécurité d'Excel pour je ne sais quelle raison.

Non, par le @, Excel indique tout simplement que la syntaxe de la formule a une partie incorrecte. Mais que la formule peut fonctionner dans certains cas et donner un résultat. Et dans l'autre cas (Erreur) elle fournira #NOM?

Essaie le simple code ci-dessous dans une feuille du classeur. Ou le non est inscris sans guillemet.

Sub Essai1()
'La cellule B2 a la formule =SI(D2=0;"oui";non)
Formule = Range("B2").Formula2
Range("B4") = Formule
End Sub

En cellule B4 tu obtiendras un @. Si D2 vaut 0 la formule donnera oui, par contre si D2 diffère de 0 tu auras #NOM?

Maintenant si la formule est écrite correctement. Donc avec un non entre guillemets, tu n'auras plus le @ lors de sa copie en B4.

Sub Essai2()
'La cellule B2 a la formule =SI(D2=0;"oui";"non")
Formule = Range("B2").Formula2
Range("B4") = Formule
End Sub

Donc reprends ton code en vérifiant que tu n'as pas un guillemet en trop ou en moins. Et même si Excel corrige ton IF inscris plutôt SI.

Bonjour,
Pas de fichier, version Excel non précisée, etc.
@ est l'opérateur d'intersection implicite (voir aide Microsoft à ce sujet).
azerty1234 doit fournir des informations complémentaires.
Cdlt.

Bonjour à tous,

Merci Bart, c'était à la fois utiliser formula2 et remplacer EQUIV par MATCH qui ont résolu mon problème.

Cdt,

Rechercher des sujets similaires à "enlever formule cree iteration via vba"