Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Controllo finestra aperta

  1. #1
    Caiannow non  in linea Novello
    Post
    32
    Like Inviati  
    0
    Like Ricevuti  
    0
    Salve a tutti,

    Vorrei fare in modo che quando faccio partire una macro tramite un pulsante, il programma mi controlli se ci sia un'altro file excel aperto con un determinato nome e, se si, me lo chiuda. In entrambi i casi poi deve eseguire una macro. Sono riuscito a risolverlo con un On Error, ma non so se questo pu causare problemi..
    Ecco come ho fatto:

    Sub ProjectRun()
    
    Set shO = Worksheets("Sheet")
    
    windname = shO.Range("C3")
    
    On Error GoTo Run
    
    If Not Workbooks(windname) Is Nothing Then
        Windows(windname).Close
    End If
      
    Run:
    If....
    ......
    .....
    macro
    ....
    .....   
     
    End If
    
    C' una soluzione migliore? Pu crearmi problemi il fatto che spesso abbia un errore e lo bypasso con On error?

  2. #2
    L'avatar di @Alex
    @Alex non  in linea Moderatore Globale
    Post
    16,803
    Like Inviati  
    0
    Like Ricevuti  
    23
    Le Api... in particolare FindWindow (...) alla quale passi la Caption dell'applicativo ed il class name del server di Automazione Excel.
    Questo il modo migliore.
    ℹ️ Leggi di pi su @Alex ...

  3. #3
    Caiannow non  in linea Novello
    Post
    32
    Like Inviati  
    0
    Like Ricevuti  
    0
    Scusa la mia ignoranza ma come se mi avessi parlato in cirillico! Riusciresti a spiegarti meglio?

  4. #4
    L'avatar di Zer0Kelvin
    Zer0Kelvin non  in linea Scolaretto
    Post
    300
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao a tutti.
    Il suggerimento di @Alex l'unico valido nel caso che il file sia aperto in una istanza separata di Excel, altrimenti hai almeno due opzioni:
    1) utilizzare On Error in maniera appropriata (dal codice postato non sembra sia cos)
    2) ciclare tutti i woorkbooks (o le windows se preferisci)
    Per quanto riguarda l'On Error, in generale l'utilizzo del Goto rende il codice poco chiaro e poco gestibile. e comunque dopo l'utilizzo, l'On Error va disabilitato, altrimenti andr a coprire altri errori che non vorremmo coprire,con conseguenze imprevedibili.
    Io opterei per qualcosa del genere:
    Option Explicit '<==== dichiarazione obbligatoria delle variabili
    
    Sub ProjectRun()
    Dim wk As Workbook, found As Boolean
    '...........
    found = False
    For Each wk In Workbooks
        If wk.Name = windname Then
            found = True
            wk.Close
            Exit For
        End If
    Next wk
    If Not found Then
    '....
    Else
    'Run:
    '    If....
    '    ......
    '    .....
    '    macro
    '    ....
    '    .....
    '
    '    End If
    End If
    End Sub
    
    Altra piccola pecca, hai utilizzato una parola riservata (RUN) come nome per un'etichetta; non si pu fare.
    Al posto di Windows(xxxx).Close, puoi usare Workbooks(xxxx).Close (come ho fatto io)
    Ultima modifica di Zer0Kelvin; 09-02-2014 03:55 
    ℹ️ Leggi di pi su Zer0Kelvin ...

  5. #5
    Caiannow non  in linea Novello
    Post
    32
    Like Inviati  
    0
    Like Ricevuti  
    0
    Intanto grazie della risposta, ma ho qualche punto non proprio chiaro!
    Cosa intendi per disabilitare l'On Error? Una volta che una macro finisce non si disabilita da solo?
    Il tuo codice mi funziona per met ossia funziona quando c' una finestra con il nome che cerco aperta, me la chiude e poi parte con la macro, ma non funziona se non trova niente, continua ad eseguire il ciclo For Each wk praticamente all'infinito e se vado con il mouse sopra wk mi dice che <nothing>.
    Come vuoi scrivere il ciclo If not found, non ho capito?
    Scusa la mia ignoranza!

  6. #6
    L'avatar di @Alex
    @Alex non  in linea Moderatore Globale
    Post
    16,803
    Like Inviati  
    0
    Like Ricevuti  
    23
    Quote Originariamente inviato da Caiannow Visualizza il messaggio
    Scusa la mia ignoranza ma come se mi avessi parlato in cirillico! Riusciresti a spiegarti meglio?
    Credo che questo argomento possa essere un p fuori dagli standard del VBA di Excel, e per questo forse fuori anche dalla portata di molti...

    In sostanza se hai un'istanza separata di EXCEL non puoi usare l'automazione di EXCEL interna per provare a discriminarne l'esistenza... quindi hai 2 MODI:
    1) API, sono Funzioni del S.O. ma sono pi complesse da usare e meno gestibili, oltre che richiedere una formazione pi approfondita...
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
    	
    	
    Dim hWndParent 			As Long
    Dim sParentClassName 	As String
    Dim sWindowName			As String
    
    sParentClassName = "XLMAIN"
    sWindowName="Caption Name dell'Istanza..."
    
    hWndParent = FindWindow(sParentClassName, sWindowName)
    ' se il valore di hWndParent = 0 significa che non ha trovato un'istanza...
    
    Non sono certo tuttavia che sia corretto, probabilmente potrebbe richiedere l'uso di FindWindowEX, anche in merito al Fatto che EXCEL suppota pi Document... quindi potrebbe essere necessario ITERARE i ChildWindows e cercare quello specifico all'interno dell'istanza... il tutto molto pi complesso...!

    2)Puoi usare GETOBJECT per cercare di RECUPERARE l'istanza del Server di Automazione assegnandola cos ad un'Oggetto EXCEL, se non ricevi errore significa che aperta, altrimenti no...
    Const ERR_APP_NOTRUNNING As Long = 429
    Dim xlsAPP as Object
    Set xlsApp = GetObject("C:\NomeFile.xls")
    If Err = ERR_APP_NOTRUNNING Then
       MsgBox "L'ISTANZA NON ESISTE"
       ' Esci o fai quello che serve...
    End If
    
    Ora comprendo che di tutto questo ti sar difficile apprezzarne i contenuti... ma un p di sofferenza ci deve pur essere...
    ℹ️ Leggi di pi su @Alex ...

  7. #7
    Caiannow non  in linea Novello
    Post
    32
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Credo che questo argomento possa essere un p fuori dagli standard del VBA di Excel, e per questo forse fuori anche dalla portata di molti...

    Ora comprendo che di tutto questo ti sar difficile apprezzarne i contenuti... ma un p di sofferenza ci deve pur essere...
    Si si certo! Non ti preoccupare!
    Sicuramente mi hai dato alcune cose da imparare!

    Io per ora l'ho risolto come suggerito da ZeroKelvin, sembra il metodo pi semplice sembra pure funzionare

    Sub Project()
    
    On Error GoTo capp
    
     With Application
            .ScreenUpdating = False
            .Calculation = xlManual
     End With
    
    windname = Range("C3")
    
    found = False
    For Each wk In Workbooks
        If wk.name = windname Then
            found = True
            wk.Close
            Exit For
        End If
    Next wk
    
    If altri controlli
    ....
    macro
    ....
    End If
    
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
    Exit Sub
    
    'error
    capp:
        With Application
            .ScreenUpdating = True
            .Calculation = xlAutomatic
             MsgBox ("Error" & vbLf & _
             "Check inserted data"), vbExclamation
        End With
    
    End Sub
    
    Mi consigli di provare il tuo (magari il secondo metodo) perch potrei avere problemi?

  8. #8
    L'avatar di @Alex
    @Alex non  in linea Moderatore Globale
    Post
    16,803
    Like Inviati  
    0
    Like Ricevuti  
    23
    Usa quello che comprendi e che funziona, se sei in SINGOLA ISTANZA questo va pi che bene.
    ℹ️ Leggi di pi su @Alex ...

  9. #9
    Caiannow non  in linea Novello
    Post
    32
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ok, ultimo dubbio da nabbo, ho cercato di capire cos' un istanza ma non ce l'ho fatta! Mi chiarisci quest'ultimo punto? In che caso ne avrei pi di una?

  10. #10
    L'avatar di Zer0Kelvin
    Zer0Kelvin non  in linea Scolaretto
    Post
    300
    Like Inviati  
    0
    Like Ricevuti  
    0
    Provo a spiegare con un esempio:
    - vai sul menu Start -> tutti iProgrammi -> Microsoft Office, e clicca su Excel.
    Sulla barra delle applicazioni c' ora una icona di Excel.
    - ripeti menu Start -> tutti iProgrammi -> Microsoft Office, e clicca su Excel.
    Sulla barra delle applicazioni ci dovrebbero (dipende dalle impostazioni della barra applicazioni) essere ora due icone di Excel.
    Si tratta di due copie dello stesso programma (Excel appunto) completamente indipendenti l'una dall'altra.
    Stessa cosa, per esempio, se tu apri prima una finestra di esplora risorse sul disco C, e poi un'altra finestra del disco D.
    Le due finestre di Esplora Risorse sono due Istanze separate ed indipendenti dello stesso programma (in questo caso Esplora risorse appunto).
    Se invece aprissimo, cliccandoci su , XYX.xls e dopo aprissimo ABC.xls, i due files verranno aperti nella stessa Istanza di Excel.
    Avremo UNA sola finestra (Istanza) di Excel con dentro due "sottofinestre" (le window dei workbook) una per ciascun file aperto.

    Spero sia chiaro
    ℹ️ Leggi di pi su Zer0Kelvin ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 10
    Ultimo Post: 24-05-2017, 12:50
  2. [Vb2010+] Finestra Controllo immediato
    Da glak nel forum Visual Basic .Net
    Risposte: 8
    Ultimo Post: 18-08-2013, 19:35
  3. Risolto: [VB2010] problema con debug - finestra di controllo immediato
    Da imbranato nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 09-04-2012, 20:12
  4. Sapere da quale controllo stata avviata una finestra
    Da Frosty nel forum Visual Basic .Net
    Risposte: 6
    Ultimo Post: 23-03-2008, 17:06
  5. Risposte: 0
    Ultimo Post: 17-10-2007, 23:43