Sviluppare funzionalita su Microsoft Office con VBA Problema sul prelievo automatico di immagini in excel da trasportare in access

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 26 totali)
  • Autore
    Articoli
  • #14276 Score: 0 | Risposta

    Buongiorno, sono un nuovo iscritto.

    Ho un problema da risolvere. ho realizzato in passato un programma (di progettazione di trasformatori) in Excel 2010, contenente molte form e molto codice VBA. Adesso lo sto interfacciando con un database access. Ho risolto come prendere i dati dal programma Excel, tramite la funzione Worksheets, tramite linee di codice tipo questa:

    Tabella.Fields("nome trafo") = Worksheets("Foglio2").Range("j" & 2)

    ma, nonostante vari tentativi, non sono riuscito a trovare la funzione giusta per prelevare importanti disegni, che in programma in Excel produce (utilizzando semplici funzioni shape tipiche di Excel disegnando direttamente sul foglio di calcolo) per trasportare tali disegni dentro il database access in record tipo OLE (o tipo memo). Ho tentato ad es. con il seguente comando:

    Tabella.Fields("disegno IP00") = Worksheets("Rappresentaz. IP00").Range("D2:V5")

    ma mi da il seguente:

    "errore di run-time '3421': errore di conversione del tipo di dati"

    Se invece faccio un copia-incolla di tali disegni riesco tranquillamente a depositarli in access. Sia che il record di access è di tipo "OLE" o di tipo "memo", sembra accettarli in entrambi i casi. Questo mi dà fiducia sulla "fattibilità" in automatico. Solo non riesco a trovare il giusto comando da utilizzare e la giusta sintassi. Chiedo il vostro aiuto.

     

     

    #14295 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      238 pts

      Tieni presente che memorizzare immagini in Access appesantisce parecchio il database, sarebbe meglio avere una cartella di file separati, il cui nome (percorso e file) sono memorizzati come semplice testo in Access.

      Ciò premesso, le shapes in Excel non si puntano con il range su cui risiedono ma col loro nome e non sono sicuro che si possa fare così tranquillamente... le operazioni di copia e incolla sono diverse dal puntamento a un range e riguardano la gestione della memoria condivisa.

      Cioè mi stupirei se una cosa del genere funzionasse:

      Tabella.Fields("disegno IP00") = Worksheets("Rappresentaz. IP00").Shapes("disegno IP00")
      #14299 Score: 0 | Risposta

      francescolongo60

        Grazie carissimo Vecchio Frac della risposta e dell'importante aiuto. Purtroppo il comando da te proposto non funziona, probabilmente perché non trova il nome delle shapes che il programma Excel crea facendo questo disegno del trasformatore progettato, che risiede come detto in uno degli innumerevoli fogli del mio programma, il foglio denominato "Rappresentaz. IP00". L'errore che genera è un run time di illeggibile numero ( meno 2 miliardi ecc. ) ma con la dicitura "impossibile trovare l'elemento corrispondente al nome specificato" che è un chiaro riferimento (credo, se ho ben capito) che quelle shapes non si chiamano "disegno IP00", che è soltanto il nome del record dove voglio mettere il disegno nel database access. Forse il "programmone" (cosi viene scherzosamente denominato questo mio Excel per la progettazione di trasformatori) dovrebbe assegnare un nome alle shapes che usa mentre crea il disegno? A tutte quelle che voglio puntare si puo' dare lo stesso nome? E come fare ad assegnare un nome alle shapes? Ti ricopio un pezzetto del codice di creazione di questo "disegno" magari mi puoi indicare dove e come assegnare un nome (ammesso che sia questa la soluzione, che avrebbe anche il vantaggio di non fargli vedere cio' che non si vuole ricopiare, ad esempio non assegnandogli un nome o mettendone uno diverso, come ad es. la sagoma dell'operaio che serve come paragone per capire la grandezza del trasformatore ma che in access mi occuperebbe troppo spazio, non di memoria ma proprio di ampiezza nella finestra della maschera specie per i trasformatori piccolini). Ecco un pezzetto del codice che avevo usato a suo tempo, come detto per fargli fare questo disegno del trafo:

        If UserForm1.Rettang Then

        For H = 1 To 3
        For m = 1 To avv(K).n_tratti
        'If m > 1 Then
        ' deriva = deriva + trat_tot(K, m - 1).canale_front - trat_tot(K, m - 1).canale
        'End If
        'semilarg = trat_tot(K, m).rag_ext_spes_net - trat_tot(K, m).spes_net / 2
        'semiprof = trat_tot(K, m).rag_ext_spes_net - trat_tot(K, m).spes_net / 2 - _
        'sezion_nuclei.rag_circos + sezion_nuclei.pacco_lam / 2 + sezion_nuclei.spes_pias + sezion_nuclei.can_cen_nuc / 2 + deriva
        spessore = trat_tot(K, m).spes_net

        'curvatura = (semilarg - sezion_nuclei.rag_circos) / semilarg / 2
        ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, _
        posx - semilarg(K, m) + (H - 1) * (L_finestra + 2 * gradini(Ngrad).x), posy - semiprof(K, m), 2 * semilarg(K, m), 2 * semiprof(K, m)) _
        .Select
        Selection.ShapeRange.Adjustments.Item(1) = curvatura(K, m)
        Selection.ShapeRange.Fill.Visible = msoFalse
        With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Transparency = 0
        End With
        With Selection.ShapeRange.Line
        .Visible = msoTrue
        .Weight = spessore
        End With
        Next m, H

        If K = Val(UserForm1.N_avv) Then

        posx_rettang = posx
        'MsgBox "posizione x dell'ultimo tratto disegnato" & Str$(posx_rettang)
        posy_rettang = posy
        'MsgBox "posizione x ''''" & Str$(posy_rettang)
        semilarg_rettang = semilarg(K, m - 1) + trat_tot(K, m - 1).spes_net / 2
        'MsgBox "semilarghezza ''''" & Str$(semilarg_rettang)
        semiprof_rettang = semiprof(K, m - 1) + trat_tot(K, m - 1).spes_net / 2
        'MsgBox "semiprofondità ''''" & Str$(semiprof_rettang)
        spessore_rettang = trat_tot(K, m - 1).spes_net
        'MsgBox "spessore ultimo tratto ''''" & Str$(spessore_rettang)
        'MsgBox "nel computo non sono ancora comprese le sbarre"
        End If

        Sono molto d'accordo col discorso di mettere le immagini in un posto separato, dove access accede solo "puntando" alle medesime, per non appesantirlo. Perché anche io mi sono trovato impantanato per problemi del genere perché mi pare che Access non puo essere piu' grande di 2 giga e se metti troppe immagini all'interno si puo' riempire troppo in fretta raggiungendo appunto questa sua dimensione massima. Quindi insomma avere immagini "collegate" ma non "integrate". Ma io avrei l'esigenza di automatizzare questo processo quindi potrei, secondo te, andare a far fare al database access una copia del foglio Excel dove è disegnato il trafo, fargli aggiungere tale copia  attaccandola ad un ulteriore file Excel, dedicato ad ospitare tutte queste immagini di trasformatori di volta in volta progettati e contenuto ad es. in una cartella separata dove access puo' puntare. Ma poi access riesce facilmente a visualizzare in automatico questi fogli contenuti nel secondo Excel? E che comando dovrei utilizzare? Mi accontenterei anche solo che avviasse questo Excel facendogli mostrare il foglio giusto, non pretenderei di vedere il disegno dentro la maschera di access. Forse questa via è più facile di caricare le immagini direttamente in access. Ma richiederebbe il tuo gentile aiuto. Da solo non ci riusciro' mai. Incidentalmente ti chiedo anche se i componenti degli office attuali (io uso il 2010) contengono ancora il VBA, perché, come ben saprai non lo dicono chiaramente sulle confezioni ecc. Ma ritengo di si, riterrei assurdo che la Microsoft avesse tolto queste bellissime comodità. Pensa che avendolo chiesto ad un commesso qui di Lugano, dove vivo, del Mediamarkt non mi ha saputo rispondere se c'è o no il VBA e mi ha messo in contatto con il loro rappresentante  della Microsoft che giusto era li in quel momento e nemmeno lui di primo acchito mi ha saputo rispondere con sicurezza, salvo dopo un po' dirmi "si, ci dovrebbe essere, anche se sulla scatola non è indicato": incredibile, non lo sanno nemmeno loro. Scusa per tutte queste mie lungaggini. E spero che mi aiuterai a risolvere brillantemente il mio quesito. Colgo l'occasione per ringraziarti in anticipo e augurarti buon WE. In fede, Francesco.

        #14302 Score: 0 | Risposta

        francescolongo60

          Adesso sto tentando di costruirmi il codice per il discorso "elenco di immagini separate" aiutandomi, come sempre dite voi, col codice generato dalla registrazione di macro, provero' se funziona e poi lo posto qui e magari possiamo commentarlo assieme (se vuoi/se volete). Se invece non mi funziona, chiedero' ancora il Vs aiuto. Francesco.

          #14303 Score: 0 | Risposta

          francescolongo60

            In effetti ho messo assieme questo codice molto provvisorio ma realizza per davvero questo nuovo Excel contenente le immagini dei trasformatori, certo devo olto rifinirlo ma funziona! Ora debbo scrivere il codice in lettura, cioè access dovrebbe aprire la pagina giusta qundo si "sfoglia il catalogo dei trasformatori" e mostrare l'immagine pertinente, ma questo compito i pare piu' facile.

            Private Sub Comando2_Click()
            'Option Compare Database

            Dim DBCOrrente As DAO.Database
            Dim Tabella As DAO.Recordset
            Dim I As Long
            Dim Cella

            'Apri File Excel
            Static contatore As Long
            Workbooks.Open FileName:="c:\PROGRAMMA_DI_MEDIA\PROGRAMMA\TRAFI_DI_MEDIA_ATS_030701B.xlsm"

            'Apro la Tabella nell' ACCESS
            Set DBCOrrente = CurrentDb
            Set Tabella = DBCOrrente.OpenRecordset("descrizione trafo")

            'if tabella.Fields("id")<>
            'actual_id = Tabella.Fields("id")
            'Set Tabella = DBCOrrente.OpenRecordset("MANO D'OPERA")
            'Copio le righe del CONTROLLO nella tabella
            'I = 3
            Tabella.AddNew

            Cella = Worksheets("Foglio2").Range("F" & 1)
            MsgBox Cella

            Cella = Worksheets("Foglio2").Range("J" & 2)
            MsgBox Cella
            contatore = contatore + 1
            Tabella.Fields("nome trafo") = Worksheets("Foglio2").Range("j" & 2)
            nometrafo = Tabella.Fields("nome trafo")
            Tabella.Fields("sigla trafo") = Worksheets("Foglio2").Range("F" & 1)
            Tabella.Update

            Workbooks.Open FileName:= _
            "C:\1-AAA TMC Rebeschini\catalogo trafi BT\Elenco immagini trafi\elenco immagini trafi.xlsx"
            Windows("TRAFI_DI_MEDIA_ATS_030701B.xlsm").Activate
            Sheets("Rappresentaz. IP00").Select
            Cells.Select
            Selection.Copy
            Windows("elenco immagini trafi.xlsx").Activate
            Sheets.Add After:=Sheets(Sheets.Count)
            Sheets("Foglio4").Select
            Sheets("Foglio4").Name = nometrafo + Str$(contatore)
            'Cells.Select
            ActiveSheet.Paste
            'Application.CutCopyMode = False
            ActiveWorkbook.Save
            ActiveWorkbook.Close
            Workbooks.Close
            'Chiude l'oggetto excel.application
            MsgBox "Fine della procedura"
            End Sub

            #14315 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              238 pts

              Sei un fiume in piena 🙂

              Allora, il mio primo esempio ovviamente non poteva funzionare, era solo un esempio. Non conosco affatto la struttura del programma, dei nomi contenuti, dei riferimenti e ho solo dato un'indicazione del risultato. Ma non può e non deve funzionare: non puoi ficcare in un campo di Access una Shapes, così semplicemente.

              Su VBA non preoccuparti, c'è e ci sarà ancora per un pezzo. 

              Con l'ultimo codice tu inserisci nel db Access i nomi dei grafi?

              Se hai tutto in Excel non ho capito perchè ti serve Access. E nota, io sono un fan di Access, cioè lascerei perdere Excel fin dall'inizio 🙂

              #14320 Score: 0 | Risposta

              Grazie Vecchio Frac della risposta di oggi.

              Desidero utilizzare access, perché è un vero database con tanto di linguaggio sequel server e possibilità di imbastire complicate query, cosa che in Excel mi viene piu' difficile. D'altro canto riscrivere tutto il programmone (con le sue 800 pagine di listato) in access, sarebbe una bella idea ma se devo essere sincero non me la sento. E poi come potrei essere sicuro che tutto continuerebbe a funzionare bene come il programmone?

              Comunque ho sposato l'idea di un Excel ausiliario dove depositare le immagini raccolte, da far mostrare ad access su richiesta. La cosa sembra per fortuna voler funzionare e l'idea me l'ha data tu!

              eccoti l'attuale stato dell'arte, certo embrionale me funzionante:

              Private Sub Comando2_Click()
              'Option Compare Database

              Dim DBCOrrente As DAO.Database
              Dim Tabella As DAO.Recordset
              Dim I As Long
              Dim Cella
              'Static contatore As Long
              Workbooks.Open FileName:="c:\PROGRAMMA_DI_MEDIA\PROGRAMMA\TRAFI_DI_MEDIA_ATS_030701B.xlsm", ReadOnly:=True

              'attiva File Excel
              'Workbooks("TRAFI_DI_MEDIA_ATS_030701B.xlsm").Activate
              'Workbooks(1).Activate
              'attiva database corrente ACCESS
              Set DBCOrrente = CurrentDb
              'Apre la Tabella nell' ACCESS
              Set Tabella = DBCOrrente.OpenRecordset("descrizione trafo")

              'aggiunge nuovo record
              Tabella.AddNew
              'Worksheets("Foglio2").Activate
              'copia nella variabile cella la sigla del trafo
              Cella = Worksheets("Foglio2").Range("F" & 1)
              'mi mostra questa sigla
              MsgBox Cella
              'copia nella variabile cella il nome del trafo
              Cella = Worksheets("Foglio2").Range("J" & 2)
              'mi mostra questo nome
              MsgBox Cella
              contatore = contatore + 1
              'scrive il nome del trafo nel database
              Tabella.Fields("nome trafo") = Worksheets("Foglio2").Range("j" & 2)
              'si meorizza questo nome per usarlo tra poco
              nometrafo = Tabella.Fields("nome trafo")
              'scive la sigla del trafo nel database
              Tabella.Fields("sigla trafo") = Worksheets("Foglio2").Range("F" & 1)
              'aggiorna la tabella del database
              Tabella.Update
              'apre l'EXCEL dove vanno inserite le immagini dei trafi
              Workbooks.Open FileName:= _
              "C:\1-AAA TMC Rebeschini\catalogo trafi BT\Elenco immagini trafi\elenco immagini trafi.xlsx"
              'bisogna riattivare il programmone, perché avendo caricato un nuovo EXCEL la attivazione va a lui e quindi si perde la precedente attivazione (col tempo capiremo gli esatti meccanismi)
              Windows("TRAFI_DI_MEDIA_ATS_030701B.xlsm").Activate
              'va a selezionare il disegno del trafo
              Sheets("Rappresentaz. IP00").Select
              'seleziona tutto il foglio del disegno
              Cells.Select
              'copia la selezione
              Selection.Copy
              'pone ora l'attenzione sull'EXCEL contenente la collezione dei disegni dei trafi
              Windows("elenco immagini trafi.xlsx").Activate
              'aggiunge un foglio vuoto dopo l'ultimo li presente
              Sheets.Add After:=Sheets(Sheets.Count)
              'lo seleziona
              Sheets(Sheets.Count).Select
              'lo rinomina col nome del trafo precedentemente memorizzato
              Sheets(Sheets.Count).Name = nometrafo + Str$(contatore)
              'Cells.Select
              'vi memorizza il disegno precedentemente copiato
              ActiveSheet.Paste
              'Application.CutCopyMode = False
              'memorizza e chiude questo secono file EXCEL
              ActiveWorkbook.Save
              ActiveWorkbook.Close
              Workbooks.Close
              'mi dice che il processo è stato concluso
              MsgBox "Fine della procedura"
              End Sub

              Ci sentiamo piu' avanti con la versione definitiva, per festeggiare il conseguimento dell'obbiettivo o con altri eventuali aiutini, di cui potrei aver bisogno strada facendo. Per ora ti invio un carissimo saluto. Francesco

              #14323 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                238 pts

                In attesa degli sviluppi, mi permetto di chiudere con alcuni pensierini.

                1) In questo forum puoi inserire del codice nei post con un formato più leggibile: nell'editor dove scrivi premi il pulsante {;} che è l'ultimo della fila, quindi incollaci il tuo codice.

                Questo sarà il risultato.

                2) SQL non vuol dire "sequel (server)" ma solo "Structured Query Language", e la parola "sequel" è la traduzione parlata dell'acronimo così come la pronunciano gli anglofoni (dovrebbe essere es-kiù-el ma lo sai che fanno di tutto per distinguersi 🙂 ). "SQL Server" è il nome commerciale del prodotto che Microsoft ha introdotto diversi anni fa (nei primissimi anni Novanta) come proprio database relazionale, per fungere da database e motore di interrogazione/ricerca/inserimento dati per altri applicativi. 

                3) Fai bene a imparare il linguaggio SQL e nota che Excel lo capisce benissimo, quindi a rigore non ti serve neanche il passaggio in Access. Se hai già il mega programmone che fa tutto al 99%, allora implementagli quel restante 1% e vivi sereno con Excel mon-amour senza terzi incomodi 🙂

                #14330 Score: 0 | Risposta

                Certo, hai ragione, mi mettero' appena ho tempo. Per ora mi accontento di questa mia piccola creatura in access (catalogo trasformatori), che nel mio piccolo so abbastanza usare.

                Ti volevo chiedere una cosa. Ho riscontrato che se il "programmone è già aperto, access non riesce ad attivarlo, cioè il comando ad es.

                workbooks "programmone". activate

                 non punta a nulla. Deve aprirlo lui per avere qualcosa che gli punta. Giusto? Ho capito bene? Perché a me veniva un po' piu' comodo che access operasse mentre il programmone è aperto. Ma mi accontento lo stesso. Fa tutto in modo silente: apre, prende in dati, aggiorna l'excel di appoggio per i disegni e richiude. Si puo' fare solo cosi o esiste un modo perché "veda" il programmone, anche se questo è già stato aperto manualmente da me? Inoltre un'altra domanda: a volte (ma non sempre, ultimamente succede di meno) access lascia un Excel acceso in background (lo si vede con gestione risorse), quando la procedura che ti ho andato prima finisce. E' normale? Si puo' evitare?

                Infine: che office devo comperare (per PC) per essere sicuro che i componenti piu' importanti contengano VBA? E Office per Mac (che usa mia figlia) contiene VBA? (Sarebbe bello che anche lei ne sapesse qualcosa). Grazie in anticipo e Cari saluti. Francesco

                #14336 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  238 pts

                  francesclongo60 ha scritto:

                  Ho capito bene?

                  Se *io* ho capito quello che intendi, allora sì, *tu* hai capito bene. Cioè è Access che deve referenziare un'istanza di Excel, aprirsi il file e leggerselo. Tuttavia strettamente parlando non è neanche necessario aprire il file Excel perchè ADO con una connessione all'origine dati potrebbe fare tutte le operazioni consentite (leggi il penultimo articolo, che parla di questo, della nostra collana nel Blog dal titolo "Excel e ADO: scrittura/lettura dati da tabelle Excel"). Non sono in grado adesso di dirti se ci sono conflitti in caso di apertura contemporanea (bisognerebbe fare un test).

                  Però con GetObject puoi capire se il file è stato già aperto oppure no.

                  I problemi di Excel "appesi" sono legati a un'errata distruzione degli oggetti prima alla chiusura, ricordati di impostare a Nothing tutto quello che referenzi soprattutto se sono oggetti esterni all'applicazione in uso (cioè non serve settare a Nothing Range e Cells se sei dentro Excel, ma se chiami Excel da Access, punti a Range attraverso Access e ci lavori, allora l'operazione di pulizia è necessaria).

                  Per quanto riguarda VBA, ti ho già risposto, è uguale a se stesso da anni e non cambierà, è nella sua versione più matura (non verrà sviluppato ulteriormente ma non verrà fatto sparire). Quello che cambia è il modello ad oggetti delle singole applicazioni, che con l'evoluzione espongono normalmente metodi e proprietà nuovi (uno su tutti, rispetto a Office 2003 dalla versione 2007 è presente il metodo ExportAsFixedFormat che permette di creare direttamente pdf, e ha di fatto reso obsoleti tutti i codici che si interfacciavano ai vari PDFCreator).

                  Office per Mac contiene VBA e funziona ugualmente bene. Ci sono alcune piccole differenze e limitazioni, ma derivano dalla piattaforma in uso (sopratutto sono gli userform a creare qualche difficoltà). Tendenzialmente però quello che si codifica per Windows funzionerà anche su Mac e viceversa. Mi pare che patel abbia esperienza di Mac.

                  #14346 Score: 0 | Risposta

                  Devo dire che non mi pare che ci siano conflitti tra i 2 Excel, vengono letti e scritti senza confusione se cambio di volta in volta su cui sono focalizzato con il comando activate.

                  Comunque grazie delle risposte, molto interessante che ci sia VBA per Mac (avrei giurato di no!). Quindi se vado giu' in negozio e mi prendo l'ultimo Office e lo installo sul PC ci gira il programmone? Con tutte le sue form, le sue shape e le migliaia di righe di programma? Anche se non c'è scritto nulla sulla scatola a proposito di VBA? E anche se questi sprovveduti rappresentanti della Microsoft non ne sanno nulla? Sono letteralmente "felice" di sentirmelo dire. Cosi butto questa vecchia versione di office 2010 e passo al nuovo! Ti ringrazio di correre pazientemente dietro un incompetente come me! Cari saluti. Francesco. 

                  #14349 Score: 0 | Risposta

                  Tu parlavi di conflitti non aprendolo come ho fatto io, ma con il discorso della connessione all'origine dei dati, mi sono reso conto dopo aver andato la mia risposta, leggendo bene il messaggio che mi avevi mandato prima. Scusa.

                  #14351 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    238 pts

                    Sì infatti parlavo di eventuali conflitti di connessione aprendo il file direttamente da SQL. Potrei fare un test ma mi serve il momento da dedicare 🙂

                    francesclongo60 ha scritto:

                    Cosi butto questa vecchia versione di office 2010

                    Ma se ti funziona tutto perchè buttarla e spendere magari non pochi soldi? solo per avere qualche funzione in più che forse non userai mai? Qui in ufficio ho Office 2007 e va che è un treno per la maggior parte dei compiti (mi manca, per dirne uno, AGGREGA: ma si può rimpiazzare e comunque io uso quasi solo VBA che come detto è vivo e vegeto anche nella versione di Office 2019, Office 365 e così via)

                    #14418 Score: 0 | Risposta

                    Buongiorno carissimo Vecchio Frac, scusa se non ti ho risposto prima. Certo se mi dici che va ancora da dio, lo tengo. E' che uno pensa appunto a qualche novità, un Power Point piu' professionale (che è sempre stato, a mio parere, non all'altezza delle belle cose che si vedono in giro nei siti o nelle riunioni aziendali, quindi uno spera in migliorie varie), poi si pensa sempre di essere completamente abbandonati dalla casa madre per i programmi piu' datati. Ci sono anche le male lingue che sostengono che ti inviano dei "gremlins informatici" per impantanarti i loro software e costringerti a ricomperarli, specie durante gli aggiornamenti notturni. Certo queste potrebbero essere cose esagerate e non vere. Tutto qui, ma seguo il tuo consiglio e proseguo. Per quanto riguarda Access, mi è venuto in mente un altro importante motivo che possa giustificarne, nel mio caso, l'utilizzo. Il problema di non dare al mio cliente, o ai miei ex colleghi direttamente il "programmone" in mano, puoi proteggerlo, certamente, ma non si sa mai. Non è che ci siano dentro chissà quali segreti industriali, ma talune soluzioni che permettono di risparmiare kg e kg di materiali a parità di prestazioni fornite dal prodotto che è meglio non farglielo sapere. Cosi loro hanno in mano un oggetto gradevole (il catalogo dei trafi in access appunto), con tutti i risultati salienti della mia progettazione e senza i miei "segreti professionali". Appena pronta è testata la mia routine di caricamento e quella di lettura le postero' qui per ricevere un tuo autorevole commento e poter finalmente abbassare la spunta "risolto". Ti ringrazio molto dei saggi consigli che mi dai. Cordialità, Francesco.

                    #14424 Score: 0 | Risposta
                    Private Sub Comando36_Click()
                    Dim DBCOrrente As DAO.Database
                    Dim Tabella As DAO.Recordset
                    Dim I As Long
                    Dim Cella
                    Dim trafo_gia_presente, trovato_vecchio_disegno, vecchio_disegno_da_sostituire As Boolean
                    
                    'Workbooks.Open FileName:="c:\PROGRAMMA_DI_MEDIA\PROGRAMMA\TRAFI_DI_MEDIA_ATS_030701B.xlsm", ReadOnly:=True
                    
                    Set DBCOrrente = CurrentDb
                    
                    Set Tabella = DBCOrrente.OpenRecordset("descrizione trafo")
                    nometrafo = Tabella.Fields("nome trafo")
                    MsgBox "trafo in elaborazione ora ?:" & nometrafo
                    
                    'ora preleviamo e apriamo il disegno di questo trafo
                    
                    
                    'apre l'EXCEL dove vanno inserite le immagini dei trafi
                    Workbooks.Open FileName:= _
                            "C:\1-AAA TMC Rebeschini\catalogo trafi BT\Elenco immagini trafi\elenco immagini trafi.xlsx"
                    
                    'pone ora l'attenzione sull'EXCEL contenente la collezione dei disegni dei trafi
                    'Windows("elenco immagini trafi.xlsx").Activate
                    'cerca ora se una immagine di questo trafo ? stata gi? memorizzata in passato:
                    
                    If Sheets.Count > 0 Then
                        For k = 1 To Sheets.Count
                            If Sheets(k).Name = nometrafo Then
                                Sheets(k).Activate
                                Sheets(k).Select
                                Sheets(k).PrintPreview
                                MsgBox "trovato un disegno con lo stesso nome del trafo in elaborazione"
                                Exit For
                            End If
                        Next
                    End If
                    
                    risp$ = InputBox("ok? (pulsante qualsiasi)")
                    
                    ActiveWorkbook.Close
                    Workbooks.Close
                    'mi dice che il processo ? stato concluso
                    MsgBox "Fine della procedura"
                    
                    End Sub
                    

                    Un aiutino, per l'ultima routine quella di visualizzazione: non riesco a far vedere il foglio con l'immagine del trasformatore, puoi aiutarmi? Che comando serve? Grazie.

                    #14431 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      238 pts

                      Due cose ti dico:

                      If Sheets(k).Name = nometrafo Then

                      è meglio testare l'uguaglianza in questo modo:

                      If UCase(Sheets(k).Name) = UCase(nometrafo) Then

                      perchè se il nome del trafo contiene maiuscole e il noe del foglio no, il test non verrà mai soddisfatto;

                      e

                      Sheets(k).Activate
                      Sheets(k).Select

                      sono ridondanti, perchè quando attivi un foglio automaticamente lo selezioni e viceversa, quindi puoi eliminare una delle due istruzioni.

                      Ciò premesso, mi chiedo che problema riscontri: non si visualizza l'anteprima del foglio contenente il trafo? cioè il printpreview non funziona?

                      #14440 Score: 0 | Risposta

                      Succedono 2 cose:

                      non si posiziona sul record che sto visualizzando manualmente dalla maschera ma sempre sul primo, forse devo usare qualche comando con "tabella" ma non mi ricordo bene: tabella.edit non porta a risultati e tabella.requery non me lo fa fare

                      poi appena raggiunge sheet(k).printpreview si inchioda e devo spegnerlo con "gestione attività"

                      #14441 Score: 0 | Risposta

                      "sheets(k).printpreview" scusa

                      #14450 Score: 0 | Risposta

                      Ciao. Poi mi rimangono appesi molti Excel e il "programmone" viene in qualche modo interessato, (con l'altra routine, quella che preleva i dati) perché presenta tutta una colonna laterale con "file recuperati". Sarebbe bello che tutti questi "effetti collaterali" non ci fossero. Saluti.

                      #14468 Score: 0 | Risposta

                      DeletedUser
                      Bloccato
                        13 pts

                        francesclongo60 ha scritto:

                        Comunque ho sposato l'idea di un Excel ausiliario dove depositare le immagini raccolte, da far mostrare ad access su richiesta.

                        Francamente, non la trovo per niente una buona idea. Tutt'altro!

                        Già è sbagliato metterle nel database Access, peggio ancora è metterle in un file Excel.

                        Le immagini vanno mantenute nei file, inserite in una sotto-cartella preposta.

                        In funzione della struttura dati (che al momento non conosco) , si può eventualmente suddividerle (leggi raggruppare) in base ad un certa logica. Ma sempre e comunque come singoli file.

                        Ad esempio, io ho un programma che gestisce dei Rapporti di intervento, e tutte le immagini relative al singolo Rapporto le registro in una cartella del server (quindi in un percorso base predefinito standard) e vengono registrate nella cartella dell'intervento che è semplicemente l'IDRapporto dell'intervento. Esempio:

                        \\SrvApps01\MioProgramma\Rapporti\27504\immagine1.bmp
                        \\SrvApps01\MioProgramma\Rapporti\27504\immagine2.bmp
                        \\SrvApps01\MioProgramma\Rapporti\27504\immagine3.bmp

                         Ovviamente, poi uno fa come meglio crede.

                        #14484 Score: 0 | Risposta

                        Ottimo, gibra, bellissime considerazioni, ma mi devo accontentare nel mio piccolo di un passo alla volta. Non mi viene immediato far generare al "programmone" delle immagini .bmp, nè so come farle aprire/ chiudere mostrare ad access. Devo fare un passo alla volta, non sono un drago come voi. Mi piacerebbe per cominciare ricevere un aiuto sulle cose che chiedo (i file Excel che mi rimangono appesi, i giusti comandi per posizionarmi nel "giusto" record… quelle cose che ho elencato prima) e che non mi stanno funzionando. Le cose perfette per ora debbono aspettare (senza alcuna polemica, giuro). Saluti.

                        #14490 Score: 0 | Risposta

                        Anonimo
                          1 pt

                          Purtroppo non è semplice aiutarti nei tuoi piccoli passi, ma ti posso dire che se si creano tante istanze di Excel significa solo una cosa: non lo chiudi.

                          Nel tuo codice non si è ancora visto (almeno io non lo vedo) né come apri Excel, né se e come (e dove) lo chiudi.

                          Comunque concordo con gibra al 100%.

                          Riguardo alle immagini, basta fare un ricerca su Google e trovi quello che ti serve.

                          #14492 Score: 0 | Risposta

                          Scusa Leonardo, se guardi la risposta n. 14320 si vede benissimo come apro e chiudo Excel. Le mie immagini sono fatte con le shape di Excel. quindi non mi pare un'idea cosi balorda farle vedere direttamente in Excel, perché si possono fare delle ottime operazioni di trascinamento con il mouse che nel mio caso sono importanti, visto che rappresento trasformatori, si possono fare piccole operazioni di spostamenti ad es. di elementi costruttivi (come nuclei o avvolgimenti o collegamenti ecc. ) per cercare migliori soluzioni costruttive e per altri motivi. Pertanto scusate ma prima di criticare occorrerebbe conoscere bene le istanze di ciascuno. Io sono alla ricerca per ora di piccoli aiuti da esperti piu' di me. Lo so bene che si posso fare ricerche su Google, ma che vuol dire? Cio' renderebbe inutile e superfluo qualsiasi forum! Scusate lo sfogo e buona giornata a tutti.

                          #14497 Score: 0 | Risposta

                          Anonimo
                            1 pt

                            francesclongo60 ha scritto:

                            Scusa Leonardo, se guardi la risposta n. 14320 si vede benissimo come apro e chiudo Excel.

                            Mi spiace contraddirti, ma in quel post si vede come apri e chiudi il FILE, non EXCEL.
                            Credimi, è una cosa completamente differente. Comunque, non importa... lasciamo perdere.

                            Per il resto io non posso conoscere tutti gli aspetti della tua opera.

                            In ogni caso se ti senti criticato da me, mi dispiace che tu la prenda in questo modo, ma non preoccuparti, non mi crea alcun problema astenermi dalla discussione.
                            Vorrei però ricordarti che quand si chiede aiuto su un forum, è normale che si possano ricevere suggerimenti non graditi (che tu scambi come critiche), anche perché chi non ha esperienza (come te) non ha la minima idea di cosa va incontro se prende un strada sbagliata.
                            Nonostante ciò ti capisco, perché ognuno che fa è convinto di fare bene. Solo con 'esperienza capirà.

                            D'altra parte i Forum servono proprio a questo: trasmettere esperienza a chi non ce l'ha.

                            Buon lavoro.

                             

                            #14498 Score: 0 | Risposta

                            vecchio frac
                            Senior Moderator
                              238 pts

                              Allora, abbiamo un file Excel contenitore di immagini di oggetti che l'utente può modificare. Ogni immagine (costruita mettendo insieme delle Shapes quindi non sono immagini in senso stretto) è depositata in un foglio dedicato di questo file Excel contenitore.

                              L'utente utilizza comunque Access per sfogliare le pagine di un catalogo, ogni pagina dovrebbe puntare al foglio Excel contenente quella immagine.

                              Finora è giusto?

                              Il problema: appena si sceglie una pagina del catalogo, Access apre Excel ma non riesce a puntare alla pagina desiderata. 

                              Inoltre ad ogni apertura di pagina del catalogo, si riapre Excel e questo potrebbe comportare effetti collaterali.

                              E' questo lo scenario?

                              In coda al mio post ringrazio Gibra per l'intervento, che ha confermato il mio suggerimento iniziale. La sua esperienza è un prezioso tesoro e sono contento che sia intervenuto in questo Forum. Io lo conosco perchè è stato uno dei miei Maestri iniziali anche se lui non sa chi sono nè può ricordarsi di me 🙂 

                              L'osservazione di Leonardo è corretta in linea di massima, cioè chiudere i Workbooks che si aprono; mi sembra che il codice proposto difetti solo nel non referenziare un oggetto Workbook al quale assegnare l'istanza di Excel da maneggiare (sarebbe poi più facile esplicitarne l'annientamento).

                              Mi fa comunque strano leggere codice in Access che si riferisce semplicemente a "Workbooks". E' un peccato non poter disporre dell'originale, quindi si va a tentativi sperando di cogliere nel segno.

                              Chiedo comunque a tutti un po' di pazienza: a Francesco nello spiegarsi e nel cogliere egli spunti che arrivano (magari frammentati) e agli altri nel comprendere che Francesco non ha l'esperienza quotidiana con questi strumenti (a volte anche a me capita di dare scontate certe cose che invece vanno spiegate per esteso). Grazie a tutti.

                            Login Registrati
                            Stai vedendo 25 articoli - dal 1 a 25 (di 26 totali)
                            Rispondi a: Problema sul prelievo automatico di immagini in excel da trasportare in access
                            Gli allegati sono permessi solo ad utenti REGISTRATI
                            Le tue informazioni: