Microsoft 365 séparer les résultats d'une formule chimique

hanaêlles

XLDnaute Nouveau
Bonjour à tous,

Je suis débutante sous VBA et je dois réaliser un code, afin d'obtenir la masse molaire, pour chaque atome.

Par exemple, j'ai la formule chimique suivante:
C6H3O2 dans un tableau je dois avoir le résultats de la part des éléments atomiques par colonne c'est à dire : M(C6)= ; M(H3)= ; M (O2) =.............; . Dans la dernière colonne, je dois avoir la masse molaire totale. J'ai pu réussir à trouver un fichier qui réalise la masse molaire totale mais je n'ai pas la moindre idée de comment séparer les données.

Merci d'avance pour votre.
 

Pièces jointes

  • Masse molaire.xlsm
    60 KB · Affichages: 12

xUpsilon

XLDnaute Accro
Bonjour,

Qu'est ce que l'on entend par "part des éléments atomiques" ?
- La proportion de masse molaire d'un élément par rapport à la masse molaire de la molécule ?
- La proportion d'atomes d'un élément par rapport au nombre d'atomes total de la molécule ?

Bonne journée,
 

vgendron

XLDnaute Barbatruc
Hello

J'ai regardé le code de la fonction MW utilisée

le calcul des masses molaires "partielles" est fait dans la fonction: MolecularWeight
il faudrait donc intercepter le résultat en ligne 42 pour le mettre à sa place dans ton tableau..
 

hanaêlles

XLDnaute Nouveau
La masse molaire moléculaire est égale à la somme des masses molaires atomiques des éléments chimiques constituant la molécule.
Bonjour,

Qu'est ce que l'on entend par "part des éléments atomiques" ?
- La proportion de masse molaire d'un élément par rapport à la masse molaire de la molécule ?
- La proportion d'atomes d'un élément par rapport au nombre d'atomes total de la molécule ?

Bonne journée,
En gros, ce que je souhaite voir afficher dans ma page excel c'est la masses molaires atomiques des éléments chimiques constituant la molécule.
 

vgendron

XLDnaute Barbatruc
un début de réponse ici avec la macro associée au bouton
normalement, elle reprend les blocs de décomposition de la fonction MW, mais
1) les opérations de transformation de la formule ne sont pas suffisantes car les nb d'atomes inscrits sous forme d'indice==> il les considère comme un nom atomique==> j'ai pas fait le test, mais je suis presque sur que si tu réécris la formule (ligne 14) SANS mettre les chiffres en indice, ca fonctionne
je vois que la fonction MW retourne 0 pour cette formule

2) apparemment, les blocs de décomposition ne décomposent pas suffisamment les sousgroupe entre parenthèse==> d'ou le message que ma macro te donne: elle croit qu'il s'agit d'une molécule
par contre, la fonction MW retourne bien une valeur.. j'ai du manquer quelque chose...
 

Pièces jointes

  • Masse molaire.xlsm
    69 KB · Affichages: 3

hanaêlles

XLDnaute Nouveau
Hello

J'ai regardé le code de la fonction MW utilisée

le calcul des masses molaires "partielles" est fait dans la fonction: MolecularWeight
il faudrait donc intercepter le résultat en ligne 42 pour le mettre à sa place dans ton tableau..
Re-Bonjour, j'ai essayé de faire ce que vous m'avez indiquer mais je n'arrive pas à l'afficher, j'ai codé avec la formule Worksheets pour faire apparaitre mon résultats pour la ligne 42 de mon fichier VBA. Auriez-vous une piste pour m'orienter pour la suite ? merci d'avance
 

hanaêlles

XLDnaute Nouveau
un début de réponse ici avec la macro associée au bouton
normalement, elle reprend les blocs de décomposition de la fonction MW, mais
1) les opérations de transformation de la formule ne sont pas suffisantes car les nb d'atomes inscrits sous forme d'indice==> il les considère comme un nom atomique==> j'ai pas fait le test, mais je suis presque sur que si tu réécris la formule (ligne 14) SANS mettre les chiffres en indice, ca fonctionne
je vois que la fonction MW retourne 0 pour cette formule

2) apparemment, les blocs de décomposition ne décomposent pas suffisamment les sousgroupe entre parenthèse==> d'ou le message que ma macro te donne: elle croit qu'il s'agit d'une molécule
par contre, la fonction MW retourne bien une valeur.. j'ai du manquer quelque chose...
Je vais m'aider de ton fichier pour continuer, merci beaucoup :)
 

Dranreb

