Macro protégée - travail impossible

Bonjour,

Je reprend le travail d'un précédant stagiaire sur un classeur de dimensionnement mécanique complexe et blindé de vba comme d'hab.

J'essaie pour le moment de comprendre comment ce classeur fonctionne et je tente de décrypter le code qui est incroyablement long et complexe (bien sûr aucune explication n'est fournies et personne pour m'aider ... ).

J'ai deux macro additionnelles ainsi qu'un Add-on qui sont protégés via mot de passe, bien entendu le stagiaire n'a pas fourni le mot de passe afin de protéger ses lignes adorées (oui une macro s'appelle "morefun" pour vous dire que ça l'amuse en plus).

En bref j'ai essayé de cracker le code en bidouillant à la racine de l'excel via un compilateur hexadécimal mais je n'arrive toujours pas à accéder à l'onglet "protection" des propriétés de la macro car ce foutu mot de passe est encore là même après le bidouillage.

En bref je suis cuit si j'ai pas ce mot de passe et je vais au pire devoir refaire un Excel complet avec tout ce que cela implique comme temps perdu.

Quelqu'un a une technique ou suis-je irrémédiablement foutu ?

phurba.

Le compilateur hexadécimal, cela marchait jusqu'à la version 2003 d'Excel. A partir de Office 2007, tout est crypté.

Donc je dirai que vous êtes effectivement (et malheureusement) cuit, comme vous dites.

Par contre, je le prendrai de l'autre côté: pourquoi ne pas prendre le contact avec le stagiaire et lui demamder le mot de passe?

Votre patron ou les RH doivent avoir ses coordonnées. Et s'il refuse, vous lui rappelez que tout travail crée pendant les heures de travail appartient à l'employeur et que l'entreprise n'hésitera pas à lui envoyer une mise en demeure...

Bonjour,

Pour ma part, j'éviterai juste le passage de la mise en demeure proposé par Excel-Malin ... S'il refuse vous êtes cuit point final.

Si vraiment il ne veut pas vous fournir le mot de passe, face à une mise en demeure il pourra simplement prôner l'oubli du mot de passe jadis utilisé et botter en touche sans le moindre problème.

Cordialement,

Ok je vais voir s'il est possible de le contacter, y'a intérêt.

Merci bien les gens et bonne journée.

PS: le compilateur est censé fonctionner sur une version 2010, en effet il a modifié l'Excel mais pas l'accès au mot de passe, bref.

bonjour,

Apparemment vous avez accès au VBA de ce classeur puisque vous tentez de décrypter ce code.

concernant "morefun" il ne s'agit vraisemblablement pas d'une production de ce stagiaire, mais d'une macro complémentaire de Laurent LONGRE appelée en réalité MOREFUNC.

MOREFUNC est depuis longtemps éprouvé (et approuvé...) par la communauté Excel vous pouvez donc conserver cette macro complémentaire comme faisant partie intégrante d'Excel et en valider les macros qui y font appel "les yeux fermés."

Pour le nettoyage du code vous pouvez éventuellement nous communiquer le VBA du classeur pour essayer d'y mettre un peu d'ordre...

A+

Hum hum je vois en effet c'est bien le nom d'une des macros du classeur, je vais tenter de voir ce qu'elle fait.

Par contre c'est une autre macro qui est verrouillées, nom Solver, là je pense que c'est une macro perso par contre.

EDIT: Alors en réalité le code verrouillé est le SOLVEUR appelé "complément solveur" et apparemment c'est un add-in d'Excel couramment utilisé, du coup je pense que je vais me pencher sur son fonctionnement.

Très peu probable que Solver soit de lui

Il m'a l'air d'un bon geek quand même au vue du code qu'il a écrit déjà mais bon là je pense que si c'est de lui je fais pas le poids, mais alors pas du tout !

Pour un avis ou/et le nettoyage du code et avoir des explications ou des commentaires, vous pouvez éventuellement nous communiquer le VBA du classeur...

A+

Vous donner le code ne vous avancera pas des masses étant donné que l'excel est trop grand pour être mis en pièce jointe.

Option Explicit
Option Base 1

Sub mef_skid()

    'Variables générales pour les boucles et matrices
Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer

Worksheets("Detail design").Select

'
''Definition du maillage
'

Dim nbr_poutre_trans As Integer 'Compte le nombre de poutres transverse rentrées sur la feuille
nbr_poutre_trans = WorksheetFunction.CountIf(Worksheets("Detail design").Range("G30:G34"), ">0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("J30:J34"), ">0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("M30:M34"), ">0")

Worksheets("Detail design").Range("M18").Value = "Ref " & Str(nbr_poutre_trans + 2)

Dim nbr_force As Integer 'Compte le nombre de forces rentrées sur la feuille
nbr_force = WorksheetFunction.CountIf(Worksheets("Detail design").Range("E37:M37"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E39:M39"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E41:M41"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E43:M43"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E45:M45"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E49:L49"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E51:L51"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E53:L53"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E55:L55"), ">=0") _
    + WorksheetFunction.CountIf(Worksheets("Detail design").Range("E57:L57"), ">=0")

Dim nbr_noeud As Integer 'Calcul le nombre de noeuds du maillage
nbr_noeud = 4 + 4 + nbr_poutre_trans * 2 + nbr_force

Dim nbr_element As Integer 'Calcul le nombre d element du modele
nbr_element = (nbr_poutre_trans + 2 + 1) * 2 + (nbr_force + nbr_poutre_trans + 2)

Dim poutre_trans() 'Contient le numero du premier element, dernier element, le deplacement max et la contrainte max de chaque poutre transversale
ReDim poutre_trans(nbr_poutre_trans + 2, 4)

Dim poutre()
ReDim poutre(2, nbr_poutre_trans + 3)

'
''Caractéristiques du skid
'

Dim caract_poutre_trans As Variant 'Type et emplacement de chaque poutre transverse
caract_poutre_trans = caracteristiques_poutre_trans(nbr_poutre_trans)

Dim largeur_skid As Double
largeur_skid = Worksheets("Basic design").Range("E43").Value

Dim longueur_skid As Double
longueur_skid = WorksheetFunction.Sum(Worksheets("Basic design").Range("F34:F41"))

Dim position_levage_1 As Double
position_levage_1 = Worksheets("Basic design").Range("F61").Value

Dim position_levage_2 As Double
position_levage_2 = WorksheetFunction.Sum(Worksheets("Basic design").Range("F34:F41")) _
    - Worksheets("Basic design").Range("F62").Value

Dim noeud_encours As Integer 'Numero du prochain noeud du maillage, les 4 premiers sont réservés pour la position anneau de levage
noeud_encours = 5

Dim element()
'Matrice contenant les caractéristiques de chaque element du modele EF
'poutre(i)(Noeud 1, Noeud 2, E, A, L, Iz, Iy, G, Ix, Rotation à 90°?, V)
ReDim element(nbr_element)

Dim temp_noeud_haut As Integer
Dim temp_noeud_bas As Integer

Dim anneau1 As Boolean
anneau1 = True

Dim anneau2 As Boolean
anneau2 = True

Dim temp_L As Double 'Variable temporaire calculant la longueur de la poutre du modèle
Dim position_avant As Double
position_avant = 0
Dim position_avant_2 As Double

Dim position_effort()
'Matrice contenant le noeud on s'applique les efforts et leurs intensités
ReDim position_effort(nbr_force, 2)

k = 1
l = 1
n = 1

