[..] Excel dans ma gui GUI non mais Excel hors de GUI, c'est pas si mal

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 317
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

[..] Excel dans ma gui GUI non mais Excel hors de GUI, c'est pas si mal

#1

Message par Anthony »

Bonjour à tous,

J'ai fait un petit classeur Exel @ScriptDir & "\Test.xlsx" tout simple.
Je souhaite l'intégrer dans ma GUI $GUI_ActiveX = GUICtrlCreateObj( $oExcel, 30, 30, 420, 420) mais sans les contrôles si possible, juste le classeur.
Et exel créé bien le fichier de sauvegarde temporraire ~$Test.xlsx mais rien dans la GUI
Une petite idée, un indice...
Test.xlsx
(12.82 Kio) Téléchargé 736 fois
Fichier de test

Edit : Exemple hors de la GUI avec visuel ici https://www.autoitscript.fr/forum/viewt ... 29#p108732
  • Code : Tout sélectionner

    #include <Excel.au3>
    #include <GUIConstantsEx.au3>
    
    Local $v_Dir = @ScriptDir & "\Test.xlsx"
    
    $oExcel = ObjGet( $v_Dir)
    If Not IsObj( $oExcel) Then
       Msgbox(0,"", "erreur")
       Exit
    EndIf
    
    Global $hGui = GUICreate("Excel Embedded", 500, 500)
    
    Global $id_Btn_Set_Feuil_2	= GUICtrlCreateButton("Set Feuil 2", 15, 5, 85, 20)					; Change la feuille de calcul
    Global $id_Btn_Set_D2		= GUICtrlCreateButton("Set D2 > 25%", 105, 5, 85, 20)				; Change le taux de TVA de 20% à 25%
    Global $id_Btn_Get_E16		= GUICtrlCreateButton("Get E16", 195, 5, 85, 20)					; Récupére le montant total TTC
    Global $id_Btn_Print		= GUICtrlCreateButton("Aperçu avant impréssion", 285, 5, 140, 20)	; Permet de lancer l'apperçu avant l'impression
    Global $id_Btn_Save			= GUICtrlCreateButton("Save", 430, 5, 50, 20)						; Sauvegarder le document
    
    $GUI_ActiveX = GUICtrlCreateObj( $oExcel, 30, 30, 420, 420)
    
    For $bars In $oExcel.CommandBars
       $bars.Enabled = False
    Next
    
    GUISetState()
    
    While 1
       $Msg = GUIGetMsg()
       Select
    
    		 Case $Msg = $id_Btn_Set_Feuil_2
    			ConsoleWrite( "Set Feuil 2" & @CRLF)
    		 Case $Msg = $id_Btn_Set_D2
    			ConsoleWrite( "Set D2 > 25%" & @CRLF)
    		 Case $Msg = $id_Btn_Get_E16
    			ConsoleWrite( "Get E16" & @CRLF)
    		 Case $Msg = $id_Btn_Print
    			ConsoleWrite( "Aperçu avant impréssion" & @CRLF)
    		 Case $Msg = $id_Btn_Save
    			ConsoleWrite( "Document Exel sauvegardé" & @CRLF)
    
    		 Case $Msg = $GUI_EVENT_CLOSE
    			   $oExcel.Close
    			   ExitLoop
    
       EndSelect
    Wend
Modifié en dernier par Anthony le dim. 09 mars 2025 18:59, modifié 4 fois.
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- 2025/03/17 --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 317
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Excel dans ma gui GUI

#2

Message par Anthony »

:shock: je vais dodo
J'ai réussi à intégrer à ma manière et pas trouvé mieux que _WinAPI_SetParent( $hExcelWnd, $hGui) pour intégrer Excel dans ma GUI.
Le soucis c'est que je perd le contrôle de certains boutons, si une âme charitable apportait un vent d'espoir je serrai que plus qu'heureux.
  • Code : Tout sélectionner

    #include <Excel.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    
    ; Créer une instance Excel
    Local $oExcelApp = ObjCreate( "Excel.Application")
    If Not IsObj($oExcelApp) Then
       MsgBox( "", "Erreur", "Impossible de créer l'objet Excel.Application")
       Exit
    EndIf
    
    ; Créer la fenêtre GUI ( avec option pour redimensionner)
    Global $hGui				= GUICreate( "Excel Embedded", 500, 500, -1, -1, $WS_OVERLAPPEDWINDOW)
    
    ; Créer les boutons
    Global $id_Btn_Set_Feuil_2	= GUICtrlCreateButton( "Set Feuil 2", 15, 5, 85, 20)
    Global $id_Btn_Set_D2		= GUICtrlCreateButton( "Set D2 > 25%", 105, 5, 85, 20)
    Global $id_Btn_Get_E16		= GUICtrlCreateButton( "Get E16", 195, 5, 85, 20)
    Global $id_Btn_Print		= GUICtrlCreateButton( "Aperçu avant impression", 285, 5, 140, 20)
    Global $id_Btn_Save			= GUICtrlCreateButton( "Save", 430, 5, 50, 20)
    
    ; Créer un contrôle ActiveX pour afficher Excel dans la fenêtre
    $GUI_ActiveX				= GUICtrlCreateObj( $oExcelApp, 30, 30, 420, 420)
    
    ; Désactiver les barres d'outils d'Excel
    For $bars In $oExcelApp.CommandBars
       $bars.Enabled			= True
    Next
    
    ; Ouvrir un fichier Excel
    Local $v_Dir				= @ScriptDir & "\Test.xlsx"
    Local $oWorkbook			= $oExcelApp.Workbooks.Open($v_Dir)
    If Not IsObj( $oWorkbook) Then
       MsgBox( "", "Erreur", "Impossible d'ouvrir le classeur Excel")
       $oExcelApp.Quit
       Exit
    EndIf
    
    ; Récupérer la fenêtre principale Excel
    Local $hExcelWnd = WinGetHandle( "[CLASS:XLMAIN]")
    
    ; Rendre la fenêtre Excel enfant de la fenêtre GUI AutoIt
    If Not @error Then
       _WinAPI_SetParent( $hExcelWnd, $hGui)	; <================================== Ici
    
       ; Positionner et dimensionner correctement la fenêtre Excel
       WinMove( $hExcelWnd, "", 30, 30, 440, 440)
       WinSetState( $hExcelWnd, "", @SW_SHOWNORMAL)
    EndIf
    
    ; Afficher la fenêtre GUI
    GUISetState()
    
    ; Rend l'application Excel visible dans la GUI
    $oExcelApp.Visible			= True
    
    GUIRegisterMsg($WM_SIZE, "_WM_SIZE")
    
    While 1
       Local $Msg = GUIGetMsg()
    
       Select
    		 Case $Msg = $id_Btn_Set_Feuil_2
    			   ; Vérifier si la feuille 2 existe et l'activer avant de la sélectionner
    			   $oExcelApp.Sheets(2).Select
    		 Case $Msg = $id_Btn_Set_D2
    			   ; Mettre "25%" dans la cellule D2
    			   $oExcelApp.Sheets(2).Select
    			   $oExcelApp.ActiveSheet.Range( "D2").Value = "25%"
    		 Case $Msg = $id_Btn_Get_E16
    			   ; Lire la valeur de la cellule E16
    			   Local $value = $oExcelApp.ActiveSheet.Range( "E16").Value
    			   MsgBox(0, "Valeur de E16", $value)
    		 Case $Msg = $id_Btn_Print
    			   ; Aperçu avant impression
    			   $oExcelApp.ActiveSheet.PrintPreview
    		 Case $Msg = $id_Btn_Save
    			   ; Sauvegarder le fichier Excel
    			   $oWorkbook.Save
    			   MsgBox(0, "Sauvegarde", "Document Excel sauvegardé")
    		 Case $Msg = $GUI_EVENT_CLOSE
    			   ; Fermer Excel et quitter
    			   $oWorkbook.Close( False)
    			   $oExcelApp.Quit
    			   ExitLoop
       EndSelect
    Wend
    
    Func _WM_SIZE( $hWnd, $iMsg, $wParam, $lParam)
    
       ; Si la taille de la fenêtre GUI change, ajuster la fenêtre Excel en temps réel
       Local $iWidth			= WinGetClientSize( $hWnd)[0]
       Local $iHeight			= WinGetClientSize( $hWnd)[1]
    
       ; Mettre à jour la taille de la fenêtre Excel en fonction de la taille de la fenêtre GUI
       WinMove( $hExcelWnd, "", 30, 30, $iWidth - 60, $iHeight - 60)		; Ajuste la taille de Excel en fonction de la taille de la GUI
    
       Return $GUI_RUNDEFMSG
    
    EndFunc   ;==>_WM_SIZE
    
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- 2025/03/17 --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 133
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: [..] Excel dans ma gui GUI OK mais boutons aléatoirement réactifs

#3

Message par Nine »

Voici une façon de faire. Faut comprendre que l'utilisation d'un ActiveX apporte son lot de limitations. La sauvegarde ne peut pas se faire adéquatement sans préciser le nom du fichier. L'impression ne fonctionne pas (mais j'ai pas trop explorer cette avenue).

Code : Tout sélectionner

#include <Constants.au3>
#include <GUIConstants.au3>

Example()

Func Example()
  Local $sFile = @ScriptDir & '\Test2.xlsx'
  Local $oExcelDoc = ObjGet($sFile)
  Local $hGUI = GUICreate("Excel Viewer", 500, 500, -1, -1, $WS_MINIMIZEBOX + $WS_SYSMENU + $WS_CLIPCHILDREN)
  Local $oActiveX = GUICtrlCreateObj($oExcelDoc, 10, 70, 475, 375)
  For $oBar In $oExcelDoc.CommandBars
    $oBar.Enabled = False
    $oBar.Visible = False
  Next
  $oExcelDoc.Application.DisplayFormulaBar = False
  $oExcelDoc.Application.CommandBars("Shadow Settings").Visible = False
  $oExcelDoc.Application.DisplayScrollBars = False
  $oExcelDoc.Application.DisplayStatusBar = False

  Local $id_Btn_Set_Feuil_2 = GUICtrlCreateButton("Set Feuil 2", 15, 5, 85, 20)
  Local $id_Btn_Set_D2 = GUICtrlCreateButton("Set D2 > 25%", 105, 5, 85, 20)
  Local $id_Btn_Get_E16 = GUICtrlCreateButton("Get E16", 195, 5, 85, 20)
  Local $id_Btn_Print = GUICtrlCreateButton("Aperçu avant impression", 285, 5, 140, 20)
  Local $id_Btn_Save = GUICtrlCreateButton("Save", 430, 5, 50, 20)

  GUISetState()

  While True
    Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
        ExitLoop
      Case $id_Btn_Set_Feuil_2
        $oExcelDoc.Sheets(2).Select
      Case $id_Btn_Set_D2
        $oExcelDoc.Sheets(2).Select
        $oExcelDoc.ActiveSheet.Range("D2").Value = "25%"
      Case $id_Btn_Get_E16
        Local $value = $oExcelDoc.ActiveSheet.Range("D2").Value
        MsgBox(0, "Valeur de E16", $value)
      Case $id_Btn_Save
        $oExcelDoc.SaveAs(@ScriptDir & '\Test2 Mod.xlsx')
    EndSwitch
  WEnd

  $oExcelDoc.Close()
  GUIDelete($hGUI)
EndFunc   ;==>Example
ps. j'ai eu de la difficulté à utiliser ton fichier .xlsx (corruption et blocage), alors j'ai en ai créé un pour tester mon script...
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 317
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Excel hors de GUI, c'est pas si mal

#4

Message par Anthony »

@Nine

Finalement, j'ai du me mettre à fond à la COM, j'ai pas fini mais l'esentiel est là, j'éspère que çà pourra servir à quelqu'un :D
Il y à l'ouverture et la fermeture que je souhaite faire plus propre et la fonction Annuler (Ctrl+Z) et Rétabir (Ctrl+Y) que je n'ai pas réussi à faire et ma bête noire l'apperçu avant impression :cry:
PS: Je téléchargé le fichier de nouveau et il fonctionne très bien chez moi.

Je ne saait pas si les modérateurs pensent qu'il pourait avoir sa place dans les exemples de GUI :?:

