Runtime Error avec la Fonction Excel SI en VB

Résolu/Fermé
alberts - 15 juil. 2008 à 18:20
 alberts - 22 juil. 2008 à 15:59
Bonjour,

je veux utiliser la fonction excel SI en VB, pour remplir des cases excel
Chaque fois je récupère une erreur runtime 1004 lors du déroulement de l'application

Voici la ligne codée qui pose problème:
Worksheets(sSummary).Cells(plig, icol).Value = "= SI( " & RCcell(plig, 1, icol1, 1) & " > 0 ; 1 ; -1)"

L'affectation de la fonction SI provoque systématiquement une erreur runtime 1004

Merci par avance de votre aide.
A voir également:

15 réponses

La solution est trouvée :

Le problème vient d'une erreur de syntaxe dans la formule qui est codée : en VB le séparateur à utiliser dans le IF est la virgule et non pas le point-virgule

La formule correcte est donc :

Worksheets(sSummary).Cells(plig, icol).Value = "= SI( " & RCcell(plig, 1, icol1, 1) & " > 0 , 1 , -1)"
^ ^
Bien mettre des virgules

Voilà, en espérant que cela puisse aider d'autres personnes...
1
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
18 juil. 2008 à 09:07
bonjour

La fonction SI n'existe pas en VBA, essaies avec IF et utilises formula au lieu de value

Ou bien utilises formulalocal avec SI
0
D'abord merci beaucoup pour cette réponse.