For i = 1 To nbr_poutre_trans + 2

    'Position 1 des blocs de levage
    If caract_poutre_trans(i, 2) > position_levage_1 And anneau1 Then

        temp_L = position_levage_1 - position_avant

        element(k) = caract_poutre(temp_noeud_haut, 1, temp_L, caract_poutre_trans(1, 1), False)
        temp_noeud_haut = 1
        poutre(1, n) = k
        k = k + 1

        element(k) = caract_poutre(temp_noeud_bas, 2, temp_L, caract_poutre_trans(1, 1), False)
        temp_noeud_bas = 2
        poutre(2, n) = k
        n = n + 1
        k = k + 1

        anneau1 = False
        position_avant = position_levage_1

    End If

    'Position 2 des blocs de levage
    If caract_poutre_trans(i, 2) > position_levage_2 And anneau2 Then

        temp_L = position_levage_2 - position_avant

        element(k) = caract_poutre(temp_noeud_haut, 3, temp_L, caract_poutre_trans(1, 1), False)
        temp_noeud_haut = 3
        poutre(1, n) = k
        k = k + 1

        element(k) = caract_poutre(temp_noeud_bas, 4, temp_L, caract_poutre_trans(1, 1), False)
        temp_noeud_bas = 4
        poutre(2, n) = k
        n = n + 1
        k = k + 1

        anneau2 = False
        position_avant = position_levage_2

    End If

    If i <> 1 Then
        'Si ce n'est pas la premiere poutre transversale on rajoute le morceau de poutre de la partie longitudinale haute
        'morceau de poutre reliant 2 poutre transversale ou bloc de levage et poutre transversale

        temp_L = caract_poutre_trans(i, 2) - position_avant
        element(k) = caract_poutre(temp_noeud_haut, noeud_encours, temp_L, caract_poutre_trans(1, 1), False)
        poutre(1, n) = k
        k = k + 1

    End If

    temp_noeud_haut = noeud_encours 'On retient le dernier numero de noeud de la poutre longitudinale haute

    temp_L = 0
    position_avant_2 = 0

    poutre_trans(i, 1) = k

    For j = 0 To 8 Step 2 'On parcoure les forces renseignées sur la feuille pour la poutre transversale i

        If i < 10 Then
            m = 37
        Else
            m = 49
        End If

        If Cells(m + j, 4 + i) <> "" Then

            If Cells(m + j, 4 + i) = 0 Then
                'Cas ou la force se trouve sur la poutre longitudinale haute
                'On ne crée pas de point ou poutre, on stock juste l information de l'effort

                position_effort(l, 1) = noeud_encours
                position_effort(l, 2) = Cells(m + 1 + j, 4 + i) * -10
                l = l + 1

                nbr_noeud = nbr_noeud - 1
                nbr_element = nbr_element - 1

            ElseIf Cells(37 + j, 4 + i) = largeur_skid Then
                'Cas ou la force se trouve sur la poutre longitudinale basse
                'On ne crée pas de point ou poutre, on stock juste l information de l'effort

                position_effort(l, 1) = noeud_encours + 1
                position_effort(l, 2) = Cells(m + 1 + j, 4 + i) * -10
                l = l + 1

                nbr_noeud = nbr_noeud - 1
                nbr_element = nbr_element - 1

            Else
                'Cas ou la force se trouve quelque part sur la poutre transversale
                'On crée un nouveau point et poutre et on stock l information de l'effort

                temp_L = Cells(m + j, 4 + i) - position_avant_2
                element(k) = caract_poutre(noeud_encours, noeud_encours + 1, temp_L, caract_poutre_trans(i, 1), True)
                noeud_encours = noeud_encours + 1
                k = k + 1
                position_avant_2 = Cells(m + j, 4 + i)

                position_effort(l, 1) = noeud_encours
                position_effort(l, 2) = Cells(m + 1 + j, 4 + i) * -10
                l = l + 1

            End If

        Else

            Exit For

        End If

    Next j

    'On "ferme" la poutre transversale

    temp_L = largeur_skid - position_avant_2
    element(k) = caract_poutre(noeud_encours, noeud_encours + 1, temp_L, caract_poutre_trans(i, 1), True)
    noeud_encours = noeud_encours + 1

    poutre_trans(i, 2) = k

    k = k + 1

    If i <> 1 Then
        'Si ce n'est pas la premiere poutre transversale on rajoute le morceau de poutre de la partie longitudinale basse
        'morceau de poutre reliant 2 poutres transversales ou bloc de levage et poutre transversale

        temp_L = caract_poutre_trans(i, 2) - position_avant
        element(k) = caract_poutre(temp_noeud_bas, noeud_encours, temp_L, caract_poutre_trans(1, 1), False)
        poutre(2, n) = k
        n = n + 1
        k = k + 1

    End If

    temp_noeud_bas = noeud_encours 'On retient le dernier numero de noeud de la poutre longitudinale basse
    noeud_encours = noeud_encours + 1
    position_avant = caract_poutre_trans(i, 2)

Next i

'
''Calcul de l'ensemble des Ke (repere local)
'

Dim Ke()
ReDim Ke(nbr_element)

For i = 1 To nbr_element

    Ke(i) = rigide_element(element(i)(3), element(i)(4), element(i)(5), element(i)(6), element(i)(7), element(i)(8), element(i)(9))

Next i

'
''Calcul des Fe
'

'
''Matrice de rotation
'

    'definition de l ensemble des matrices de rotation

Dim rotation_90(12, 12)

Dim rotation_90_trans As Variant

For i = 1 To 12
    For j = 1 To 12
        rotation_90(i, j) = 0
    Next j
Next i

rotation_90(1, 3) = 1
rotation_90(2, 2) = 1
rotation_90(3, 1) = -1

rotation_90(4, 6) = 1
rotation_90(5, 5) = 1
rotation_90(6, 4) = -1

rotation_90(7, 9) = 1
rotation_90(8, 8) = 1
rotation_90(9, 7) = -1

rotation_90(10, 12) = 1
rotation_90(11, 11) = 1
rotation_90(12, 10) = -1

