' ========================================
' PROGRAMME VBA - DIMENSIONNEMENT POUTRE BETON ARME
' Selon Eurocode 2 (EN 1992-1-1)
' Auteur : Pour Ulrich MOMOS
' ========================================
Option Explicit
' Structure pour stocker les résultats
Type ResultatsPoutre
' Données géométriques
hauteur As Double
largeur As Double
hauteur_utile As Double
enrobage As Double
' Sollicitations
moment_eds As Double
effort_tranchant_eds As Double
' Matériaux
fc28 As Double
fcd As Double
fyk As Double
fyd As Double
Es As Double
' Résultats dimensionnement flexion
mu_eds As Double
alpha_lim As Double
alpha As Double
pivot As String
z As Double
ast_calc As Double
ast_min As Double
ast_choisie As Double
' Armatures longitudinales
diametre_long As Double
nb_barres As Integer
ast_reelle As Double
' Vérification effort tranchant
ved As Double
vrd_max As Double
theta As Double
asw_calc As Double
asw_min As Double
' Armatures transversales
diametre_cadres As Double
espacement As Double
nb_brins As Integer
' Dispositions constructives
espacement_max_long As Double
espacement_max_cadres As Double
longueur_ancrage As Double
' Vérifications
verification_flexion As String
verification_effort_tranchant As String
verification_constructive As String
End Type
' ========================================
' FONCTION PRINCIPALE DE DIMENSIONNEMENT
' ========================================
Sub DimensionnerPoutre()
Dim resultats As ResultatsPoutre
Dim ws As Worksheet
Set ws = ActiveSheet
' Vider les résultats précédents
Range("B20:B50").ClearContents
Range("D20:D50").ClearContents
' Lecture des données d'entrée
If Not LireDonneesEntree(resultats) Then
MsgBox "Erreur dans la lecture des données d'entrée", vbCritical
Exit Sub
End If
' Calculs de dimensionnement
Call CalculerCaracteristiquesMaterialux(resultats)
Call DimensionnerFlexion(resultats)
Call ChoisirArmatureLongitudinale(resultats)
Call VerifierEffortTranchant(resultats)
Call DimensionnerCadres(resultats)
Call VerifierDispositionsConstructives(resultats)
' Affichage des résultats
Call AfficherResultats(resultats)
MsgBox "Dimensionnement terminé ! Vérifiez les résultats.", vbInformation
End Sub
' ========================================
' LECTURE DES DONNEES D'ENTREE
' ========================================
Function LireDonneesEntree(ByRef r As ResultatsPoutre) As Boolean
On Error GoTo Erreur
' Géométrie
[Link] = Range("B2").Value ' cm
[Link] = Range("B3").Value ' cm
[Link] = Range("B4").Value ' cm
r.hauteur_utile = [Link] - [Link] - 1 ' -1cm pour diamètre cadre + ø/2 acier long
' Sollicitations
r.moment_eds = Range("B6").Value ' kN.m
r.effort_tranchant_eds = Range("B7").Value ' kN
' Matériaux
r.fc28 = Range("B9").Value ' MPa
[Link] = Range("B10").Value ' MPa
' Vérifications basiques
If [Link] <= 0 Or [Link] <= 0 Or r.moment_eds <= 0 Then
LireDonneesEntree = False
Exit Function
End If
LireDonneesEntree = True
Exit Function
Erreur:
LireDonneesEntree = False
End Function
' ========================================
' CALCUL CARACTERISTIQUES MATERIAUX
' ========================================
Sub CalculerCaracteristiquesMaterialux(ByRef r As ResultatsPoutre)
' Béton
[Link] = r.fc28 / 1.5 ' Résistance de calcul du béton
' Acier
[Link] = [Link] / 1.15 ' Résistance de calcul de l'acier
[Link] = 200000 ' MPa - Module d'Young acier
End Sub
' ========================================
' DIMENSIONNEMENT EN FLEXION
' ========================================
Sub DimensionnerFlexion(ByRef r As ResultatsPoutre)
Dim b As Double, h As Double, d As Double
b = [Link] / 100 ' conversion en m
h = [Link] / 100
d = r.hauteur_utile / 100
' Moment réduit
r.mu_eds = (r.moment_eds * 1000) / (b * d * d * [Link] * 1000000) ' Sans unité
' Limite entre pivot A et pivot B
r.alpha_lim = 0.372 ' Pour fyk = 500 MPa
' Détermination du pivot et calcul de alpha
If r.mu_eds <= r.alpha_lim Then
' Pivot A - Acier limite d'élasticité
[Link] = "Pivot A"
[Link] = 1.25 * (1 - Sqr(1 - 2 * r.mu_eds))
Else
' Pivot B - Béton à 3.5‰, acier plastique
[Link] = "Pivot B - Section sur-armée!"
[Link] = r.alpha_lim
End If
' Bras de levier
r.z = d * (1 - 0.4 * [Link])
' Section d'acier calculée
r.ast_calc = (r.moment_eds * 1000) / ([Link] * r.z) ' mm²
' Section d'acier minimale
r.ast_min = [Link](0.26 * (2.9 / [Link]) * b * 1000 * d * 1000, _
0.0013 * b * 1000 * d * 1000) ' mm²
' Section d'acier à retenir
r.ast_choisie = [Link](r.ast_calc, r.ast_min)
End Sub
' ========================================
' CHOIX ARMATURE LONGITUDINALE
' ========================================
Sub ChoisirArmatureLongitudinale(ByRef r As ResultatsPoutre)
Dim diametres As Variant
Dim sections As Variant
Dim i As Integer, j As Integer
Dim section_barre As Double
Dim nb_barres_necessaire As Double
Dim trouve As Boolean
' Diamètres disponibles (mm) et leurs sections (mm²)
diametres = Array(8, 10, 12, 14, 16, 20, 25, 32)
sections = Array(50.3, 78.5, 113.1, 153.9, 201.1, 314.2, 490.9, 804.2)
trouve = False
' Recherche du diamètre optimal (commence par les plus gros diamètres)
For i = UBound(diametres) To LBound(diametres) Step -1
section_barre = sections(i)
nb_barres_necessaire = r.ast_choisie / section_barre
' Vérification si on peut loger les barres (max 3 lits)
If nb_barres_necessaire <= 12 And nb_barres_necessaire >= 2 Then
r.diametre_long = diametres(i)
r.nb_barres = [Link](nb_barres_necessaire, 1)
r.ast_reelle = r.nb_barres * section_barre
trouve = True
Exit For
End If
Next i
If Not trouve Then
' Solution de secours avec HA20
r.diametre_long = 20
r.nb_barres = [Link](r.ast_choisie / 314.2, 1)
r.ast_reelle = r.nb_barres * 314.2
End If
End Sub
' ========================================
' VERIFICATION EFFORT TRANCHANT
' ========================================
Sub VerifierEffortTranchant(ByRef r As ResultatsPoutre)
Dim b As Double, d As Double
Dim k As Double, rho1 As Double, vmin As Double
b = [Link] / 1000 ' conversion en m
d = r.hauteur_utile / 1000
' Effort tranchant réduit
[Link] = r.effort_tranchant_eds
' Résistance maximale des bielles comprimées
r.vrd_max = 0.5 * [Link] * b * d * 1000 ' kN
' Vérification résistance béton seul
k = [Link](1 + Sqr(200 / (d * 1000)), 2)
rho1 = [Link](r.ast_reelle / (b * 1000 * d * 1000), 0.02)
vmin = 0.035 * k ^ 1.5 * Sqr(r.fc28)
Dim vrd_c As Double
vrd_c = [Link](0.12 * k * (100 * rho1 * r.fc28) ^ (1 / 3), vmin) * b
* d * 1000 ' kN
' Calcul armatures transversales nécessaires
If [Link] <= vrd_c Then
' Armatures minimales suffisantes
r.asw_calc = 0
Else
' Calcul des armatures d'effort tranchant
[Link] = 45 ' Angle bielles comprimées (45° pour simplifier)
r.asw_calc = ([Link] - vrd_c) * 1000 / ([Link] * d * 1000) ' mm²/m
End If
' Armatures transversales minimales
r.asw_min = 0.08 * Sqr(r.fc28) / [Link] * b * 1000 ' mm²/m
' Retenir le maximum
r.asw_calc = [Link](r.asw_calc, r.asw_min)
End Sub
' ========================================
' DIMENSIONNEMENT DES CADRES
' ========================================
Sub DimensionnerCadres(ByRef r As ResultatsPoutre)
Dim diametre_cadre As Double
Dim section_cadre As Double
Dim espacement_calc As Double
' Diamètre des cadres (au moins ø6 et <= ø_long/3)
r.diametre_cadres = [Link](6, r.diametre_long / 3)
If r.diametre_cadres > 12 Then r.diametre_cadres = 12
' Section d'un brin de cadre
section_cadre = 3.14159 * (r.diametre_cadres / 2) ^ 2
' Nombre de brins (2 pour cadre simple)
r.nb_brins = 2
' Espacement calculé
If r.asw_calc > 0 Then
espacement_calc = (r.nb_brins * section_cadre * 1000) / r.asw_calc ' mm
Else
espacement_calc = 300 ' Espacement maximal par défaut
End If
' Espacement maximal réglementaire
r.espacement_max_cadres = [Link](0.75 * r.hauteur_utile * 10,
300) ' mm
' Espacement retenu (arrondi aux 5 cm inférieurs)
[Link] = [Link](espacement_calc,
r.espacement_max_cadres)
[Link] = Int([Link] / 50) * 50
If [Link] < 50 Then [Link] = 50
End Sub
' ========================================
' VERIFICATION DISPOSITIONS CONSTRUCTIVES
' ========================================
Sub VerifierDispositionsConstructives(ByRef r As ResultatsPoutre)
' Espacement maximal armatures longitudinales
r.espacement_max_long = [Link](2 * [Link] * 10, 250) ' mm
' Longueur d'ancrage droit
r.longueur_ancrage = 40 * r.diametre_long ' mm - Formule simplifiée
' Vérifications
r.verification_flexion = IIf(r.ast_reelle >= r.ast_choisie, "OK", "INSUFFISANT")
r.verification_effort_tranchant = IIf([Link] <= r.vrd_max, "OK", "SECTION INSUFFISANTE")
r.verification_constructive = "Vérifier espacement barres et enrobage"
End Sub
' ========================================
' AFFICHAGE DES RESULTATS
' ========================================
Sub AfficherResultats(ByRef r As ResultatsPoutre)
Dim ligne As Integer
ligne = 20
' Titre
Range("A" & ligne).Value = "RESULTATS DE DIMENSIONNEMENT"
Range("A" & ligne).[Link] = True
ligne = ligne + 2
' Caractéristiques matériaux
Range("A" & ligne).Value = "Béton fcd (MPa):"
Range("B" & ligne).Value = Round([Link], 1)
ligne = ligne + 1
Range("A" & ligne).Value = "Acier fyd (MPa):"
Range("B" & ligne).Value = Round([Link], 0)
ligne = ligne + 2
' Flexion
Range("A" & ligne).Value = "=== FLEXION ==="
Range("A" & ligne).[Link] = True
ligne = ligne + 1
Range("A" & ligne).Value = "Moment réduit μ:"
Range("B" & ligne).Value = Round(r.mu_eds, 3)
ligne = ligne + 1
Range("A" & ligne).Value = "Pivot:"
Range("B" & ligne).Value = [Link]
ligne = ligne + 1
Range("A" & ligne).Value = "As calculé (cm²):"
Range("B" & ligne).Value = Round(r.ast_calc / 100, 2)
ligne = ligne + 1
Range("A" & ligne).Value = "As minimal (cm²):"
Range("B" & ligne).Value = Round(r.ast_min / 100, 2)
ligne = ligne + 1
Range("A" & ligne).Value = "As choisi (cm²):"
Range("B" & ligne).Value = Round(r.ast_choisie / 100, 2)
ligne = ligne + 2
' Armatures longitudinales
Range("A" & ligne).Value = "=== ARMATURES LONGITUDINALES ==="
Range("A" & ligne).[Link] = True
ligne = ligne + 1
Range("A" & ligne).Value = "Choix:"
Range("B" & ligne).Value = r.nb_barres & " HA" & r.diametre_long
ligne = ligne + 1
Range("A" & ligne).Value = "As réelle (cm²):"
Range("B" & ligne).Value = Round(r.ast_reelle / 100, 2)
ligne = ligne + 1
Range("A" & ligne).Value = "Vérification:"
Range("B" & ligne).Value = r.verification_flexion
ligne = ligne + 2
' Effort tranchant
Range("A" & ligne).Value = "=== EFFORT TRANCHANT ==="
Range("A" & ligne).[Link] = True
ligne = ligne + 1
Range("A" & ligne).Value = "VEd (kN):"
Range("B" & ligne).Value = Round([Link], 1)
ligne = ligne + 1
Range("A" & ligne).Value = "VRd,max (kN):"
Range("B" & ligne).Value = Round(r.vrd_max, 1)
ligne = ligne + 1
Range("A" & ligne).Value = "Asw nécessaire (cm²/m):"
Range("B" & ligne).Value = Round(r.asw_calc / 100, 2)
ligne = ligne + 2
' Armatures transversales
Range("A" & ligne).Value = "=== ARMATURES TRANSVERSALES ==="
Range("A" & ligne).[Link] = True
ligne = ligne + 1
Range("A" & ligne).Value = "Cadres:"
Range("B" & ligne).Value = "ø" & r.diametre_cadres & " e=" & [Link] & "mm"
ligne = ligne + 1
Range("A" & ligne).Value = "Vérification:"
Range("B" & ligne).Value = r.verification_effort_tranchant
ligne = ligne + 2
' Dispositions constructives
Range("A" & ligne).Value = "=== DISPOSITIONS CONSTRUCTIVES ==="
Range("A" & ligne).[Link] = True
ligne = ligne + 1
Range("A" & ligne).Value = "Longueur ancrage (cm):"
Range("B" & ligne).Value = Round(r.longueur_ancrage / 10, 0)
ligne = ligne + 1
Range("A" & ligne).Value = "Espacement max long (mm):"
Range("B" & ligne).Value = r.espacement_max_long
ligne = ligne + 1
Range("A" & ligne).Value = "Espacement max cadres (mm):"
Range("B" & ligne).Value = r.espacement_max_cadres
End Sub
' ========================================
' INITIALISATION DE LA FEUILLE
' ========================================
Sub InitialiserFeuille()
Dim ws As Worksheet
Set ws = ActiveSheet
' Effacer le contenu
[Link]
' Titre
Range("A1").Value = "DIMENSIONNEMENT POUTRE BETON ARME"
Range("A1").[Link] = True
Range("A1").[Link] = 14
' Données d'entrée
Range("A3").Value = "DONNEES D'ENTREE"
Range("A3").[Link] = True
Range("A4").Value = "Largeur b (cm):"
Range("B4").Value = 30
Range("A5").Value = "Hauteur h (cm):"
Range("B5").Value = 60
Range("A6").Value = "Enrobage (cm):"
Range("B6").Value = 3
Range("A8").Value = "Moment MEd (kN.m):"
Range("B8").Value = 150
Range("A9").Value = "Effort tranchant VEd (kN):"
Range("B9").Value = 100
Range("A11").Value = "Béton fc28 (MPa):"
Range("B11").Value = 25
Range("A12").Value = "Acier fyk (MPa):"
Range("B12").Value = 500
' Bouton de calcul
Dim btn As Object
Set btn = [Link](200, 200, 150, 30)
[Link] = "DimensionnerPoutre"
[Link] = "DIMENSIONNER"
' Mise en forme
Range("A:B").[Link]
MsgBox "Feuille initialisée ! Modifiez les données d'entrée puis cliquez sur
DIMENSIONNER", vbInformation
End Sub