Trasmigrazione macro da excel ad access

di il
11 risposte

Trasmigrazione macro da excel ad access

Buongiorno a tutti,

sono nuovo del Forum e mi presento.

Sono Lorenzo e neofita ...vengo dal mondo excel e cerco di riprodurre un archivio in un db access con chiari problemi di traduzione.

In particolare, avevo una macro in excel che funzionava alla grande con lo scopo di creare una cartella in una directory con i nomi di tre celle e che al tempo stesso mi creava un collegamento ipertestuale alla stessa cartella su di una cella. Purtroppo ho dovuto lasciare excel in quanto la funzione di creare il collegamento ipertestuale non poteva essere utilizzata in condivisione (cosa per me necessaria). Ho provato quindi a sostituire il tutto in db access... posizionata nel VBA di access non riesco a tradurla (ovviamente per mancanza di conoscenze....). La cartella dovrebbe essere creata con i nomi di tre campi di una Maschera che cambia ad ogni inserimento di un record..,.

Potreste darmi una mano ?

Grazie mille

nel seguito il codice excel
Sub CreaCartella()
Dim Cartella As String
Dim FileSystemObj
Set FileSystemObj = CreateObject("Scripting.FileSystemObject")
Cartella = "\\Ls420dbb7\studio\ARCHIVIO PRATICHE\" & Range("Scheda!C7") & " " & Range("Scheda!D7") & " " & Range("Scheda!E7")
If Not FileSystemObj.folderExists(Cartella) Then
    FileSystemObj.CreateFolder Cartella
    MsgBox "Attenzione: E' stata creata la nuova Cartella " & Range("F1") & " nella Directory \\Ls420dbb7\studio\ARCHIVIO PRATICHE", vbInformation, "Avviso"
Else
MsgBox "Attenzione: La Cartella " & Range("F1") & " esiste già!", vbInformation, "Avviso"
End If
Sheets("Archivio").Select
uRiga = Range("E" & Rows.Count).End(xlUp).Row
Cells(uRiga, "E").Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="\\Ls420dbb7\studio\ARCHIVIO PRATICHE\" & Range("Scheda!C7") & " " & Range("Scheda!D7") & " " & Range("Scheda!E7")
End Sub

