[RISOLTO] Stesso codice risultato diverso

di Azucarea il
11 risposte

Ho ereditato un grosso database, col tempo ho fatto delle modifiche adattandolo alle mie esigenze. Grazie a questo ho pure cominciato ad approcciare col VBA, ma mi trovo in un caso che va fuori dalle mie competenze.

Uso più o meno lo stesso codice (cambia solo il nome del file che deve aprire ed ovviamente il nome delpulsante) su 2 maschere diverse dello stesso database:

Private Sub Btn_pulsante_Click()
   mdir = CurrentProject.Path
   DoCmd.OutputTo acOutputQuery, "Miaquery", "*.xlsx", mdir & "\StUn\StUnCS.XLSX"
   Set objshell = CreateObject("Shell.Application")
   mpat = mdir & "\StUn\Miofile.docx"
   objshell.Open mpat
  Exit_Btn_MalattiaMinSingola_Click:
   DoCmd.Close acForm, "Maschera1 800x600"
   Exit Sub
Err_Btn_MalattiaMinSingola_Click:
   MsgBox Err.Description
   Resume Exit_Btn_MalattiaMinSingola_Click
End Sub

In una maschera fila tutto liscio, nell'altra invece mi appaiono degli errori che dicono che sia “mdir” che “objshell” non sono definite.
Nella prima maschera non le avevo definite e funzionavano tranquillamente, anzi pensavo fossero una sorta di variabili d'ambiente.
Perché mi succede ciò e come dovrei definirle?

