Activer un fichier via son handle et le sortir du mode protégé
Bonjour,
pourriez-vous m'aider, svp?
A partir d'un classeur Excel, je télécharge un autre classeur Excel situé sur l'intranet de notre groupe.
Je souhaiterais simplement copier-coller l'unique onglet de ce classeur téléchargé dans le classeur de départ.
Mon problème se situe au niveau du mode protégé... quand on utilise IE, le classeur s'ouvre sans que le mode protégé soit activé; par contre, en utilisant Firefox (plus rapide, plus fiable), le classeur s'ouvre avec le mode protégé activé, ce qui ne permet pas de récupérer directement l'onglet en question.
J'ai donc pensé basculer sur ce classeur téléchargé à partir de son handle puis tenter
Code:
ActiveWorkbook.Unprotect
mais ça ne fonctionne pas... En effet, même si le classeur vient bien au premier plan, pour Excel, Activeworkbook est à Nothing... :?
Quelqu'un aurait-il une petite idée, svp?
Voici quelques lignes de code à partir de trouvailles faites sur Internet
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Public instance
Public Const GW_HWNDNEXT = 2
Sub macro()
instance = Null
'je passe les lignes qui permettent de lancer le téléchargement à partir de Firefox
If Not WaitFichier(60) Then
'fichier chargé en moins de 60s
SetForegroundWindow instance 'je passe le fichier au premier plan
ActiveWorkbook.Unprotect 'je tente de supprimer le mode protégé... mais Excel ne reconnait pas ActiveWorkbook
Dim Wb As Excel.Workbook
Dim Appli As Excel.Application
On Error Resume Next
Set Appli = GetObject(, "Excel.Application")
For Each Wb In Appli.Workbooks
If Left(Wb.Name, Len("nomdufichier")) = "nomdufichier" Then 'permet d'éviter les numéros d'instances du type "nomdufichier (2)", etc.
'... et il ne sait donc pas trouver le fichier quand il est en mode protégé...
End If
Next Wb
End If
End Sub
Public Function GetHandleFromPartialCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean
'permet de trouver la fenêtre désirée
Dim lhWndP As Long
Dim sStr As String
GetHandleFromPartialCaption = False
lhWndP = FindWindow(vbNullString, vbNullString)
Do While lhWndP <> 0
sStr = String(GetWindowTextLength(lhWndP) + 1, Chr$(0))
GetWindowText lhWndP, sStr, Len(sStr)
sStr = Left$(sStr, Len(sStr) - 1)
If InStr(1, sStr, sCaption) > 0 Then
GetHandleFromPartialCaption = True
lWnd = lhWndP
Exit Do
End If
lhWndP = GetWindow(lhWndP, GW_HWNDNEXT)
Loop
End Function
Public Function WaitFichier(pTimeOut As Long) As Boolean
' Attend que le fichier soit chargé
' pTimeOut est un time out en secondes (WaitFichier vaut True si Timeout)
Dim lhWndP As Long
Dim lTimer As Double
lTimer = Timer
Do
DoEvents
If GetHandleFromPartialCaption(lhWndP, "nomdufichier") = True Then instance = lhWndP: Exit Do 'on attribue la valeur du handle à la variable instance
If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
WaitFichier = True
Exit Do
End If
Loop
End Function |
Merci par avance pour l'aide.
Yohann