Mais ensuite j'ai essayé les deux solutions envisagées : formula avec 'IF' et FormulaLocale avec 'SI' mais dans tous les cas la formule entrée est convertie en chaine de caractères et je me retrouve donc dans excel avec écrit :
= SI( R25C5 >0;MAX(INDIRECT( R25C38 ));MIN(INDIRECT( R25C38 )) )
où R25C5 représente la ligne 25 (c'est R25) et la colonne 5 (C5)
et R25C38 représente la ligne 25 (c'est R25) et la colonne 38 (C38)

à la place de ce que j'attends qui serait plutôt :
=SI(E25>0;MAX(INDIRECT(AL25));MIN(INDIRECT(AL25)))
où E25 est bien l'interprétation de la ligne 25 et la colonne 5 de mon morceau de fichier excel
et AL25 est bien l'interprétation de la ligne 25 et la colonne 38 de mon morceau de fichier excel

d'où le problème : formula interprète et convertit le résultat, mais ne permet pas de formuler correctement mon besoin.


Alors que par exemple lorsque je programme en VB la ligne suivante (par exemple) :
Worksheets(sSummary).Cells(plig, icol).Value = "= 25.4 * MIN(INDIRECT( " & RCcell(plig, 1, icol1, 1) & " ))"

j'obtiens bien le résultat dans excel :
=MIN(INDIRECT(AK25))*25.4
où AK25 correspond bien à la référence entrée par (plig,icol1) dans ma formule programmée en VB.


Voilà mon problème qui reste entier...

Merci par avance de toute aide possible.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 juil. 2008 à 09:26
bonjour,
imposible de te guidé sans savoir ce que contient
>> sSummary
>>plig, icol
>> RCcell

Met plutôt la macro en entier.
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

et encore merci pour cette réponse.

Ce que contiiennent les données:

>> sSummary c'est le nom de la feuille excel dans laquelle je remplis les cases.
>> lig, icol sont les numéros de lignes et colones de la feuille excel dans laquelle je veux écrire
>> RCcell me renvoie la chaîne de caractères pour pointer la cellule (lignes,colonne) que je recherche.
Exemple :
Si plig = 10 et icol = 2
RCell (plig, 1, icol, 1) me renvoie exactement la chaîne "R10C2" pour référencer la ligne 10 , colonne 2
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
21 juil. 2008 à 10:48
Si sSummary est le nom de la feuille mettre guillemets.
Worksheets("sSummary").Cel......

Pour l'adresse en RCell..tu l'utilise ensuite dans un Range(RCell)..... si oui c'est pas bon
pour référencer la ligne 10 , colonne 2 cest pas "R10C2" mais "C10" tout simplement
RCell = cells(Lig,Col).address
0
Merci pour les informations.

Pour sSummary : c'est bien déjà la chaîne de caractères du nom de la feuille qui est dans la variable sSummary.
Désolé pour l'imprécision de ma réponse précédente.


>> Pour l'adresse en RCell..tu l'utilises ensuite dans un Range(RCell)..... si oui c'est pas bon
>> pour référencer la ligne 10 , colonne 2 cest pas "R10C2" mais "C10" tout simplement
>> RCell = cells(Lig,Col).address

Désolé, je ne comprends pas ce que tu me dis: que veut dire que j'utilise RCell... dans un Range(RCell) ?
Et puis si je veux référencer la ligne 10 colonne 2, pourquoi ne mettre que "C10"? Il me semblait que d'envoyer R10C2 correspondait mieux à Row10 Col2, non?
Je crois que je n'ai pas tout saisi dans ta réponse...
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
21 juil. 2008 à 11:43
Je crois que je n'ai pas tout saisi dans ta réponse...je crois plustôt que tu n'a pas saisi tout cour
Si tu veux mettre R10C2 c'est ton problème, moi je me borne simplement à te signaler tes erreurs, maintenant...tu fais comme tu veux. et rectification, colonne 2 C'est B10
Et je demandais que fait-tu avec Rcell ?
A+
0
OK avec B10 c'est plus clair!
Effectivement la colonne 2 ligne 10 c'est B10.

Ce que je fais avec RCell c'est d'utiliser la chaîne de caractères en retour (donc "R10C2") pour la tester dans ma formule
Worksheets(sSummary).Cells(plig, icol).Value = "= SI(R10C2 > 0 ; 1 ; -1)"

voilà, est ce bien la question?

Pour ce qui est codée dans la macro RCell, le voici par copier/coller:

Function RCcell(ilig, iabl, icol, iabc, Optional sheet) As String
'
' renvoit la chaine pour pointer la cellule
' ilig = numero de ligne
' iabl = 1 si reference absolue, -1 si relative, 0 si pas de reference (identique en relatif)
' icol, iabc = idem pour la colonne
' si sheet est defini, rajoute le pointe feuille

If iabl = 1 Then
RCcell = "R" & CStr(ilig)
ElseIf iabl = -1 Then
RCcell = "R[" & CStr(ilig) & "]"
Else
RCcell = "R"
End If
If iabc = 1 Then
RCcell = RCcell & "C" & CStr(icol)
ElseIf iabc = -1 Then
RCcell = RCcell & "C[" & CStr(icol) & "]"
Else
RCcell = RCcell & "C"
End If

If Not IsMissing(sheet) Then
RCcell = "'" & sheet & "'!" & RCcell
End If
End Function
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
21 juil. 2008 à 14:08
Pour la suite, tu doit t'arranger pour que ilig soit toujours initialiser.
Je vais d'abord répondre à ta 1ère question...
Worksheets("sSummary").Cells(plig, icol).Value = "= SI(R10C2 > 0 ; 1 ; -1)"
tu veux comparer le contenu d'une cellule à une fonction ??? moi pas compris.
Mais alors là, je comprend rien, essaye, sans formule d'expliquer CLAIREMENT ce que tu veux faire.
0
Ce que je veux faire est ceci :

Remplir ma case excel avec une formule qui est un test de la valeur d'une case donnée.

En clair bis:
Je veux écrire dans ma case excel située dans la ligne plig colonne icol :
SI la case ( lig.10 col2 ) est > 0 alors écrire 1 sinon -1

Donc c'est bien une formule que je veux écrire dans ma case de fichier excel.

Tout cela car c'est une boucle qui va remplir des cases automatiquement (les cases plig,icol) pour qu'ensuite lorsque les cases (genre lig.10 col.2) utilisées pour tests changeront, ces cases remplies avec formules seront mises à jour automatiquement dans excel.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
21 juil. 2008 à 16:13
Bon, je comprend maintenad ta demande..
Mais si c'est pour incorporer la fomule dans des cellules... Aucun intèret à le faire par VBA, tu élabore ta formule dans la 1ère cellule et ensuite tu fais Copie >> et puis étirer la sélection sur lequel tu veux que ta formule agisse. et copier
0
L'intérêt c'est que c'est un petit programme qui le fait, qui cherche les numéros de lignes,colonnes en fonction du contexte, et qui remplit les bonnes cases selon ces entrées.
Ainsi les cases ont les formules adéquates, et donc la modification des cellules définies comme "entrées" génère automatiquement la mise à jour des cellules impactées par ces entrées là.

Sinon bien sûr qu'avec la souris ce serait plus facile.

Autre option? :
Ou alors si la formule existait dans une premiere cellule déjà initialisée, y aurait-il un moyen d'implémenter un "copier - coller" dans le code VB et qui donne le même résultat que si je le faisais avec la souris (c'est à dire incrémenter correctement les numéros des cellules lors du "coller") ?

Que pensez vous de tout cela...?

Merci par avance de votre aide.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
21 juil. 2008 à 16:43
Oui, bien sûr,
Mais donne ton classeur sur ci-joint, s'il est confidentiel mat-le en mesage privé.
et joint une feuille avec le résultat souhaiter.
https://www.cjoint.com/
et oublie pas de donner le lien soit en MP soit sur un poste suivant.
A+

0
Pour joindre quelque chose de simple et "nettoyé" je vais devoir faire des modif dans le classeur excel et le programme VB.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
21 juil. 2008 à 17:08
OK oublie pas de mettre une feullle avec le résultat esciompté même si ces données ont étés mis en manuelles.
0