rotation_90_trans = WorksheetFunction.Transpose(rotation_90)

'
''Calcul des Ke dans le repere global
'

Dim temp As Variant

For i = 1 To nbr_element

    If element(i)(10) Then

        temp = Application.Run("MMULT.EXT", rotation_90_trans, Ke(i))

        Ke(i) = Empty
        Ke(i) = Application.Run("MMULT.EXT", temp, rotation_90)
        temp = Empty

    End If

Next i

'
''Calcul des Fe dans le repere global
'

'
''Assemblage de K
'

    'Definiton matrice assemblé vide

Dim K_asm_vide()
ReDim K_asm_vide(nbr_noeud * 6, nbr_noeud * 6)

For i = 1 To UBound(K_asm_vide)
    For j = 1 To UBound(K_asm_vide)

        K_asm_vide(i, j) = 0

    Next j
Next i

    'Ajout de la contribution de chaque Ke à la matrice assemblée

Dim K_asm_temp(2)

K_asm_temp(1) = K_asm_vide

For i = 1 To nbr_element

    K_asm_temp(2) = assemblage_K(K_asm_temp(1), element(i)(1), element(i)(2), Ke(i))

    K_asm_temp(1) = Empty
    K_asm_temp(1) = K_asm_temp(2)

Next i

Dim K_asm As Variant

K_asm = K_asm_temp(1)

'
''Conditions aux limites
'

    'au final tableau comprenant les lignes et colonnes à supprimer
Dim condi_limite As Variant

condi_limite = Array(1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21)

    'reduction de la matrice K
Dim K_asm_reduit As Variant

K_asm_reduit = reduction_K(K_asm, condi_limite)

'
''Resolution du systeme KU=F
'

    'Inversion de K
Dim K_asm_inv As Variant

K_asm_inv = Application.Run("MINVERSE.EXT", K_asm_reduit)

Dim K_asm_inv_2 As Variant

K_asm_inv_2 = InverseMatrice(K_asm_reduit)

    'Definition de F
Dim F() As Variant
ReDim F(UBound(K_asm_reduit, 1), 1)

For i = 1 To UBound(F)
    F(i, 1) = 0
Next i

For l = 1 To nbr_force
    i = position_effort(l, 1) * 6 - 4 - 3 * 4
    F(i, 1) = position_effort(l, 2)
Next l

    'K*F
Dim U_reduit As Variant
U_reduit = Application.Run("MMULT.EXT", K_asm_inv, F)

Dim U_reduit_2 As Variant
U_reduit_2 = resolutionGaussJordan(K_asm_reduit, F)

Dim U_reduit_3 As Variant
U_reduit_3 = Application.Run("MMULT.EXT", K_asm_inv_2, F)

Dim U_reduit_4 As Variant
'U_reduit_4 = RunSolver(K_asm_reduit, F)

Dim U_choisi As Variant
U_choisi = U_reduit_2

    'Réaction aux appuis
Dim U()
ReDim U(nbr_noeud * 6, 1)

j = 1

For i = 1 To 19 Step 6
    U(i, 1) = 0
    U(i + 1, 1) = 0
    U(i + 2, 1) = 0

    U(i + 3, 1) = U_choisi(j, 1)
    U(i + 4, 1) = U_choisi(j + 1, 1)
    U(i + 5, 1) = U_choisi(j + 2, 1)

    j = j + 3
Next i

For i = 25 To UBound(U)
    U(i, 1) = U_choisi(i - 12, 1)
Next i

Dim reactions_appuis As Variant
reactions_appuis = Application.Run("MMULT.EXT", K_asm, U)

    'Effort dans les elements
Dim effort_poutre() As Variant
ReDim effort_poutre(nbr_element)

Dim temp_U(12, 1)
Dim temp_U_2 As Variant

For i = 1 To nbr_element
    j = element(i)(1) * 6
    temp_U(1, 1) = U(j - 5, 1)
    temp_U(2, 1) = U(j - 4, 1)
    temp_U(3, 1) = U(j - 3, 1)
    temp_U(4, 1) = U(j - 2, 1)
    temp_U(5, 1) = U(j - 1, 1)
    temp_U(6, 1) = U(j, 1)

    j = element(i)(2) * 6
    temp_U(7, 1) = U(j - 5, 1)
    temp_U(8, 1) = U(j - 4, 1)
    temp_U(9, 1) = U(j - 3, 1)
    temp_U(10, 1) = U(j - 2, 1)
    temp_U(11, 1) = U(j - 1, 1)
    temp_U(12, 1) = U(j, 1)

    If element(i)(10) Then
        temp_U_2 = Application.Run("MMULT.EXT", rotation_90, temp_U)
        effort_poutre(i) = Application.Run("MMULT.EXT", Application.Run("MMULT.EXT", Application.Run("MMULT.EXT", rotation_90, Ke(i)), rotation_90_trans), temp_U_2)
    Else
        effort_poutre(i) = Application.Run("MMULT.EXT", Ke(i), temp_U)
    End If

Next i

    'Calcul contrainte max de chaque poutre transversale du skid
Dim max
For i = 1 To UBound(poutre_trans)
    max = 0
    For j = poutre_trans(i, 1) To poutre_trans(i, 2)
        temp = effort_poutre(j)(6, 1) / element(j)(6) * element(j)(11)

        If Abs(temp) > Abs(max) Then
            max = temp
        End If

        temp = effort_poutre(j)(12, 1) / element(j)(6) * element(j)(11)

        If Abs(temp) > Abs(max) Then
            max = temp
        End If
    Next j

    poutre_trans(i, 4) = max
    Worksheets("Detail design").Range("T" & 16 + i).Value = Abs(max)
Next i

    'Calcul contrainte max des deux poutres longitudianles du skid
For i = 1 To 2
    max = 0
    For j = 1 To nbr_poutre_trans + 3
        k = poutre(i, j)
        temp = effort_poutre(k)(6, 1) / element(k)(6) * element(k)(11)

        If Abs(temp) > Abs(max) Then
            max = temp
        End If

        temp = effort_poutre(k)(12, 1) / element(k)(6) * element(k)(11)

        If Abs(temp) > Abs(max) Then
            max = temp
        End If
    Next j

    poutre_trans(i, 4) = max
    Worksheets("Detail design").Range("T" & 9 + i * 2).Value = Abs(max)
Next i

    'Calcul déplacement max de chaque poutre transversale du skid
Dim varr
Dim vara
Dim varb
Dim varc
Dim vard
For i = 1 To UBound(poutre_trans)
    k = element(poutre_trans(i, 1))(1)
    l = element(poutre_trans(i, 2))(2)
    Worksheets("RunSolveur2").Range("B6:B30").Value = ""
    Worksheets("RunSolveur2").Range("D6:D30").Value = ""

    m = 1
    For j = k To l

        Worksheets("RunSolveur2").Range("B" & 5 + m).Value = U(j * 6 - 4, 1)

        If m = 1 Then
            Worksheets("RunSolveur2").Range("D" & 5 + m).Value = 0
        Else
            Worksheets("RunSolveur2").Range("D" & 5 + m).Value = element(m - 1)(5) + Worksheets("RunSolveur2").Range("D" & 4 + m).Value
        End If

        m = m + 1

    Next j

    varr = Application.LinEst(Worksheets("RunSolveur2").Range("B6:B" & 5 + m - 1), Application.Power(Worksheets("RunSolveur2").Range("D6:D" & 5 + m - 1), Array(1, 2)), True, 0)
    vara = Application.Index(varr, 1)
    varb = Application.Index(varr, 2)
    varc = Application.Index(varr, 3)
    'vard = Application.Index(varr, 4)
    Worksheets("RunSolveur2").Range("H6").Value = "=" & Str(vara) & "*F6^2+" & Str(varb) & "*F6+" & Str(varc)

    Worksheets("RunSolveur2").Select
    ' reset
    Application.Run "SolverReset"

    Application.Run "SolveurOptions", , , 0.00001, True, , , , , , , , False

    ' set up new analysis
    Application.Run "SolverOk", "$H$6", 2, , "$F$6", , "GRG Nonlinear"

    ' add constraints
    Application.Run "SolverAdd", "$F$6", 3, "$D$6"
    Application.Run "SolverAdd", "$F$6", 1, "$D$" & (5 + m - 1)

    Dim result As Integer

    ' run the analysis
    Application.Run "SolverSolve", True

    ' finish the analysis
    Application.Run "SolverFinish"

    Worksheets("Detail design").Select
    Worksheets("Detail design").Range("V" & 16 + i).Value = Worksheets("RunSolveur2").Range("H6").Value

Next i

    'Calcul déplacement max des deux poutres longitudinale du skid