XLDnaute Barbatruc
Bonjour
Ces deux fonctions transforment le indices en chiffres et vice versa.
VB:
Function ChiffresInd(ByVal Z As String) As String
   Dim P As Integer, C As String * 1
   For P = 1 To Len(Z)
      C = Mid$(Z, P, 1)
      Select Case C
         Case ChrW$(&H2080) To ChrW$(&H2089): Mid$(Z, P, 1) = ChrW$(AscW(C) And &HF Or &H30)
         End Select
      Next P
   ChiffresInd = Z
   End Function
Function IndicesChf(ByVal Z As String) As String
   Dim P As Integer, C As String * 1
   For P = 1 To Len(Z)
      C = Mid$(Z, P, 1)
      Select Case C
         Case ChrW$(&H30) To ChrW$(&H39): Mid$(Z, P, 1) = ChrW$(AscW(C) And &HF Or &H2080)
         End Select
      Next P
   IndicesChf = Z
   End Function
 

Dranreb

XLDnaute Barbatruc
Alors puisqu'elle a plu, celle-ci met en indice les chiffres uniquement placés derrières une lettre :
VB:
Function IndiceAprèsLettre(ByVal Z As String) As String
   Dim P As Integer, C As String * 1, LettreDevant As Boolean
   For P = 1 To Len(Z)
      C = Mid$(Z, P, 1)
      Select Case C
         Case "0" To "9": If LettreDevant Then Mid$(Z, P, 1) = ChrW$(AscW(C) And &HF Or &H2080)
         Case ChrW$(&H2080) To ChrW$(&H2089): If Not LettreDevant Then Mid$(Z, P, 1) = ChrW$(AscW(C) And &HF Or &H30)
         Case "A" To "Z", "a" To "z": LettreDevant = True
         Case Else: LettreDevant = False
         End Select
      Next P
   IndiceAprèsLettre = Z
   End Function
Je regarde un peu, en même temps pour réécrire l'analyse de la formule avec rangement du résultat en collection plus facile à exploiter. Mais je ne promet pas un résultat tout de suite …
Le point est-il un point décimal ou un séparateur de groupes ?
Il y a une règle pour le placement devant où derrière d'un facteur de groupe ?
 

hanaêlles

XLDnaute Nouveau
Alors puisqu'elle a plu, celle-ci met en indice les chiffres uniquement placés derrières une lettre :
VB:
Function IndiceAprèsLettre(ByVal Z As String) As String
   Dim P As Integer, C As String * 1, LettreDevant As Boolean
   For P = 1 To Len(Z)
      C = Mid$(Z, P, 1)
      Select Case C
         Case "0" To "9": If LettreDevant Then Mid$(Z, P, 1) = ChrW$(AscW(C) And &HF Or &H2080)
         Case ChrW$(&H2080) To ChrW$(&H2089): If Not LettreDevant Then Mid$(Z, P, 1) = ChrW$(AscW(C) And &HF Or &H30)
         Case "A" To "Z", "a" To "z": LettreDevant = True
         Case Else: LettreDevant = False
         End Select
      Next P
   IndiceAprèsLettre = Z
   End Function
Je regarde un peu, en même temps pour réécrire l'analyse de la formule avec rangement du résultat en collection plus facile à exploiter. Mais je ne promet pas un résultat tout de suite …
Le point est-il un point décimal ou un séparateur de groupes ?
Il y a une règle pour le placement devant où derrière d'un facteur de groupe ?
-Le point est un séparateur de groupe entre 2 molécules.
-Tu veux dire un nombre? Si nous avons par exemple la formule chimique Cu2O4 alors le Cu va être multiplié par 2 et O multiplié par 4. Donc le facteur est placé derrière. Par contre, si nous avons 2Cu2O4 alors le Cu va être multiplié par 4 et le O par 8.

Dit moi si j'ai répondu à ta question :)
 

vgendron

XLDnaute Barbatruc
Hello

bon. je sèche...
1) j'ai ajouté la fonction de Bernard pour les Indices
==> la ligne 14 du fichier est bien traitée

2) j'ai voulu "intercepter" les masses partielles pour les positionner
j'ai donc modifié la liste des paramètres des différentes fonctions pour transmettre le numéro de ligne de fonction en fontction
et ajouté la macro "Positionner" en ligne 48 de la fonction récursive MolecularWeight
mais.. sortir de cette fonction temporairement provoque une erreur...
 

Pièces jointes

  • Masse molaire Hanaelle.xlsm
    63.9 KB · Affichages: 3

Discussions similaires

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa