Modifier la formule stockée en string via VBA

(J'ai des centaines de lignes à changer. Les données sont comme ça

 équation activity_id
 5225518 D0312_ABC * (S3765 + S3790 + S3762 + S3763 + S3770 + S3764 + S4480) * (1- (S2820 + S0560)) * (1-S1965) * (1-C0151)
 7306234 D0300_BCD * C0502 * (1- (S0191)) * (1-S1965)
 8293425 D0798_CDE * P0692 * (1- (S0191 + S2820 + S0560 + S0290 + S0960)) * (1-S1965)
 9119429 D0793_DEF * S2605 * (1-S0290) * (1-S1965)

Je dois combiner les deux «1-quelque chose» set et il y a un motif.
(1-(Sxxx+Sxxxx))*(1-(Sxxx+Sxxxx)) fois qu'il y a un (1-(Sxxx+Sxxxx))*(1-(Sxxx+Sxxxx)) ,
combinez-les en un qui est (1-(Sxxx+Sxxxx +Sxxx+Sxxxx))

Donc, j'ai seulement besoin de changer tout avec Sxxxx, vous pouvez ignorer Cxxxx, Dxxxx, Pxxxx, …

Donc j'ai besoin de le changer pour:

 équation activity_id
 5225518 D0312_ABC * (S3765 + S3790 + S3762 + S3763 + S3770 + S3764 + S4480) * (1- (S2820 + S0560 + S1965)) * (1-C0151)
 7306234 D0300_BCD * C0502 * (1- (S0191 + S1965))
 8293425 D0798_CDE * P0692 * (1- (S0191 + S2820 + S0560 + S0290 + S0960 + S1965))
 9119429 D0793_DEF * S2605 * (1- (S0290 + S1965))

Le regexp suivant peut certainement et sans doute être amélioré.

 Option Explicit Private m_Rex As RegExp Private Const SEARCH_PATTERN As Ssortingng = "\(1-\(?((S\d{4}\+?)+)\)?\)\*\(1-\(?((S\d{4}\+?)+)\)?\)" ' $0 $2 Private Const REPLACE_PATTERN As Ssortingng = "(1-($1+$3))" Public Function Simplify(ByVal AVeryParticularFormula As Ssortingng) As Ssortingng If m_Rex Is Nothing Then Set m_Rex = New RegExp m_Rex.Global = False m_Rex.MultiLine = False m_Rex.IgnoreCase = False m_Rex.Pattern = SEARCH_PATTERN End If Do Simplify = m_Rex.Replace(AVeryParticularFormula, REPLACE_PATTERN) If Simplify = AVeryParticularFormula Then Exit Do AVeryParticularFormula = Simplify Loop End Function 
 ? Simplify("D0312_ABC * (S3765+S3790+S3762+S3763+S3770+S3764+S4480) * (1-(S2820+S0560))*(1-S1965)*(1-C0151)") D0312_ABC * (S3765+S3790+S3762+S3763+S3770+S3764+S4480) * (1-(S2820+S0560+S1965))*(1-C0151) ? Simplify("D0300_BCD * C0502 * (1-(S0191))*(1-S1965)") D0300_BCD * C0502 * (1-(S0191+S1965)) ? Simplify("D0798_CDE * P0692 * (1-(S0191+S2820+S0560+S0290+S0960))*(1-S1965)") D0798_CDE * P0692 * (1-(S0191+S2820+S0560+S0290+S0960+S1965)) ? Simplify("D0793_DEF * S2605 * (1-S0290)*(1-S1965)") D0793_DEF * S2605 * (1-(S0290+S1965))