For i = 1 To 2
    'k = element(poutre_trans(i, 1))(1)
    'l = element(poutre_trans(i, 2))(2)
    'Worksheets("RunSolveur2").Range("B6:B30").Value = ""
    'Worksheets("RunSolveur2").Range("D6:D30").Value = ""

    m = 1
    For j = 1 To UBound(poutre, 2)
        k = poutre(i, j)
        If m = 1 Then
            l = element(k)(1)
            Worksheets("RunSolveur2").Range("B" & 5 + m).Value = U(l * 6 - 4, 1)
            Worksheets("RunSolveur2").Range("D" & 5 + m).Value = 0
            m = m + 1
        End If

        l = element(k)(2)
        Worksheets("RunSolveur2").Range("B" & 5 + m).Value = U(l * 6 - 4, 1)
        Worksheets("RunSolveur2").Range("D" & 5 + m).Value = element(k)(5) + Worksheets("RunSolveur2").Range("D" & 4 + m).Value

        m = m + 1

    Next j

    varr = Application.LinEst(Worksheets("RunSolveur2").Range("B6:B" & 5 + m - 1), Application.Power(Worksheets("RunSolveur2").Range("D6:D" & 5 + m - 1), Array(1, 2, 3)), True, 0)
    vara = Application.Index(varr, 1)
    varb = Application.Index(varr, 2)
    varc = Application.Index(varr, 3)
    vard = Application.Index(varr, 4)
    Worksheets("RunSolveur2").Range("H6").Value = "=" & Str(vara) & "*F6^3+" & Str(varb) & "*F6^2+" & Str(varc) & "*F6+" & Str(vard)

    Worksheets("RunSolveur2").Select
    ' reset
    Application.Run "SolverReset"

    Application.Run "SolveurOptions", , , 0.00001, True, , , , , , , , False

    ' set up new analysis
    Application.Run "SolverOk", "$H$6", 2, , "$F$6", , "GRG Nonlinear"

    ' add constraints
    Application.Run "SolverAdd", "$F$6", 3, "$D$6"
    Application.Run "SolverAdd", "$F$6", 1, "$D$" & (5 + m - 1)

    ' run the analysis
    Application.Run "SolverSolve", True

    ' finish the analysis
    Application.Run "SolverFinish"

    Worksheets("Detail design").Select
    Worksheets("Detail design").Range("X" & 9 + i * 2).Value = Worksheets("RunSolveur2").Range("H6").Value

Next i

'Affichage pour verifications

Worksheets("Feuil2").Range("D3:D104").Value = U_reduit

Worksheets("Feuil2").Range("F3:F104").Value = U_reduit_2

Worksheets("Feuil2").Range("H3:H104").Value = U_reduit_3

Worksheets("Feuil2").Range("J3:J104").Value = F

Worksheets("Feuil2").Range("M3:M116").Value = reactions_appuis

l = 2

For i = 1 To nbr_element
    For j = 1 To 6
        Worksheets("Feuil2").Cells(l + j, 16).Value = effort_poutre(i)(j, 1) * -1
    Next j
    For j = 7 To 12
        Worksheets("Feuil2").Cells(l + j, 16).Value = effort_poutre(i)(j, 1)
    Next j

    l = l + 13
Next i

End Sub

Function caracteristiques_poutre_trans(nbr_poutre_trans)

Dim i As Integer
Dim k As Integer

Dim caract()
ReDim caract(nbr_poutre_trans + 2, 2)

caract(1, 1) = "UPE " & CStr(Worksheets("Basic design").Range("F45").Value)
caract(1, 2) = 0

k = 2

For i = 30 To 34

    If Cells(i, 6) <> 0 Then

        caract(k, 1) = CStr(Worksheets("Detail design").Range("F" & i).Value)
        caract(k, 2) = Worksheets("Detail design").Range("G" & i).Value

        k = k + 1

    Else: Exit For

    End If

Next i

For i = 30 To 34

    If Cells(i, 9) <> 0 Then

        caract(k, 1) = CStr(Worksheets("Detail design").Range("I" & i).Value)
        caract(k, 2) = Worksheets("Detail design").Range("J" & i).Value

        k = k + 1

    Else: Exit For

    End If

Next i

For i = 30 To 34

    If Cells(i, 12) <> 0 Then

        caract(k, 1) = CStr(Worksheets("Detail design").Range("L" & i).Value)
        caract(k, 2) = Worksheets("Detail design").Range("M" & i).Value

        k = k + 1

    Else: Exit For

    End If

Next i

caract(nbr_poutre_trans + 2, 1) = "UPE " & CStr(Worksheets("Basic design").Range("F45").Value)
caract(nbr_poutre_trans + 2, 2) = WorksheetFunction.Sum(Worksheets("Basic design").Range("F34:F41"))

caracteristiques_poutre_trans = caract

End Function

Function caract_poutre(noeud1, noeud2, longueur, type_poutre, rotation)

'element(i)(Noeud 1, Noeud 2, E, A, L, Iz, Iy, G, Ix)

Dim toto(11)

Dim A As Double, Iz As Double, Iy As Double, Ix As Double

A = WorksheetFunction.VLookup(type_poutre, Worksheets("biblio poutres").Range("B6:G65"), 2, False)
Iz = WorksheetFunction.VLookup(type_poutre, Worksheets("biblio poutres").Range("B6:G65"), 3, False)
Iy = WorksheetFunction.VLookup(type_poutre, Worksheets("biblio poutres").Range("B6:G65"), 4, False)
Ix = WorksheetFunction.VLookup(type_poutre, Worksheets("biblio poutres").Range("B6:G65"), 5, False)

toto(1) = noeud1
toto(2) = noeud2
toto(3) = Worksheets("Basic design").Range("F50").Value
toto(4) = A
toto(5) = longueur
toto(6) = Iz
toto(7) = Iy
toto(8) = toto(3) / (2 * (1 + Worksheets("Basic design").Range("F51").Value))
toto(9) = Ix
toto(10) = rotation

toto(11) = WorksheetFunction.VLookup(type_poutre, Worksheets("biblio poutres").Range("B6:G65"), 6, False)

caract_poutre = toto

End Function

Function rigide_element(E, A, l, Iz, Iy, G, Ix)
'
''Calcul de la matrice du rigidé d une poutre dans son repere local
''en fonction de ces variables
'

    'Variables générales pour les boucles et matrices
Dim i As Integer
Dim j As Integer

    'Creation de la matrice Ke vide
Dim Ke(12, 12)

For i = 1 To 12
    For j = 1 To 12

        Ke(i, j) = 0

    Next j
Next i

    'Calcul cellule Ke non nulle (d'apres matrice connue)
Ke(1, 1) = E * A / l
Ke(1, 7) = -E * A / l

Ke(2, 2) = 12 * E * Iz / l ^ 3
Ke(2, 6) = 6 * E * Iz / l ^ 2
Ke(2, 8) = -12 * E * Iz / l ^ 3
Ke(2, 12) = 6 * E * Iz / l ^ 2

Ke(3, 3) = 12 * E * Iy / l ^ 3
Ke(3, 5) = -6 * E * Iy / l ^ 2
Ke(3, 9) = -12 * E * Iy / l ^ 3
Ke(3, 11) = -6 * E * Iy / l ^ 2

Ke(4, 4) = G * Ix / l
Ke(4, 10) = -G * Ix / l

Ke(5, 3) = -6 * E * Iy / l ^ 2
Ke(5, 5) = 4 * E * Iy / l
Ke(5, 9) = 6 * E * Iy / l ^ 2
Ke(5, 11) = 2 * E * Iy / l

Ke(6, 2) = 6 * E * Iz / l ^ 2
Ke(6, 6) = 4 * E * Iz / l
Ke(6, 8) = -6 * E * Iz / l ^ 2
Ke(6, 12) = 2 * E * Iz / l

Ke(7, 1) = -E * A / l
Ke(7, 7) = E * A / l

Ke(8, 2) = -12 * E * Iz / l ^ 3
Ke(8, 6) = -6 * E * Iz / l ^ 2
Ke(8, 8) = 12 * E * Iz / l ^ 3
Ke(8, 12) = -6 * E * Iz / l ^ 2

Ke(9, 3) = -12 * E * Iy / l ^ 3
Ke(9, 5) = 6 * E * Iy / l ^ 2
Ke(9, 9) = 12 * E * Iy / l ^ 3
Ke(9, 11) = 6 * E * Iy / l ^ 2

Ke(10, 4) = -G * Ix / l
Ke(10, 10) = G * Ix / l

Ke(11, 3) = -6 * E * Iy / l ^ 2
Ke(11, 5) = 2 * E * Iy / l
Ke(11, 9) = 6 * E * Iy / l ^ 2
Ke(11, 11) = 4 * E * Iy / l

Ke(12, 2) = 6 * E * Iz / l ^ 2
Ke(12, 6) = 2 * E * Iz / l
Ke(12, 8) = -6 * E * Iz / l ^ 2
Ke(12, 12) = 4 * E * Iz / l

rigide_element = Ke

End Function

Function assemblage_K(K_asm, noeud_1, noeud_2, Ke_global)
'
''Ajout contribution de la matrice ke dans le repere global (Ke_global) d une poutre
''en fonction de ces noeuds (noeud_1, noeud_2) à la matrice K assemblée (K_asm)
'

    'Variables générales pour les boucles et matrices