Merci pour ton retour ;)
Nice Excel.au3
(11.07 Kio) Téléchargé 27 fois
Nice Excel.png
  • Code : Tout sélectionner

    #cs ----------------------------------------------------------------------------
    
     AutoIt Version: 3.3.14.5
     Author:         myName
    
     Script Function:
    	Template AutoIt script.
    
    #ce ----------------------------------------------------------------------------
    
    #include <Array.au3>
    #include <Excel.au3>
    #include <File.au3>
    #include <GuiConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <FileConstants.au3>
    
    ; Durée des notifications MsgBox
    Global $MsgBox_Time = 3
    
    ; Fichier Excel
    Local $vExcelFile = @ScriptDir & "\Test.xlsx"
    
    ; Créer la fenêtre GUI (avec option pour redimensionner et la détection)
    Global $hGui = GUICreate("Nice Excel", 620, 60, -1, 0, $WS_OVERLAPPEDWINDOW)
    
    ; Création des boutons permettant d'interagir avec Excel
    Global $id_Btn_Set_Feuil_1        = GUICtrlCreateButton("Feuil 1", 15, 5, 45, 20)
    Global $id_Btn_Set_Feuil_2        = GUICtrlCreateButton("Feuil 2", 60, 5, 45, 20)
    Global $id_Btn_Set_D2             = GUICtrlCreateButton("D2 > 25%", 105, 5, 65, 20)
    Global $id_Btn_Set_Feuil_3        = GUICtrlCreateButton("Feuil 3", 170, 5, 45, 20)
    Global $id_Btn_Get_E16            = GUICtrlCreateButton("Get E16", 215, 5, 55, 20)
    Global $id_Btn_Print_Preview      = GUICtrlCreateButton("Aperçu avant impression", 270, 5, 130, 20)
    Global $id_Btn_Print              = GUICtrlCreateButton("Imprimer", 400, 5, 50, 20)
    Global $id_Btn_Save               = GUICtrlCreateButton("Sauvegarder", 450, 5, 70, 20)
    Global $id_Btn_Close_Preview      = GUICtrlCreateButton("Fermer l'aperçu", 520, 5, 80, 20)
    Global $id_Input_Zoom             = GUICtrlCreateInput("", 15, 30, 45, 20, $ES_NUMBER), $Zoom_Actuel
    Global $id_UpDown_Zoom            = GUICtrlCreateUpdown($id_Input_Zoom)
    Global $id_Btn_Undo               = GUICtrlCreateButton("Annuler (Ctrl+Z)", 65, 30, 100, 20)
    Global $id_Btn_Redo               = GUICtrlCreateButton("Rétablir (Ctrl+Y)", 170, 30, 100, 20)
    GUICtrlSetLimit($id_UpDown_Zoom, 400, 10)
    
    GUICtrlSetBkColor( $id_Btn_Print_Preview, 0xFF9999)
    GUICtrlSetBkColor( $id_Btn_Close_Preview, 0xFF9999)
    GUICtrlSetBkColor( $id_Btn_Undo, 0xFF9999)
    GUICtrlSetBkColor( $id_Btn_Redo, 0xFF9999)
    
    If Not _Gestion_d_un_crash_Excel_precedent( $vExcelFile) Then Exit
    
    GUISetState()
    
    ; Boucle principale gérant les événements de l'interface
    While 1
       Local $Msg = GUIGetMsg()
       Select
    	  Case $Msg = $id_Btn_Set_Feuil_1
    		$oExcelApp.Sheets(1).Select
    
    	  Case $Msg = $id_Btn_Set_Feuil_2
    		$oExcelApp.Sheets(2).Select
    
    	  Case $Msg = $id_Btn_Set_D2
    		$oExcelApp.Sheets(2).Select
    		$oExcelApp.ActiveSheet.Range("D2").Value = "25%"
    
    	  Case $Msg = $id_Btn_Set_Feuil_3
    		$oExcelApp.Sheets(3).Select
    
    	  Case $Msg = $id_Btn_Get_E16
    		Local $value = $oExcelApp.ActiveSheet.Range("E16").Value
    		MsgBox(0, "Valeur de E16", $value, $MsgBox_Time)
    
    	  Case $Msg = $id_Btn_Print_Preview
    		$oExcelApp.Visible = True
    		WinActivate($hExcelWnd)
    		$oExcelApp.ActiveSheet.PrintPreview
    
    	  Case $Msg = $id_Btn_Print
    		$oExcelApp.ActiveSheet.PrintOut
    
    	  Case $Msg = $id_Btn_Save
    		$oWorkbook.Save
    		MsgBox(0, "Sauvegarde", "Document Excel sauvegardé", $MsgBox_Time)
    
    	  Case $Msg = $id_Btn_Close_Preview
    		ConsoleWrite("Aperçu avant impression fermé." & @CRLF)
    
    	  Case $Msg = $id_Input_Zoom    ; Gestion d'entrées du Zoom
    		 Local $Zoom_Actuel = GUICtrlRead($id_Input_Zoom)
    		 ; Vérification sécurité limites zoom (10% - 400%)
    		 If $Zoom_Actuel >= 10 And $Zoom_Actuel <= 400 Then
    			$oExcelApp.ActiveWindow.Zoom = $Zoom_Actuel
    		 Else
    			MsgBox(48, "Erreur", "Valeur du zoom invalide (doit être entre 10 et 400).")
    		 ; Réinitialiser à la dernière valeur correcte
    		 GUICtrlSetData($id_Input_Zoom, $oExcelApp.ActiveWindow.Zoom)
    	  EndIf
    
    	  Case $Msg = $id_Btn_Undo	; Annuler (Ctrl+Z) via COM
    		 ConsoleWrite("Annuler (Ctrl+Z) indisponible." & @CRLF)
    
    	  Case $Msg = $id_Btn_Redo	; Rétablir (Ctrl+Y) via COM
    		 ConsoleWrite("Rétablir (Ctrl+Y) indisponible." & @CRLF)
    
    	  Case $Msg = $GUI_EVENT_CLOSE
    		 _Gestion_d_un_crash_Excel_precedent( "", True)
    		 ExitLoop
       EndSelect
       _DetectAndResize($hGui, $hExcelWnd)
       Sleep(50)
    WEnd
    
    ; Fonction détection de la GUI puis Excel avec repositionnement d'Excel si GUI change de position et de taille ( A tester sur plusieur moniuteurs)
    Func _DetectAndResize($hGui, $hExcelWnd)
       If Not IsDeclared("bWasInsideGUI") Then Global $bWasInsideGUI = False
       If Not IsDeclared("bExcelVisible") Then Global $bExcelVisible = False
    
       ; Détection de la position de la souris et des fenêtres
       Local $aMousePos    = MouseGetPos()
       Local $aGuiPos      = WinGetPos($hGui)
       Local $aWinPosExcel = WinGetPos($hExcelWnd)
       Local $tRECT        = _WinAPI_GetWorkArea()
       Local $WorkArea_H   = DllStructGetData($tRECT, 'Bottom') - DllStructGetData($tRECT, 'Top')
    
       Local $bIsInsideGUI = ($aMousePos[0] >= $aGuiPos[0] And $aMousePos[0] <= $aGuiPos[0] + $aGuiPos[2] And _
    						   $aMousePos[1] >= $aGuiPos[1] And $aMousePos[1] <= $aGuiPos[1] + $aGuiPos[3])
       Local $bIsInsideExcel = ($aMousePos[0] >= $aWinPosExcel[0] And $aMousePos[0] <= $aWinPosExcel[0] + $aWinPosExcel[2] And _
    						   $aMousePos[1] >= $aWinPosExcel[1] And $aMousePos[1] <= $aWinPosExcel[1] + $aWinPosExcel[3])
    
       ; Ajuster la visibilité d'Excel
       If $bIsInsideGUI Then
          $oExcelApp.Visible = True
          $bExcelVisible     = True
          WinSetOnTop($hGui, "", 1)
          WinSetOnTop($hExcelWnd, "", 1)
       ElseIf Not $bIsInsideGUI And Not $bIsInsideExcel Then
          $oExcelApp.Visible = False
          $bExcelVisible     = False
          WinSetOnTop($hGui, "", 0)
          WinSetOnTop($hExcelWnd, "", 0)
       EndIf
    
       ; Mettre à jour la position d'Excel sous la GUI si elle est déplacée
       Local $iExcelY = $aGuiPos[1] + $aGuiPos[3]
       WinMove($hExcelWnd, "", $aGuiPos[0], $iExcelY, $aGuiPos[2], $WorkArea_H - $iExcelY - 5)
    
       $bWasInsideGUI = $bIsInsideGUI
    EndFunc
    
    ; Si Excel crash, on le récupère si c'est possible
    Func _Gestion_d_un_crash_Excel_precedent( $v_Dir = "", $bFermer = False)
       ; Définition du fichier de configuration
       If Not IsDeclared("sCrashFile") Then Global $sCrashFile = @ScriptDir & "\config.ini"
    
       If $bFermer Then
    	 If IsObj($oExcelApp) Then
    		 ; Désactiver les alertes et animations Excel
    		 With $oExcelApp
    			 .Visible                = False
    			 .DisplayAlerts          = False
    			 .ScreenUpdating         = False
    			 .EnableEvents           = False
    			 .AskToUpdateLinks       = False
    			 .AlertBeforeOverwriting = False
    			 .DisplayFullScreen      = False
    		 EndWith
    
    		 If IsObj($oWorkbook) Then
    			 ; -- Débloquer l’éventuelle cellule en cours d’édition --
    			 WinActivate($hExcelWnd)
    			 Send("{ENTER}")
    			 Sleep(100)
    
    			 ; Vérifier si le document a été modifié avant de l’enregistrer
    			 If Not $oWorkbook.Saved Then
    				 $oWorkbook.Save
    			 EndIf
    			 $oWorkbook.Close(False)
    		 EndIf
    
    		 ConsoleWrite("Tentative de fermeture d'Excel..." & @CRLF)
    
    		 ; Vérifier si Excel est bloqué par une boîte de dialogue
    		 If WinExists("[CLASS:#32770]") Then
    			 ConsoleWrite("Une boîte de dialogue Excel bloque la fermeture. Tentative de fermeture forcée..." & @CRLF)
    			 Send("{ESC}") ; Ferme une éventuelle boîte de dialogue
    			 Sleep(1000)
    		 EndIf
    
    		 ; Exécuter la fermeture avec gestion d’erreur
    		 If Execute("$oExcelApp.Quit") = 0 Then
    			 ConsoleWrite("Échec de la fermeture normale. Forçage de fermeture..." & @CRLF)
    			 ProcessClose("EXCEL.EXE")
    		 Else
    			 ConsoleWrite("Excel fermé avec succès." & @CRLF)
    		 EndIf
    	  EndIf
    
    	  ; Supprimer l'entrée du handle Excel dans config.ini
    	  IniDelete($sCrashFile, "Excel", "Handle")
    	  Return True
    
       Else
    	  ; Vérification d'un crash précédent en lisant le handle
    	  Local $sHandle = IniRead($sCrashFile, "Excel", "Handle", "")
    	  If $sHandle <> "" And $sHandle <> "0x00000000" And WinExists($sHandle) Then
    		 MsgBox(48, "Alerte", "Une instance Excel précédemment ouverte a été détectée. Restauration en cours...")
    		 Global $hExcelWnd = $sHandle
    		 WinSetState($hExcelWnd, "", @SW_SHOW)
    		 WinActivate($hExcelWnd)
    		 $oExcelApp.Visible = True
    		 $oExcelApp.DisplayFullScreen = True
    		 Return True
    	  Else
    		 ; Suppression de l'ancien handle si invalide
    		 IniDelete($sCrashFile, "Excel", "Handle")
    	  EndIf
    
    	  ; Création d'une nouvelle instance Excel
    	  Global $oExcelApp = ObjCreate("Excel.Application")
    	  If Not IsObj($oExcelApp) Then
    		 MsgBox(16, "Erreur", "Impossible de créer une instance Excel.")
    		 Return False
    	  EndIf
    
    	  ; Désactiver certaines alertes Excel dès la création
    	  With $oExcelApp
    		 .Visible                = False
    		 .DisplayAlerts          = False
    		 .ScreenUpdating         = True
    		 .EnableEvents           = False
    		 .AskToUpdateLinks       = False
    		 .AlertBeforeOverwriting = False
    	  EndWith
    
    	  ; Attendre qu'Excel soit complètement chargé avant de récupérer le handle
    	  Sleep(500)
    
    	  ; Vérification du fichier temporaire de crash (~$Test.xlsx)
    	  Local $sDrive = "", $sDir = "", $sFileName = "", $sExtension = ""
    	  Local $aPathSplit = _PathSplit( $v_Dir, $sDrive, $sDir, $sFileName, $sExtension)
    	  Local $v_Dir_Tmp = $aPathSplit[1]&$aPathSplit[2] & "~$" &$aPathSplit[3]&$aPathSplit[4]
    
    	  If FileExists($v_Dir_Tmp) Then
    		 ; On récupère la taille du fichier temporaire
    		 Local $iSize_Tmp = FileGetSize($v_Dir_Tmp)
    		 ; On suppose qu'en-dessous de 1 Ko, c'est juste un fichier lock
    		 If $iSize_Tmp > 1024 Then
    			 MsgBox(48, "Alerte", "Excel a détecté un crash. Tentative de récupération du fichier temporaire.")
    			 Global $oWorkbook = $oExcelApp.Workbooks.Open($v_Dir_Tmp)
    		 Else
    			 MsgBox(48, "Alerte", _
    					"~$Test.xlsx semble trop petit pour être un vrai fichier de récupération. " & _
    					"On l'ignore et on ouvre Test.xlsx.")
    			 FileDelete($v_Dir_Tmp)
    			 Global $oWorkbook = $oExcelApp.Workbooks.Open($v_Dir)
    		 EndIf
    	  Else
    		 ; (Code original conservé)
    		 Global $oWorkbook = $oExcelApp.Workbooks.Open($v_Dir)
    	  EndIf
    
    	  ; Récupération et stockage du handle Excel
    	  Global $hExcelWnd = WinGetHandle("[CLASS:XLMAIN]")
    	  WinSetTrans( $hExcelWnd, "", 240)             ; Rend la barre invisible, un nombre compris entre 0 et 255
    	  Local $iStyle = _WinAPI_GetWindowLong($hExcelWnd, $GWL_STYLE)
    	  _WinAPI_SetWindowLong($hExcelWnd, $GWL_STYLE, BitAND($iStyle, BitNOT(0x00C00000)))
    	  WinSetState($hExcelWnd, "", "")  ; Forcer la mise à jour
    
    	  If $hExcelWnd = 0x00000000 Or $hExcelWnd = "" Then
    		 MsgBox(16, "Erreur", "Impossible d'obtenir le handle de la fenêtre Excel.")
    		 Return False
    	  EndIf
    	  IniWrite($sCrashFile, "Excel", "Handle", $hExcelWnd)
    	  Sleep(100)
    
    	  ; Forcer l'affichage d'Excel
    	  $oExcelApp.Visible           = True
    	  $oExcelApp.DisplayFullScreen = True
    
    	  ; On place la GUI et Excel au-dessus de toutes les autres fenêtres
    	  WinSetOnTop($hGui, "", 1)
    	  WinSetOnTop($hExcelWnd, "", 1)
    
    	  Local $Zoom_Actuel           = $oExcelApp.ActiveWindow.Zoom
    	  GUICtrlSetData($id_Input_Zoom, $Zoom_Actuel)
    
    	  If Not WinActive($hExcelWnd) Then WinActivate($hExcelWnd)
    
    	 Return True
       EndIf
    EndFunc
    
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- 2025/03/17 --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 133
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: [..] Excel dans ma gui GUI non mais Excel hors de GUI, c'est pas si mal

