Risultati da 1 a 7 di 7

Discussione: Aprire file esterno senza eseguire Workbook_Open



  1. #1
    L'avatar di nessi
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Milano
    Età
    53
    Messaggi
    153
    Versione Office
    2013/2016
    Likes ricevuti
    3
    Likes dati
    32

    Aprire file esterno senza eseguire Workbook_Open

    Ciao a tutti.
    ho un file (A.xlsm) che contiene una macro che apre un file esterno (B.xlsm) per prelevare dei dati in un foglio di B.xlsm ed aggiornare una tabella in A.xlsm.
    Il mio problema è che in B.xlsm, all'avvio si attiva automaticamente una userform che, che di fatto mi blocca l'esecuzione dell'importazione dei dati.
    Per aprire il file esterno uso questa istruzione eseguita nel file A.xlsm:

    Codice: 
    Workbooks.Open Filename:="C:\Users\pippo\Documents\USP\B.xlsm", ReadOnly:=True
    Come posso aprire il file B.xlsm senza eseguire il Workbook_Open?

    Una volta prelevati i dati necessari ho bisogno che il file B.xlsm sia chiuso senza salvare eventuali modifiche accidentali occorse.

    Come sempre, grazie in anticipo, anche solo per l'attenzione.

  2. #2
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    937
    Versione Office
    2010
    Likes ricevuti
    128
    Likes dati
    1

    Re: Aprire file esterno senza eseguire Workbook_Open

    prova questa
    Codice: 
    Sub ReadClosedFile()
        GetValuesFromAClosedWorkbook "C:\Users\pippo\Documents\USP", "B.xlsm",  "Foglio1", "A1:G5"
    End Sub
    
    Sub GetValuesFromAClosedWorkbook(fPath As String, fName As String, shName, cellRange As String)
        With ActiveSheet.Range(cellRange)
           .FormulaArray = "='" & fPath & "\[" & fName & "]" & shName & "'!" & cellRange
           .Value = .Value
        End With
    End Sub
    oppure

    Codice: 
    Sub read_closed()
    Dim sPath As String, sFile As String, s As String
        sPath = "C:\Users\pippo\Documents\USP\"
        sFile = "B.xlsm"
        
        s = "'" & sPath & "[" & sFile & "]Foglio1'!R1C1" ' solo con RC
        a1 = ExecuteExcel4Macro(s) ' contenuto della cella A1
    End Sub

  3. #3
    L'avatar di nessi
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Milano
    Età
    53
    Messaggi
    153
    Versione Office
    2013/2016
    Likes ricevuti
    3
    Likes dati
    32

    Re: Aprire file esterno senza eseguire Workbook_Open

    Grazie Patel!
    Ho fatto alcune prove ma non riesco ad utilizzare quanto mi hai consigliato.
    E' meglio che pubblichi un file di esempio perchè l'estrazione dei dati da B è complicata da una serie di operazioni conseguenti.
    Però ho bisogno di qualche minuto per editare i dati sensibili.

  4. #4
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    499
    Versione Office
    2003-2010-2016
    Likes ricevuti
    298
    Likes dati
    39

    Re: Aprire file esterno senza eseguire Workbook_Open

    Una possibile alternativa alla soluzione proposta da patel:
    Codice: 
    Application.EnableEvents = False
    Workbooks.Open Filename:="C:\Users\pippo\Documents\USP\B.xlsm", ReadOnly:=True
    '
    'altro tuo codice
    '
    Workbooks("B.xlsm").Close False        'Chiude senza salvare
    Application.EnableEvents = True
    Application.EnableEvents = False iniziale impedisce l'esecuzione della macro di WorkbookOpen; obbligatorio ripristinare Application.EnableEvents = True, ad esempio dopo aver completato l'importazione (per bloccare altre eventuali macro di evento esistenti nel file che viene aperto; ma anche nel file gia' aperto!)

    Ciao

  5. #5
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    72
    Messaggi
    937
    Versione Office
    2010
    Likes ricevuti
    128
    Likes dati
    1

    Re: Aprire file esterno senza eseguire Workbook_Open

    Citazione Originariamente Scritto da nessi Visualizza Messaggio
    ..... l'estrazione dei dati da B è complicata da una serie di operazioni conseguenti.
    allora ti conviene la soluzione di Anthony

  6. #6
    L'avatar di nessi
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Milano
    Età
    53
    Messaggi
    153
    Versione Office
    2013/2016
    Likes ricevuti
    3
    Likes dati
    32

    Re: Aprire file esterno senza eseguire Workbook_Open

    Grazie Antony e Patel, in allegato i due file di esempio.
    Ho risolto con le info di Antony.
    Perdonate l'abominio della composizione delle istruzioni ma ... come sapete, le mie conoscenze di più non mi hanno concesso.
    Comunque funziona bene.
    Grazie ancora.

    Codice: 
    Sub AggiornaA()
    
    'pulisco foglio Registro
        Cells.Select
        Selection.Delete Shift:=xlUp
        
    'apro file B
        Application.EnableEvents = False
        Workbooks.Open Filename:="C:\Users\pippo\Downloads\B.xlsm", ReadOnly:=True
    
    
    'copio i dati da REGISTRO colonne A:AA
        Sheets("REGISTRO").Select
        Range("A:AA").Select
        Selection.Copy
    
    
    'attivo il file A
        Windows("A.xlsm").Activate
    
    
    'incollo i valori copiati
        Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        
    ur = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
    
    
    'cancello le colonne A:G
    Range("A:G").Select
    Selection.Delete
    Range("A1:T1").Select
        Selection.ClearContents
        Range("A1").Select
    Range("A1") = "Numero"
    
    
    'Cancello le celle vuote
    ActiveSheet.Range("A1:AA" & ur).Select
        Selection.SpecialCells(xlCellTypeBlanks).Select
        Selection.Delete Shift:=xlUp
        Range("A1").Select
    
    
    'accodo tutti i dati contenuti nelle colonne B:T in colonna A
        ActiveSheet.UsedRange.Columns("B:B").Select
    Selection.Cut
    Range("A1").End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
    ActiveSheet.Paste
        ActiveSheet.UsedRange.Columns("C:C").Select
        Selection.Cut
        Range("A1").End(xlDown).Select
        ActiveCell.Offset(1, 0).Select
        ActiveSheet.Paste
            ActiveSheet.UsedRange.Columns("D:D").Select
            Selection.Cut
            Range("A1").End(xlDown).Select
            ActiveCell.Offset(1, 0).Select
            ActiveSheet.Paste
                ActiveSheet.UsedRange.Columns("E:E").Select
                Selection.Cut
                Range("A1").End(xlDown).Select
                ActiveCell.Offset(1, 0).Select
                ActiveSheet.Paste
                    ActiveSheet.UsedRange.Columns("F:F").Select
                    Selection.Cut
                    Range("A1").End(xlDown).Select
                    ActiveCell.Offset(1, 0).Select
                    ActiveSheet.Paste
                        ActiveSheet.UsedRange.Columns("G:G").Select
                        Selection.Cut
                        Range("A1").End(xlDown).Select
                        ActiveCell.Offset(1, 0).Select
                        ActiveSheet.Paste
                            ActiveSheet.UsedRange.Columns("H:H").Select
                            Selection.Cut
                            Range("A1").End(xlDown).Select
                            ActiveCell.Offset(1, 0).Select
                            ActiveSheet.Paste
                                ActiveSheet.UsedRange.Columns("I:I").Select
                                Selection.Cut
                                Range("A1").End(xlDown).Select
                                ActiveCell.Offset(1, 0).Select
                                ActiveSheet.Paste
                                    ActiveSheet.UsedRange.Columns("J:J").Select
                                    Selection.Cut
                                    Range("A1").End(xlDown).Select
                                    ActiveCell.Offset(1, 0).Select
                                    ActiveSheet.Paste
                                        ActiveSheet.UsedRange.Columns("K:K").Select
                                        Selection.Cut
                                        Range("A1").End(xlDown).Select
                                        ActiveCell.Offset(1, 0).Select
                                        ActiveSheet.Paste
                                            ActiveSheet.UsedRange.Columns("L:L").Select
                                            Selection.Cut
                                            Range("A1").End(xlDown).Select
                                            ActiveCell.Offset(1, 0).Select
                                            ActiveSheet.Paste
                                                ActiveSheet.UsedRange.Columns("M:M").Select
                                                Selection.Cut
                                                Range("A1").End(xlDown).Select
                                                ActiveCell.Offset(1, 0).Select
                                                ActiveSheet.Paste
                                                    ActiveSheet.UsedRange.Columns("N:N").Select
                                                    Selection.Cut
                                                    Range("A1").End(xlDown).Select
                                                    ActiveCell.Offset(1, 0).Select
                                                    ActiveSheet.Paste
                                                        ActiveSheet.UsedRange.Columns("O:O").Select
                                                        Selection.Cut
                                                        Range("A1").End(xlDown).Select
                                                        ActiveCell.Offset(1, 0).Select
                                                        ActiveSheet.Paste
                                                            ActiveSheet.UsedRange.Columns("P:P").Select
                                                            Selection.Cut
                                                            Range("A1").End(xlDown).Select
                                                            ActiveCell.Offset(1, 0).Select
                                                            ActiveSheet.Paste
                                                                ActiveSheet.UsedRange.Columns("Q:Q").Select
                                                                Selection.Cut
                                                                Range("A1").End(xlDown).Select
                                                                ActiveCell.Offset(1, 0).Select
                                                                ActiveSheet.Paste
                                                                    ActiveSheet.UsedRange.Columns("R:R").Select
                                                                    Selection.Cut
                                                                    Range("A1").End(xlDown).Select
                                                                    ActiveCell.Offset(1, 0).Select
                                                                    ActiveSheet.Paste
                                                                        ActiveSheet.UsedRange.Columns("S:S").Select
                                                                        Selection.Cut
                                                                        Range("A1").End(xlDown).Select
                                                                        ActiveCell.Offset(1, 0).Select
                                                                        ActiveSheet.Paste
                                                                            ActiveSheet.UsedRange.Columns("T:T").Select
                                                                            Selection.Cut
                                                                            Range("A1").End(xlDown).Select
                                                                            ActiveCell.Offset(1, 0).Select
                                                                            ActiveSheet.Paste
    'Ordino in senso crescente colonna A
    Columns("A:A").Select
        ActiveWorkbook.Worksheets("Registro").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Registro").Sort.SortFields.Add Key:=Range("A2:A3000" _
            ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Registro").Sort
            .SetRange Range("A1:A3000")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    
    
    'Chiudo file B senza salvarlo
        Range("A1").Select
    Workbooks("B.xlsm").Close False        'Chiude senza salvare
    Application.EnableEvents = True
        Windows("A.xlsm").Activate
    End Sub
    File Allegati File Allegati
    • Tipo File: xlsm A.xlsm (31.1 KB, 6 Visualizzazioni)
    • Tipo File: xlsm B.xlsm (40.3 KB, 3 Visualizzazioni)

  7. #7
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    1741
    Versione Office
    office pro 2010
    Likes ricevuti
    374
    Likes dati
    206

    Aprire file senza macro da VBA: Application.AutomationSecurity

    Application.AutomationSecurity = msoAutomationSecurityForceDisable

    Proprio oggi ho scoperto questo bellissimo comando perchè dovevo poter aprire un file senza rotture di scatole

    L' ho utilizzato in questo contesto:

    Codice: 
        With Application.FileDialog(msoFileDialogOpen)
            .AllowMultiSelect = False
            .Show
            If .SelectedItems.Count > 0 Then
                'Disabilitazione delle macro
                Dim StatoSicurezza As Integer
                StatoSicurezza = Application.AutomationSecurity
                Application.AutomationSecurity = msoAutomationSecurityForceDisable
                
                'Eliminazione del messaggio di file aperto
                Application.DisplayAlerts = False
                    Dim FileDaAprire As Workbook
                        Set FileDaAprire = Workbooks.Open(.SelectedItems.Item(1))
                Application.AutomationSecurity = StatoSicurezza
                Application.DisplayAlerts = True
            End If
        End With

  8. I seguenti 2 utenti hanno dato un "Like" a dracoscrigno per questo post:


Discussioni Simili

  1. [Risolto] Aprire in automatico user form senza uso vba
    Di teudis nel forum Domande su Excel VBA e MACRO
    Risposte: 20
    Ultimo Messaggio: 03/01/17, 15:03
  2. Attivare macro senza aprire Excel
    Di givi79 nel forum Domande su Excel VBA e MACRO
    Risposte: 5
    Ultimo Messaggio: 30/12/16, 13:22
  3. Salvare dati su file esterno senza aprire il file di destinazione
    Di Vincenzo Damiani nel forum Domande su Excel VBA e MACRO
    Risposte: 17
    Ultimo Messaggio: 19/11/16, 07:28
  4. Eseguire codice in base all'utente che apre il file
    Di Giuspy82 nel forum Domande su Excel VBA e MACRO
    Risposte: 3
    Ultimo Messaggio: 07/09/16, 10:28
  5. Risposte: 4
    Ultimo Messaggio: 17/06/16, 19:03

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •