View Full Version : problemi con FINDWINDOW
Chi sà spiegarmi perché, se ci sono altri file di excel aperti (ridotti a icona), questa sub non riesce ad aprire “cambi.xls”?
Se Excel non è in esecuzione tutto ok, su load della maschera di access viene aperto il file di excel e attivato il foglio “query web”, se “CAMBI.xls” è già aperto, ma solo lui!, esce dalla sub e carica direttamente la maschera.
'In un modulo di access 2000'
Option Compare Database
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub excel()
Dim path
Dim MyXL
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "Microsoft Excel - CAMBI.xls")
If hWnd = 0 Then '0 significa che il file di Excel non è in esecuzione.
Set MyXL = GetObject("C:\documenti\CAMBI.xls")
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
MyXL.Sheets("query web").Activate
Set MyXL = Nothing
Else
Exit Sub
End If
End Sub
'In una maschera di access'
Private Sub Form_Load()
excel
End Sub
Non ho capito bene qual è il problema... Me lo potresti rispiegare ?
Questa sub mi serve per aprire CAMBI.xls da access all'apertura di una maschera, ma se ci sono altri file di excel aperti la sub non riesce ad aprire il file.
Quale ramo dell' If fa nel caso che sia già aperto un file di Excel ?
La modifica è per togliere 2 dim che non c'entravano nulla.
Con questa riga vorrei controllare se CAMBI.xls è aperto :If hWnd = 0 Then '0 significa che "CAMBI.xls" non è in esecuzione.
'In un modulo di access 2000'
Option Compare Database
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub excel()
Dim path
Dim MyXL
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "Microsoft Excel - CAMBI.xls")
If hWnd = 0 Then '0 significa che "CAMBI.xls" non è in esecuzione.
Set MyXL = GetObject("C:\documenti\CAMBI.xls")
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
MyXL.Sheets("query web").Activate
Set MyXL = Nothing
Else
Exit Sub
End If
End Sub
'In una maschera di access'
Private Sub Form_Load()
excel
End Sub
Originally posted by "CIUFFO"
Con questa riga vorrei controllare se CAMBI.xls è aperto :If hWnd = 0 Then '0 significa che "CAMBI.xls" non è in esecuzione.
Ok... ma che ramo dell'if ti fa nel caso che un altri documento xls sia aperto (che se ho capito è il caso in cui non ti viene aperto CAMBI.xls) ?
Originally posted by "CIUFFO"
Questa sub mi serve per aprire CAMBI.xls da access all'apertura di una maschera, ma se ci sono altri file di excel aperti la sub non riesce ad aprire il file.
forse perchè devi portare cambi.xls in primo piano
Per misterX:
come lo porto in primo piano da VB?
Già c'è MyXL.Sheets("query web").Activate
Non c'è un ramo dell'if per il caso che un'altro .xls sia aperto
L'if controlla solo se "CAMBI.xls" è già aperto ed esce dalla sub se è gia aperto altrimenti lo apre, solo che se ci sono altri .xls non ci riesce e non capisco perchè.
Ciao
ho provato anch'io le API da te proposte, in effetti, se sul titolo della windows non compare per intero
"Microsoft Excel - Cartel1.xls"
la window non viene trovata
non sono un profondo conoscitore di VB ma per similitudine, ho idea che devi utilizzare ulteriori API del tipo
GetNextWindow() passandogli come handle
hwnd = FindWindow(0,"Microsoft Excel")
GetNextWindow(hwnd,GW_HWNDNEXT)
ma sicuramente in VB vi è un metodo più semplice
hai provato la FindWindowEx()?
a me purtroppo molte API sotto Excel non funzionano quindi non posso fare molte prove
Se metti un msgbox qualunque nella open del workbook del file .xls richiesto:Private Sub Workbook_Open()
MsgBox "ciao"
End Sub
Find windows apre il file .xls anche se ce ne sono altri aperti, ma una volta dato l'ok a msgbox excel dà il focus ad un'altro file .xls e quello richiesto che era apparso con l'msgbox sparisce! :confused:
Ma se è già aperto CAMBI.xls, ma non ha il focus, FindWindow te lo trova ?
In questo caso dovrebbe bastare usare nuovamente FindWindow per ottenere l'handle alla finestra di CAMBI.xls...poi gli setti il focus con l'API SetFocus...
Se Cambi.xls è già aperto l'IF va su else ed esce dalla sub.
Io voglio aprire Cambi.xls solo se non è già aperto, solo che se ci sono altri .xls findwindows non ci riesce, ovvero, ci riesce ma una volta dato ok a msgbox sparisce.
se provi questo esempio capirai:
'in un modulo
Option Compare Database
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub excel()
Dim path
Dim MyXL
Dim hwnd As Long
path = "c:\documenti\excel\Cartel1.xls"
hwnd = FindWindow(vbNullString, "Microsoft Excel - Cartel1.xls")
If hwnd = 0 Then ' 0 significa che il file di Excel non è in esecuzione.
Set MyXL = GetObject(path)
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
Set MyXL = Nothing
Else
Exit Sub
End If
End Sub
'in una maschera
Private Sub Form_Load()
excel
End Sub
'in Cartel1.xls
Private Sub Workbook_Open()
MsgBox "ciao"
End Sub
Originally posted by "CIUFFO"
Se Cambi.xls è già aperto l'IF va su else ed esce dalla sub.
Appunto... Guarda come lo modifico per rendere attivo CCAMBI.XLS
'in un modulo
Option Compare Database
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
Sub excel()
Dim path
Dim MyXL
Dim hwnd As Long
path = "c:\documenti\excel\Cartel1.xls"
hwnd = FindWindow(vbNullString, "Microsoft Excel - Cartel1.xls")
If hwnd = 0 Then ' 0 significa che il file di Excel non è in esecuzione.
Set MyXL = GetObject(path)
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
Set MyXL = Nothing
hwnd = FindWindow(vbNullString, "Microsoft Excel - Cartel1.xls")
If hwnd <> 0 Then
SetForegroundWindow(hwnd)
SetFocus(hwnd)
End If
Else
Exit Sub
End If
End Sub
'in una maschera
Private Sub Form_Load()
excel
End Sub
'in Cartel1.xls
Private Sub Workbook_Open()
MsgBox "ciao"
End Sub
Ho provato la tua modifica, ma non cambia nulla!
Dopo aver dato l'ok a msgbox cartel1 sparisce!
E poi hai messo:hwnd = FindWindow(vbNullString, "Microsoft Excel - Cartel1.xls")
If hwnd <> 0 Then
SetForegroundWindow(hwnd)
SetFocus(hwnd)
End If
Io devo dare il focus a Cartel1 dopo averlo aperto con getobject(path) e solo se non è già aperto.
E' chiaro che se è già aperto non devo aprirlo ancora.
La mia sub serve per aprire Cartel1 solo nel caso non sia già aperta.
Spero di essere stato chiaro.
devi andare a cercarla la window con GetNextWindow()
ci sono in rete un sacco di esempi adatti allo scopo
prova una cosa del genere:
hwindow = FindWindow(vbNullString, "Microsoft Excel")
if hwindow <> 0 then
hwindow = FindWindowEx(hwindow, 0, "Cambi.xls", vbNullString)
end if
If hwindow = 0 Then msgbox "Cambi.xls non trovata"
msgbox hwindow
Già provato, non funzia! :cry:
hai provato enumerando le window?
un'idea malsana; e se usi banalmente una cosa del genere, file "Cambi.xls" aperto o meno?
ShellExecute(0, "open", "Cambi.xls", vbNullString, _
"c:\", SW_SHOWDEFAULT)
Anche ShellExecute si comporta allo stesso modo: riescie ad aprire il file, ma quando do' l'ok a msgbox sparisce per dare posto ad un'altro .xls che era già aperto come se avesse la priorità.
Cos'è la tabella running object?
Mi sono scervellato una settimana con FindWindows e il problema era Get object!
Questo funziona:Option Compare Database
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Const SW_SHOWNORMAL = 1
Sub excel()
Dim path
Dim hwnd As Long
path = "c:\documenti\excel\Cartel1.xls"
hwnd = FindWindow(vbNullString, "Microsoft Excel - Cartel1.xls")
If hwnd = 0 Then ' 0 significa che il file di Excel non è in esecuzione.
ShellExecute hwnd, vbNullString, path, vbNullString, vbNullString, SW_SHOWNORMAL
hwnd = SetForegroundWindow(hwnd)
Else
Exit Sub
End If
End Sub
Originally posted by "CIUFFO"
Ho provato la tua modifica, ma non cambia nulla!
Dopo aver dato l'ok a msgbox cartel1 sparisce!
E poi hai messo:hwnd = FindWindow(vbNullString, "Microsoft Excel - Cartel1.xls")
If hwnd <> 0 Then
SetForegroundWindow(hwnd)
SetFocus(hwnd)
End If
Io devo dare il focus a Cartel1 dopo averlo aperto con getobject(path) e solo se non è già aperto.
E' chiaro che se è già aperto non devo aprirlo ancora.
La mia sub serve per aprire Cartel1 solo nel caso non sia già aperta.
Spero di essere stato chiaro.
L'ho capito...ma forse sei tu che non hai capito ciò che volevo fare...
Se Cartel1.xls non aperto...lo apri e poi cerchi il suo hwnd con FindWindow e poi lo porti in primo piano con SetForegroundWindow...
Originally posted by "CIUFFO"
Mi sono scervellato una settimana con FindWindows e il problema era Get object!
Ma era chiaro che il problema non fosse nella FindWindow...la finestra se era aperta veniva sempre trovata ;)
SetForegroundWindows porta in primo piano il file ma se excel è ridotto a icona non riesco a massimizzare il mio .xls.
Ho letto che si può impostare il .nCmdShow a SW_MAXIMIZE solo se il file è un eseguibile ed il mio è un document file.
Hai provato con ShowWindow ?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.