#5

Message par Nine »

J'ai tenté d'exécuter ton code, mais j'obtiens un paquet d'erreurs dues à des variables non-déclarées. En enlevant au3check, je n'ai plus le précédent problème mais j'obtiens une erreur COM à l'ouverture du fichier Excel. Je n'ai pas essayé de débugger ton script.

ps. ok, je suis en mesure d'exécuter ton code, le fait que les variables non-déclarées ont interrompu le script, le fichier xlsx était encore ouvert.
Modifié en dernier par Nine le lun. 10 mars 2025 17:25, modifié 1 fois.
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 317
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Excel dans ma gui GUI non mais Excel hors de GUI, c'est pas si mal

#6

Message par Anthony »

Tu as quelle version d'office ?
J'ai office 2019 Pro.
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- 2025/03/17 --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 133
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: [..] Excel dans ma gui GUI non mais Excel hors de GUI, c'est pas si mal

#7

Message par Nine »

Voici comment faire pour le PrintPreview et le Undo :

Code : Tout sélectionner

Global $oExcelApp = ObjCreate("Excel.Application")
$oExcelApp.Visible = True

Global $oWorkbook = $oExcelApp.Workbooks.Open(@ScriptDir & "\Test.xlsx")

$oWorkbook.Sheets(2).PrintPreview()

Sleep(10 * 1000) ;  faire une modif dans le chiffrier

$oExcelApp.Undo()
ps. Désolé, je n'y arrive pas avec ton code. :(
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 317
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Excel dans ma gui GUI non mais Excel hors de GUI, c'est pas si mal

#8

Message par Anthony »

Merci pour ton retour je note çà ;)
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- 2025/03/17 --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Répondre