[COM] Zapper un msgbox

pickwick

XLDnaute Nouveau
[COM] Zapper un msgbox [Contourné]

Bonjour à tous !

Je vous explique mon problème :

Je bosse sur une appli PHP qui dois ouvrir un fichier Excel 2003 (format XLS), le remplir avec mes données issues de MySQL, enregistrer le fichier temporaire sur mon serveur et le proposer au téléchargement.

Excel est installé sur le serveur, c'est le serveur qui gère les modifications, à la limite, j'ai pas besoin d'avoir Excel sur le poste client.

Globalement, ça marche à peu près, le seul souci c'est que dans mon modèle j'ai des cellules dont la formule utilise une fonction pour faire un total et, si le total est supérieur à 10, afficher un MsgBox d'erreur.

Code:
=SI(SOMME(AM11:AM88)=0;"";Msg(SOMME(AM11:AM88)))

//C'est la fonction Msg qui est appelée et qui déclenche (ou pas) l'affichage du popup

Pour info, je peux vous donner le code de la fonction Msg (que de toute façon je n'ai pas le droit de modifier )

Code:
Function Msg(vMontant As Variant)
If (vMontant > 10) Then
    Call MsgBox("Attention le total des imputations pour une journée ne doit pas dépasser 10 dixièmes", vbYes, "Saisie de l'activité")
End If
Msg = vMontant
End Function

L'appli Excel est lancée sur le serveur, donc le MsgBox (qui me paralyse le reste du process) est affiché... sur le serveur !!

Et comme mon pauvre utilisateur qui a cliqué dans sa page web n'est pas assis devant le serveur, il n'a aucun moyen de fermer cette boite de dialogue.

J'ai pas mal écumé les forums mais je n'ai rien trouvé qui puisse m'aider.
En fait il faudrait :
* soit que je puisse faire en sorte que la cellule de total ne fasse pas son appel à la fonction Msg() (on peut pas "freezer" une cellule ?)
* soit que je puisse valider automatiquement ce satané popup sans qu'il bloque mon process

J'ai essayé (sans succès):
* DisplayAlerts = false
* Interactive = false

J'ai aussi testé avec Calculation = -4135 pour bloquer la mise à jour des cellules de totaux, j'ai l'impression que ça fonctionne, jusqu'à ce que je déclenche la sauvegarde de mon fichier avec SaveAs(...) qui fait apparaitre mon cher popup :confused:

Je précise que comme mon fichier Excel est un document officiel de la boite (et qu'il est censé le rester une fois que je l'ai rempli ^^) j'ai pas le droit de modifier le code des macros, fonctions, cellules, etc...

Si quelqu'un a la solution, je suis preneur :D
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : [COM] Zapper un msgbox

bonjour pickwick,

Peut-être avec un
Application.CalculateBeforeSave = False
Une remarque : en changeant le mode de calcul avec
Calculation = -4135,
celà doit s'enregistrer avec ton classeur et je ne sais pas si ta feuille se recalculera automatiquement à l'avenir...
 

pickwick

XLDnaute Nouveau
Re : [COM] Zapper un msgbox

On progresse !

Bien vu, le "CalculateBeforeSave = false" permet de ne pas recalculer les totaux au moment de la sauvegarde et évite donc l'affichage du popup. Le problème c'est qu'il va bien falloir les recalculer un jour ou l'autre ces totaux (si possible depuis le poste client puisqu'il n'y a que là que l'utilisateur pourra valider le popup).

L'idéal serait de faire comprendre au classeur Excel qu'il devra tout recalculer à la prochaine ouverture mais quand même arriver à enregistrer le fichier avant qu'il le fasse.

C'est pas gagné hein...
 

tototiti2008

XLDnaute Barbatruc
Re : [COM] Zapper un msgbox

Je viens de faire un test :
Si on fait :
Application.Calculation = xlCalculationManual
Application.CalculateBeforeSave = False
Avant d'ouvrir le fichier Excel,
puis on l'ouvre alors il ne se calcule pas
J'ai tapé des données, enregistré
Puis si je réactive les calculs et que j'ouvre le classeur, il se recalcule correctement.
 

pickwick

XLDnaute Nouveau
Re : [COM] Zapper un msgbox

Je vois pas à quel moment je peux rebasculer en calcul automatique dans mon traitement.

Si je fais :
Code:
//================================================
//Sauvegarde et fermeture d'Excel
//================================================
$classeur->saveas($nom_fichier_genere);
$excel->Calculation = -4105;

$excel->Workbooks->close();

$excel->Quit();

J'ai droit à mon popup.

Si je fais :
Code:
//================================================
//Sauvegarde et fermeture d'Excel
//================================================
$classeur->saveas($nom_fichier_genere);

$excel->Workbooks->close();
$excel->Calculation = -4105;
	
$excel->Quit();

Il me répond :
"Impossible de définir la propriété Calculation de la classe Application"

Par contre, si je laisse en manuel, il suffit que mon utilisateur aille redéfinir le calcul en automatique dans Excel une fois qu'il a ouvert le fichier XLS qu'il a téléchargé pour que ça fonctionne.

Le problème c'est que c'est avec des "il suffit que l'utilisateur..." qu'on va vers les plus grandes catastrophes et je les entends déjà brailler "Gnéééé, les totauuuux ils marchent pluuuuus".
Si vraiment y'a pas d'autres solution ça restera comme ça mais ça me plait qu'à moitié.

Je vais continuer à creuser tout ça demain, en tout cas merci pour ta réactivité.
 

tototiti2008

XLDnaute Barbatruc
Re : [COM] Zapper un msgbox

un truc peut-être : (à tester)
Tu ouvres un classeur vide
tu désactive les calculs
tu ouvre ton bon classeur, tu le remplis, tu l'enregistre, tu le ferme
tu réactive les calculs (même pas sûr que tu sois obligé)
tu quitte excel
 

pickwick

XLDnaute Nouveau
Re : [COM] Zapper un msgbox [Contourné]

J'y avais pensé.

En fait c'est pas vraiment une macro qui appelle le msgbox mais une fonction VB.
(Je sais pas si ça change grand chose mais en tout cas la fonction apparait pas dans le menu "macro")

Le problème c'est qu'utiliser AutomationSecurity fait planter l'ouverture de mon fichier Excel. (enfin juste si j'utilise la valeur dont j'ai besoin hein, si je lui dit d'activer les macros ça marche :confused: ) Bizarrement ça fonctionne en VB mais quand j'essaye de passer par PHP pour le faire il refuse.

Au final j'ai contourné le problème en modifiant (via PHP) la formule de mes cellules de sous-totaux : au lieu de faire appel à la fonction Msg (qui affiche la somme en rajoutant un popup si somme >10), je lui fait juste afficher la somme. Du coup le fichier sera plus tout à fait "officiel" une fois le traitement effectué mais tout restera transparent pour l'utilisateur final.

Je joins le code si jamais quelqu'un avait le même souci :

Code:
//======================================================================================
//  Modification des cellules de sous-totaux (suppression du msgbox si charge >10)
//======================================================================================
	
//Définition de la formule pour le premier jour
$cellule_premier_jour = $feuille->Range($premiere_colonne_charge.$ligne_totaux);
$cellule_premier_jour->FormulaLocal="=SI(SOMME(".$premiere_colonne_charge.$premiere_ligne_charge.":".$premiere_colonne_charge.$derniere_ligne_charge.")=0;\"\";SOMME(".$premiere_colonne_charge.$premiere_ligne_charge.":".$premiere_colonne_charge.$derniere_ligne_charge."))";
	

//Copie de la formule pour les autres jours du mois
$zone_de_destination = $feuille->Range($premiere_colonne_charge.$ligne_totaux.":".$derniere_colonne_charge.$ligne_totaux);
$cellule_premier_jour->AutoFill($zone_de_destination);


Je vous remercie pour votre aide

Bonne continuation.
 

Discussions similaires

Statistiques des forums

Discussions
312 466
Messages
2 088 677
Membres
103 917
dernier inscrit
skullym