11 Risposte

  • Re: Trasmigrazione macro da excel ad access

    LorenzoS ha scritto:


    In particolare, avevo una macro in excel che funzionava alla grande con lo scopo di creare una cartella in una directory con i nomi di tre celle e che al tempo stesso mi creava un collegamento ipertestuale alla stessa cartella su di una cella.
    Per come sono abituato a pensare queste cose in Access io, preferirei ragionare un passo alla volta. Provo a sintetizzare qualcosa, ma occorre una analisi completa della situazione con tutti i nomi propri dei campi e come vuoi sfruttarli in ambiente normalizzato tipico di Access e dei database.
    1. Per creare una cartella esiste il comando MkDir
    https://www.techonthenet.com/access/functions/file/mkdir.php
    2. Va detto pure che, prima di crearla, dovresti controllare se esiste già prima con Dir
    https://support.office.com/it-it/article/funzione-dir-1a1a4275-f92f-4ae4-8b87-41e4513bba2e
    3. Per richiamare un file in una directory, piuttosto di usare un collegamento ipertestuale, si preferisce un campo di tipo Testo breve (a 255 caratteri) e l'istruzione VBA (di solito si preferisce l'evento Doppio-Clic sul campo stesso) Application.FollowHyperlink
    https://docs.microsoft.com/en-us/office/vba/api/access.application.followhyperlink
  • Re: Trasmigrazione macro da excel ad access

    Ciao Osvaldo e grazie...
    volevo chiederti a tale proposito (in ordine) due cose:

    1) come devo inserire il comando MKdir ? creo una macro e la inserisco tra Function e Function end ? perché poi mi serve da utilizzare con un pulsante (e quindi Macro + EseguiCodice + Funzione)
    2) quale è la sintassi per creare la cartella con i nomi di tre campi che si chiamano Riferimento Numero e Anno ?

    In realtà una modifica l'avevo fatta per la macro excel da utilizzare con access ma mi crea una cartella con i nomi Riferimento Numero Anno e non con il testo contenuto dentro ai campi...

    eccola qui
    Function CreaCartella()
    Set FileSystemObj = CreateObject("Scripting.FileSystemObject")
    Cartella = "\\Ls420dbb7\studio\ARCHIVIO PRATICHE\"
    If Not FileSystemObj.folderExists(Cartella) Then
        FileSystemObj.CreateFolder Cartella
        MsgBox "Attenzione: E' stata creata la nuova Cartella " & Riferimento & " " & Numero & " " & Anno & " nella Directory \\Ls420dbb7\studio\ARCHIVIO PRATICHE", vbInformation, "Avviso"
    Else
    MsgBox "Attenzione: La Cartella " & "Riferimento" & " " & "Numero" & " " & "Anno" & " esiste già!", vbInformation, "Avviso"
    End If
    End Function
    Grazie
  • Re: Trasmigrazione macro da excel ad access

    Occorre fare alcune precisazioni.
    1. Excel e Access hanno 2 logiche completamente diverse. Quello che vedi (righe e colonne) in Excel non è detto che ha lo stesso significato in Access. Spero questo tu lo sappia.
    2. Le sintassi "codice" di Excel e Access sono pure spesso diverse.
    3. Tu usi spesso la parola "macro". Questa parola è spesso fraintesa nelle varie applicazioni di Microsoft Office. In Word e Excel (per esempio) esistono i "registratori di macro" che poi sviluppano "qualcosa" (uso il termine qualcosa perché non ne sono pratico) che "diventa" codice in Visual Basic (VBA). Di solito si usa fare così. Questa roba qua si chiama "macro".
    Ma in Access occorre fare una chiara distinzione tra "macro" e "codice VBA" (almeno da un punto di vista ESTERIORE). In Access non esiste il registratore di macro (oppure io non l'ho mai fatto), le devi impostare tu. Le macro di Access non APPAIONO come codice VBA "subito"...volendo ci sono le traduzioni successive in VBA. In Access il codice VBA va scritto/studiato manualmente nella apposita finestra di sviluppo VBA.

    Dopo di che, se vuoi supporto in questa sezione del forum (Access) devi fornire:
    - nomi propri di tutte le tabelle che entrano in gioco
    - nomi propri di tutti i loro campi con indicazione della chiave primaria
    - le relazioni
    - nomi propri di maschere
    - rispiegare quello che devi fare usando i nomi propri
    Per i primi 3 punti puoi anche allegare una immagine della Finestra Relazioni
  • Re: Trasmigrazione macro da excel ad access

    Lorenzo, a parte la questione di usare e privilegiare le funzioni NATIVE del VBA rispetto a librerie esterne... perchè devi creare delle CARTELLE per un nome del campo...?

    Molti utenti non abituati ad usare Database, confondono l'esigenza di ORGANIZZAZIONE DI ARCHIVIO con una ingnegneria di un Database...!

    Usando un Database... non si crea MAI una struttura Gerarchica di Cartelle per archiviazione... si sfrutta il Database e l'interfaccia utente abbandonando il problema del Percorso.
  • Re: Trasmigrazione macro da excel ad access

    Grazie Osvaldo !

    Allora, dato che non riesco ad incollare le foto provvedo in scrittura:

    - nomi propri di tutte le tabelle e maschere che entrano in gioco

    ho una sola Tabella chiamata Archivio ed una sola maschera chiamata Inserimento

    - nomi propri di tutti i loro campi con indicazione della chiave primaria

    la chiave primaria è numerica (1-2-ecc quella di default in pratica) i campi si chiamano:
    Riferimento Numero Anno Comp Sin Pol Ctp Data1 Data2 Model Tipo Giorni (che è un campo calcolatore e mi calcola la differenza tra da1 e data2)

    Per quanto riguarda quello che mi occorre ....

    una volta inseriti i dati di un nuovo record nei campi della maschera (in cui sono presenti tutti i campi della tabella) vorrei ci fosse un pulsante collegato ad una macro (si dice così in questo caso ?) che mi creasse una cartella nella directory \\Ls420dbb7\studio\ARCHIVIO PRATICHE\ avente il nome dei campi Riferimento (spazio) Numero (spazio) Anno (Anno) - ad esempio GEN 125 2019 (questo è il nome di una cartella) - e poi creare un collegamento alla cartella sul corrispondente campo Sin presente nella Tabella. Sarebbe anche comodo come avevo prima un Msbox che avverte della creazione e che, se già presente, mi dice che è già presente appunto.

    Non c'è necessità di creare una cartella per tutti i RECORD già inseriti in quanto già creata mediante vecchio db excel...mi serve solo per i nuovi record che andrò a creare con la maschera Inserimento. Semmai per le cartelle già create sarebbe comodo inserire in una sola volta i collegamenti alle cartelle già presenti nei rispettivi campi Sin (ma non so se si puo fare con un unico comando).

    Ecco qui...grazie a chi può aiutarmi o almeno ci prova.

    Lorenzo
  • Re: Trasmigrazione macro da excel ad access

    @Alex ha scritto:


    Lorenzo, a parte la questione di usare e privilegiare le funzioni NATIVE del VBA rispetto a librerie esterne... perchè devi creare delle CARTELLE per un nome del campo...?

    Molti utenti non abituati ad usare Database, confondono l'esigenza di ORGANIZZAZIONE DI ARCHIVIO con una ingnegneria di un Database...!

    Usando un Database... non si crea MAI una struttura Gerarchica di Cartelle per archiviazione... si sfrutta il Database e l'interfaccia utente abbandonando il problema del Percorso.
    non ho capito cosa intendi Alex....io per cartella intendo Cartella Windows e mi serve crearla perchè poi al suo interno devo inserire dei documenti...
  • Re: Trasmigrazione macro da excel ad access

    LorenzoS ha scritto:


    ....
    non ho capito cosa intendi Alex....io per cartella intendo Cartella Windows e mi serve crearla perchè poi al suo interno devo inserire dei documenti...
    Appunto avevo visto giusto... che ti serva creare le cartelle, è frutto solo del tuo concetto di archiviazione che con un Database è ERRATO.
    Non insisto oltre.
  • Re: Trasmigrazione macro da excel ad access

    Caro Alex, non saprei proprio come conservare dei documenti per ogni specifico record senza creare delle cartelle. Ogni cartella rappresenta un recod ed al suo interno trovo i documenti corrispondenti... forse è un metodo di archiviazione obsoleto ma non ne conosco altri purtroppo.

    Se puoi aiutarmi con questo te ne sarei grato.
  • Re: Trasmigrazione macro da excel ad access

    LorenzoS ha scritto:


    - nomi propri di tutte le tabelle e maschere che entrano in gioco

    ho una sola Tabella chiamata Archivio ed una sola maschera chiamata Inserimento

    - nomi propri di tutti i loro campi con indicazione della chiave primaria

    la chiave primaria è numerica (1-2-ecc quella di default in pratica) i campi si chiamano:
    Riferimento Numero Anno Comp Sin Pol Ctp Data1 Data2 Model Tipo Giorni (che è un campo calcolatore e mi calcola la differenza tra da1 e data2)
    Questa esposizione di campi è errata secondo la LOGICA NORMALIZZATA dei database. Ritengo che quello che hai fatto è un tipico errore di chi proviene da Excel. Come ti ho già accennato le logiche delle due applicazioni sono molto diverse. E proprio la normalizzazione (tipica di Access) fa cascare l'asino a Excel.
    Per quanto tu abbia posto un quesito strettamente legato a macro--->VBA, non posso fare altro che rilevare una STRUTTURA TABELLARE NON NORMALIZZATA. Occorre PRIMA normalizzare, entrare nella logica di Access, poi implementare altri strumenti che facciano quello che tu hai in mente (ma questo viene molto molto dopo).
  • Re: Trasmigrazione macro da excel ad access

    Normalizzare in che senso ? Cosa dovrei fare ? Non possono riscrivere tutti i record partendo da una serie di tabelle ...risolta la questione della macro che cercavo (o codice VBA se preferisci) il mio lavori è utilizzabile ...però se non credete che valga la pena aiutarmi me ne faccio una ragione senza problema.
    Grazie comunque
  • Re: Trasmigrazione macro da excel ad access

    Lorenzo, io ed Osvaldo ti abbiamo dato indicazioni che sono basilari per chi lavora con i Database non si tratta di farsene una ragione o che non ne valga la pena.... ma di capire che per affrontare lo sviluppo con un database richiede delle basi ed un modo di ragionare che non è quello.che usi con Excel.
    Come possiamo secondo te aiutarti se quello che ti è stato suggerito ti suona tutto "sconoscouto"...?
    Personalmente penso ti possa essere di aiuto un corso o lo studio da zero di basi di programmazione e gestione di un db relazionale... è impossibile fare lezioni su un forum, qui possiamo aiutarti se almeno parliamo la stessa lingua...
Devi accedere o registrarti per scrivere nel forum
11 risposte