diff --git a/formidable_fonctions.php b/formidable_fonctions.php
index 7f6d9d1f991cd3318d00a1f9d1026db58fc29aab..5397f83f5852f10d2b0b2b400661800e1299b7b0 100644
--- a/formidable_fonctions.php
+++ b/formidable_fonctions.php
@@ -133,7 +133,7 @@ function calculer_voir_reponse($id_formulaires_reponse, $id_formulaire, $nom, $s
  */
 function affiche_resume_reponse($id_formulaires_reponse, $id_formulaire = null, $modele_resume = null) {
 	static $modeles_resume = array();
-	static $modeles_vars = array();
+	static $saisies;
 
 	if (is_null($id_formulaire)) {
 		$id_formulaire = sql_getfetsel(
@@ -142,14 +142,13 @@ function affiche_resume_reponse($id_formulaires_reponse, $id_formulaire = null,
 			'id_formulaires_reponse='.intval($id_formulaires_reponse)
 		);
 	}
+
 	if (is_null($modele_resume) and !isset($modeles_resume[$id_formulaire])) {
-		$traitements_formulaire = unserialize(sql_getfetsel(
-			'traitements',
-			'spip_formulaires',
-			'id_formulaire='.intval($id_formulaire)
-		));
-		if (isset($traitements_formulaire['enregistrement']['resume_reponse'])) {
-			$modeles_resume[$id_formulaire] = $traitements_formulaire['enregistrement']['resume_reponse'];
+		$row = sql_fetsel('saisies, traitements', 'spip_formulaires', 'id_formulaire='.intval($id_formulaire));
+		$saisies = unserialize($row['saisies']);
+		$traitements = unserialize($row['traitements']);
+		if (isset($traitements['enregistrement']['resume_reponse'])) {
+			$modeles_resume[$id_formulaire] = $traitements['enregistrement']['resume_reponse'];
 		} else {
 			$modeles_resume[$id_formulaire] = '';
 		}
@@ -162,17 +161,15 @@ function affiche_resume_reponse($id_formulaires_reponse, $id_formulaire = null,
 		return '';
 	}
 
-	if (!isset($modeles_vars[$modele_resume])) {
-		preg_match_all(',@(.*)@,Uims', $modele_resume, $matches);
-		$modeles_vars[$modele_resume] = $matches[1];
-	}
-
 	$valeurs = array();
-	foreach ($modeles_vars[$modele_resume] as $var) {
-		$valeur = calculer_voir_reponse($id_formulaires_reponse, $id_formulaire, $var,'', 'valeur_uniquement', '');
-		$valeur = formidable_nettoyer_saisie_vue($valeur);
-		$valeurs["@$var@"] = $valeur;
+	$chaine = formidable_raccourcis_arobases_2_valeurs_champs($modele_resume, $saisies, false, '', $source = 'base', $id_formulaires_reponse, $id_formulaire, $valeurs, $valeurs_libellees);
+
+	// Pour compatibilité historique : remplacer les clés dans $valeurs_libellees pour mettre un arobase autour
+	foreach ($valeurs_libellees as $cle => $val) {
+		unset($valeurs_libellees[$cle]);
+		$valeurs_libellees["@$cle@"] = $val;
 	}
+
 	return pipeline(
 		'formidable_affiche_resume_reponse',
 		array(
@@ -180,9 +177,9 @@ function affiche_resume_reponse($id_formulaires_reponse, $id_formulaire = null,
 				'id_formulaire' => $id_formulaire,
 				'id_formulaires_reponse' => $id_formulaires_reponse,
 				'modele_resume' => $modele_resume,
-				'valeurs' => $valeurs,
+				'valeurs' => $valeurs_libellees,
 			),
-			'data' => str_replace(array_keys($valeurs), array_values($valeurs), $modele_resume),
+			'data' => $chaine,
 		)
 	);
 }
diff --git a/inc/formidable.php b/inc/formidable.php
index c6a1925df42dd73c26d1d537c9bad89f47de8d15..58e72c3f9f11ea99853a1f57dacc58f787d8b10c 100644
--- a/inc/formidable.php
+++ b/inc/formidable.php
@@ -485,10 +485,24 @@ function formidable_scramble($login, $id_form) {
  * @param array $saisies la liste des saisies du formulaire
  * @param bool|string $brut=false, pour indiquer si on veut utiliser les valeurs brutes;
  * @param string|bool $sans_reponse chaine à afficher si pas de réponse. Si true, prend la chaîne par défaut
+ * @param string $source 'request' pour prendre dans _request(); 'base' pour prendre dans une réponse enregistrée en base
+ * @param int|string $id_formulaires_reponse le cas échéant le numéro de réponse en base
+ * @param int|string $id_formulaire le cas échéant le numéro du formulaire en base
+ * @param array &$valeurs un tableau clé/valeur listant les valeurs que prenne les @. Passage par référence
+ * @param array &$valeurs_libelles un tableau clé/valeur listant les valeurs libéllées que prenne les @. Passage par référence
  * @return string la chaîne transformée
  */
-function formidable_raccourcis_arobases_2_valeurs_champs($chaine, $saisies, $brut=false, $sans_reponse = true) {
-	list($valeurs,$valeurs_libellees) = formidable_tableau_valeurs_saisies($saisies, $sans_reponse);
+function formidable_raccourcis_arobases_2_valeurs_champs($chaine, $saisies, $brut=false, $sans_reponse = true, $source = 'request', $id_formulaires_reponse = 0, $id_formulaire = 0, &$valeurs = array(), &$valeurs_libellees = array()) {
+	if ($source == 'request') {
+		list($valeurs, $valeurs_libellees) = formidable_tableau_valeurs_saisies($saisies, $sans_reponse);
+	}
+	elseif ($source == 'base' and $id_formulaires_reponse and $id_formulaire) {
+		$saisies = saisies_lister_par_nom($saisies);
+		foreach ($saisies as $nom => $saisie) {
+			$valeurs[$nom] = formidable_nettoyer_saisie_vue(calculer_voir_reponse($id_formulaires_reponse, $id_formulaire, $nom,'', 'brut', $sans_reponse));
+			$valeurs_libellees[$nom] =  formidable_nettoyer_saisie_vue(calculer_voir_reponse($id_formulaires_reponse, $id_formulaire, $nom,'', 'valeur_uniquement', $sans_reponse));
+		}
+	}
 	$a_remplacer = array();
 	if (preg_match_all('/@[\w]+@/', $chaine, $a_remplacer)) {
 		$a_remplacer = $a_remplacer[0];
diff --git a/paquet.xml b/paquet.xml
index cf4cb4b49552c92cdd1154f03cf61c263e2e232e..3564281fe3a237ca0370f18d8ac48203fbf9c885 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,7 +1,7 @@
 <paquet
 	prefix="formidable"
 	categorie="communication"
-	version="3.45.3"
+	version="3.46.0"
 	etat="stable"
 	compatibilite="[3.0.0;3.2.*]"
 	logo="images/formidable-64.png"