11 Risposte

  • Le variabili mdir e mpath sono stringhe quindi evidentemente

    Dim mdir As String

    Dim mpat As String

    L'altra è un oggetto quindi

    Dim objshell As Object

    Dovresti leggere qualcosa sulle basi del VBA per essere indipendente su queste problematiche di base

  • 26/11/2023 - Azucarea ha scritto:


    mi appaiono degli errori che dicono che sia “mdir” che “objshell” non sono definite

    Vuoi vedere che nel modulo della prima maschera non c'è all'inizio Option Explicit mentre nel secondo, quello che dà errore, c'è?

    Ecco che fare quanto ha detto Oregon diventa inevitabile: sempre Option Explicit all'inizio di ogni modulo.

  • 26/11/2023 - oregon ha scritto:


    Dovresti leggere qualcosa sulle basi del VBA per essere indipendente su queste problematiche di base

    Intanto volevo rigraziarvi per le vostre preziose risposte, ho scritto all'inizio che mi sono appena approcciato col VBA, inoltre non ho mai imparato professionalmente un linguaggio di programmazione, se non a livello amatoriale di principiante autodidatta di vecchi linguaggi ormai vetusti (tipo il Basic del Commodore 64 (non visual basic), Pascal, DOS, ecc…, però imparo facilmente per intuizione.

    26/11/2023 - Philcattivocarattere ha scritto:


    26/11/2023 - Azucarea ha scritto:


    mi appaiono degli errori che dicono che sia “mdir” che “objshell” non sono definite

    Vuoi vedere che nel modulo della prima maschera non c'è all'inizio Option Explicit mentre nel secondo, quello che dà errore, c'è?

    Proprio così, hai azzeccato! In una c'è all'inizio Option Explicit mentre nell'altra no. Inoltre c'è anche Option Compare Database.

    26/11/2023 - oregon ha scritto:


    Le variabili mdir e mpath sono stringhe quindi evidentemente

    Dim mdir As String

    Dim mpat As String

    L'altra è un oggetto quindi

    Dim objshell As Object

    Le prime 2 hanno funzionato, la terza non dà alcun effetto, dovrebbe far aprire un file dopo le istruzioni successive

  • 27/11/2023 - Azucarea ha scritto:


    la terza non dà alcun effetto, dovrebbe far aprire un file dopo le istruzioni successive

    L'ultima Dim serve per la variabili objshell ed è necessaria. Se non vedi il file, probabilmente il percorso o il nome sono sbagliati.

    Controlla il contenuto di mpat prima della Open. Magari aggiungi un

    MsgBox mpat

    prima della Open per controllare effettivamente percorso e nome di file

  • Il percorso coincide tant'è vero che se tolgo Option Explicit e elimino le dichiarazioni delle variabili si apre tranquillamente, confermato anche dall'istruzione che mi hai fatto aggiungere.
    Può darsi sbaglio a la posizione della dichiarazione, ma ho provato ad inserire tutte e 3 sia all'inizio (subito dopo Private Sub Btn_pulsante_Click() ), sia prima di ogni istruzione relativa.

  • Però ho fatto la prova a sostistuire l'intero percorso ad mpat in 

    objshell.Open mpat

    ed ha funzionato. Eppure ho controllato più volte il percorso ed è lo stesso, non è che bisogna dichiarare la variabile mpat in modo diverso prima dell'apertura?

  • 27/11/2023 - Azucarea ha scritto:


    l'intero percorso

    contiene forse caratteri particolari (non vietati, ovviamente), spazi o si tratta di uno di quei percorsi che sono Windows riesce a capire? (in esplora file scrivi Programmi ed è Programs o Programs (x86) in riga comandi, stessa cosa per Utenti con Users… ecco perché io metto tutto in una directory normale).

  • Nel codice manca anche la On Error (altrimenti a che serve la gestione errori ?)

    Dovrebbe essere questo

    Private Sub Btn_pulsante_Click()
      Dim mdir As String
      Dim mpat As String
      Dim objshell As Object
      
      On Error GoTo Err_Btn_MalattiaMinSingola_Click:
    
      mdir = CurrentProject.Path
      DoCmd.OutputTo acOutputQuery, "Miaquery", "*.xlsx", mdir & "\StUn\StUnCS.XLSX"
      Set objshell = CreateObject("Shell.Application")
      mpat = mdir & "\StUn\Miofile.docx"
      objshell.Open (mpat)
    
    Exit_Btn_MalattiaMinSingola_Click:
      Set objshell = Nothing
      DoCmd.Close acForm, "Maschera1 800x600"
      Exit Sub
      
    Err_Btn_MalattiaMinSingola_Click:
      MsgBox Err.Description
      Resume Exit_Btn_MalattiaMinSingola_Click      
    End Sub
  • 27/11/2023 - oregon ha scritto:


    On Error GoTo Err_Btn_MalattiaMinSingola_Click:

    Si, grazie dev'essersi persa durante le varie prove.

    27/11/2023 - Philcattivocarattere ha scritto:


    27/11/2023 - Azucarea ha scritto:


    l'intero percorso

    contiene forse caratteri particolari (non vietati, ovviamente), spazi o si tratta di uno di quei percorsi che sono Windows riesce a capire? (in esplora file scrivi Programmi ed è Programs o Programs (x86) in riga comandi, stessa cosa per Utenti con Users… ecco perché io metto tutto in una directory normale).

    caratteri particolari no, spazi sì ed anche una cartella dal nome lungo composto da 3 parole. Ho provato a fare una copia di tutti i file in C (quindi senza spazi), ma non funziona lo stesso

  • 27/11/2023 - Azucarea ha scritto:


    Si, grazie dev'essersi persa durante le varie prove.

    Ma hai provato il codice che ti ho indicato? 

    Non hai detto nulla …

  • 27/11/2023 - oregon ha scritto:


    27/11/2023 - Azucarea ha scritto:


    Si, grazie dev'essersi persa durante le varie prove.

    Ma hai provato il codice che ti ho indicato? 

    Non hai detto nulla …

    Grazie! Ha funzionato! Pensavo avessi aggiunto solo la stringa per l'errore e nient'altro invece adesso mi sono accorto di mpat tra parentesi (mpat) ed ha funzionato.

    Stavo per scrivere che aveva funzionato anche scrivendo:

    objshell.Open CurrentProject.Path & "\StUn\Miofile.docx"

     Altra aggiunta notata:

    Set objshell = Nothing
Devi accedere o registrarti per scrivere nel forum
11 risposte