|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2005
Messaggi: 21
|
[VB] Applicazione che si blocca ogni seconda volta che viene lanciata
ABC
Ultima modifica di Andreabianchi1984 : 23-01-2010 alle 01:40. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Il tuo codice è soggetto ad errori, principalmente perchè stai usando Excel da VB6, non da VBA, perciò è rischioso ed ambiguo chiamare proprietà e metodi del modello ad oggetti di Excel in modo diretto, senza riferimenti completi.
Al momento non mi è chiaro perchè VB6 ti passi per buona la prima e non la seconda, in ogni caso è meglio così : Codice:
xlApp.ActiveCell.Offset(0, 0).Select
xlApp.ActiveCell.Offset(0, 0).Value = Text1(0).Text
xlApp.Range("A2").Select
a = xlApp.Range("B2").Value
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Sep 2005
Messaggi: 21
|
ABC
Ultima modifica di Andreabianchi1984 : 23-01-2010 alle 01:40. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
E perchè questa istanza nascosta viene creata solo sulla prima esecuzione della routine, e non sulla seconda e le successive ?
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Quote:
Ad ogni esecuzione, se sono usate delle istruzioni che fanno riferimento alla libreria di Excel senza passare da una esplicita istanza, ne viene creata automaticamente una nascosta. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Se così fosse dovrebbe funzionare ad ogni esecuzione, ossia ad ogni Click su quel pulsante, su una nuova istanza "fantasma" creata da VB6 allo scopo... Secondo me l'errore è dovuto al fatto di mischiare insieme 2 soluzioni possibili. Ci si può aiutare tenendo aperto il Task Manager durante le esecuzioni, e tenendo traccia del PID dei processi Excel tramite la GetWindowThreadProcessId : Codice:
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, ByVal lpdwProcessId As Long) As Long Codice:
Dim AppExcel As Excel.Application
Dim WB As Excel.Workbook
Set AppExcel = New Excel.Application
AppExcel.Visible = True
Dim PID As Long
PID = GetWindowThreadProcessId(AppExcel.hwnd, 0)
MsgBox PID
Set WB = AppExcel.Workbooks.Open(percorso & "TEST.xls")
AppExcel.ActiveCell.Offset(1, 1).FormulaR1C1 = "OFFSET"
WB.Worksheets("Foglio2").Select
WB.Worksheets("Foglio2").Range("A1").FormulaR1C1 = "PROVA"
WB.Close SaveChanges:=True
AppExcel.Quit
Set WB = Nothing
Set AppExcel = Nothing
> CASO 2 - Riferimenti totalmente impliciti : Codice:
Workbooks.Open percorso & "TEST.xls"
Dim PID As Long
PID = GetWindowThreadProcessId(ActiveCell.Application.hwnd, 0)
MsgBox PID
ActiveCell.Offset(2, 2).FormulaR1C1 = "OFFSET"
Worksheets("Foglio2").Select
Worksheets("Foglio2").Range("A1").FormulaR1C1 = "PROVA"
ActiveWorkbook.Close SaveChanges:=True
> CASO 3 - L'Ibrido : Codice:
Dim AppExcel As Excel.Application
Dim WB As Excel.Workbook
Set AppExcel = New Excel.Application
AppExcel.Visible = True
Set WB = AppExcel.Workbooks.Open(percorso & "TEST.xls")
ActiveCell.Offset(1, 1).FormulaR1C1 = "OFFSET"
Worksheets("Foglio2").Select
Worksheets("Foglio2").Range("A1").FormulaR1C1 = "PROVA"
Dim PID As Long
PID = GetWindowThreadProcessId(ActiveCell.Application.hwnd, 0)
MsgBox PID
PID = GetWindowThreadProcessId(AppExcel.hwnd, 0)
MsgBox PID
WB.Close SaveChanges:=True
AppExcel.Quit
Set WB = Nothing
Set AppExcel = Nothing
" affinchè non vada più in errore. Dallo studio del PID risulta che alla PRIMA esecuzione il PID di AppExcel coincide con l'istanza fantasma, mentre dalla seconda in poi l'istanza fantasma conserva sempre il suo PID, mentre AppExcel cambia. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:18.




