Dim i As Integer
Dim j As Integer

    'Definition numero colone et ligne affecté par l element
Dim A, B, C As Integer

A = 1 + (noeud_1 - 1) * 6

B = 1 + (noeud_2 - 1) * 6
C = B - 6

    'Carre haut gauche

For i = A To A + 5
    For j = A To A + 5

        K_asm(i, j) = K_asm(i, j) + Ke_global(1 + i - A, 1 + j - A)

    Next j
Next i

    'Carre bas droite

For i = B To B + 5
    For j = B To B + 5

        K_asm(i, j) = K_asm(i, j) + Ke_global(1 + i - C, 1 + j - C)

    Next j
Next i

    'Carre haut droit

For i = A To A + 5
    For j = B To B + 5

        K_asm(i, j) = K_asm(i, j) + Ke_global(1 + i - A, 1 + j - C)

    Next j
Next i

    'Carre bas gauche

For i = B To B + 5
    For j = A To A + 5

        K_asm(i, j) = K_asm(i, j) + Ke_global(1 + i - C, 1 + j - A)

    Next j
Next i

    'Return de la matrice assemblée

assemblage_K = K_asm

End Function

Function reduction_K(K_asm, vValeur)

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer

Dim reduc() As Variant
ReDim reduc(UBound(K_asm, 1) - UBound(vValeur), UBound(K_asm, 2) - UBound(vValeur))

k = 1
For i = 1 To UBound(K_asm, 1)
    If fIsIn(i, vValeur) Then
    l = 1
    For j = 1 To UBound(K_asm, 2)
        If fIsIn(j, vValeur) Then
        reduc(k, l) = K_asm(i, j)
        l = l + 1
        End If
    Next j
    k = k + 1
    End If
Next i

reduction_K = reduc

End Function

Function fIsIn(ByVal vValeur As Variant, ByVal vArray As Variant) As Boolean
'Verifie qu un element (vValeur) n est pas dans la liste (vArray)

Dim v As Variant

For Each v In vArray
    If v = vValeur Then Exit For
Next v

fIsIn = IIf(IsEmpty(v), True, False)

End Function

Vous ai-je déjà mentionné être un newbie en vba, tout nouveau pour moi bien que j'y vois maintenant un peu plus claire ...

et ça ça contrôle alors le solveur mais je cherche encore comment ça fonctionne tout ça ...

Function RunSolver(k, F)

Dim i, j As Integer

Worksheets("RunSolveur").Select

Dim n As Integer

n = UBound(k)

Dim temp As String

For i = 1 To n
    temp = "="
    For j = 1 To n

        Cells(5 + i, 7 + j) = k(i, j)

        temp = temp + "+" & Cells(5 + i, 7 + j).Address & "*" & "D" & CStr(5 + j)
    Next j

    Range("B" & 5 + i).Formula = temp

    Range("D" & 5 + i).Formula = 1

    Range("F" & 5 + i).Formula = F(i, 1)
Next i

' reset
Application.Run "SolverReset"

Application.Run "SolveurOptions", , , 0.00001, True, , , , , , , , False

' set up new analysis
Application.Run "SolverOk", , , , "$D$6:$D$" & CStr(5 + n), , "GRG Nonlinear"

' add constraints
Application.Run "SolverAdd", "$B$6:$B$" & CStr(5 + n), 2, "$F$6:$F$" & CStr(5 + n)

Dim result As Integer

' run the analysis
result = Application.Run("SolverSolve", True)

' finish the analysis
Application.Run "SolverFinish"

' report on success of analysis
If result <= 3 Then
  ' Result = 0, Solution found, optimality and constraints satisfied
  ' Result = 1, Converged, constraints satisfied
  ' Result = 2, Cannot improve, constraints satisfied
  ' Result = 3, Stopped at maximum iterations
  MsgBox "Solver found a solution", vbInformation, "SOLUTION FOUND"
Else
  ' Result = 4, Solver did not converge
  ' Result = 5, No feasible solution
  Beep
  MsgBox "Solver was unable to find a solution.", vbExclamation, "SOLUTION NOT FOUND"
End If

RunSolver = Range("D6:D" & 5 + n).Value

End Function

Oui,

C'était juste une suggestion. On peut juste confirmer que ce code est plutôt propre.

A première vue, rien de trivial, ni d'incongru. ça se déroule comme un roman !

Juste à entretenir... Bon courage !

A+

Rechercher des sujets similaires à "macro protegee travail impossible"