PDA

View Full Version : problemi con FINDWINDOW


CIUFFO
18-12-2002, 18:09
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

cionci
18-12-2002, 18:30
Non ho capito bene qual è il problema... Me lo potresti rispiegare ?

CIUFFO
18-12-2002, 18:43
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.

cionci
18-12-2002, 18:46
Quale ramo dell' If fa nel caso che sia già aperto un file di Excel ?

CIUFFO
18-12-2002, 18:47
La modifica è per togliere 2 dim che non c'entravano nulla.

CIUFFO
18-12-2002, 18:50
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

cionci
18-12-2002, 18:55
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) ?

misterx
18-12-2002, 19:33
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

CIUFFO
19-12-2002, 10:23
Per misterX:
come lo porto in primo piano da VB?
Già c'è MyXL.Sheets("query web").Activate

CIUFFO
19-12-2002, 10:27
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

misterx
19-12-2002, 16:09
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

CIUFFO
20-12-2002, 09:22
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:

cionci
20-12-2002, 09:26
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...

CIUFFO
20-12-2002, 15:16
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

cionci
20-12-2002, 15:29
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

CIUFFO
20-12-2002, 18:30
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.

misterx
20-12-2002, 19:11
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

misterx
20-12-2002, 19:14
sob, doppio post :)

CIUFFO
20-12-2002, 19:28
Già provato, non funzia! :cry:

misterx
20-12-2002, 19:29
hai provato enumerando le window?

misterx
20-12-2002, 19:48
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)

CIUFFO
20-12-2002, 23:48
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à.

CIUFFO
20-12-2002, 23:59
Cos'è la tabella running object?

CIUFFO
21-12-2002, 12:11
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

cionci
21-12-2002, 15:42
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...

cionci
21-12-2002, 15:45
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 ;)

CIUFFO
21-12-2002, 18:59
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.

cionci
22-12-2002, 16:19
Hai provato con ShowWindow ?