6. VBA

6.1   Variabili invece dei nomi degli oggetti 6.12 Informazioni riguardanti le costanti Runcommand
6.2   Nascondere/mostrare la finestra database 6.13 Commentare più righe
6.3   Punto o punto esclamativo 6.14 Attendere fino a Shell è terminato
6.4   Parametri insufficienti 6.15 Copiare un testo su o dalla clipboard
6.5   Ciclare attraverso i controlli 6.16 Aprire una query parametrica da VBA
6.6   Compattare l'MDB corrente 6.17 Contare i record
6.7   Compattare un MDB differente 6.18 Informazioni su Treeview/Listview
6.8   Passare una data ad una stringa SQL 6.19 Passare la password del database
6.9   Arrestare l'esecuzione del codice per dialogo 6.20 Creare un MDE via codice
6.10 Seek con tabelle collegate 6.21 Passare un numero decimale ad una stringa SQL
6.11 MsgBox formattati dopo A97 6.22 Programmare i grafici
   
6.1 Variabili invece dei nomi degli oggetti
https://www.donkarl.com/it?FAQ6.1 aggiornato 2007-01-03

Problema

Vuoi usare in VBA una variabile invece del nome assegnato ad un oggetto (ad es. il controllo di una maschera o il campo di un recordset).

Soluzione

Usa la sintassi con le parentesi:

controllo di una maschera: Forms("NomeMaschera")(VariabileStringa)
oppure
campo di un recordset: rs(VariabileStringa)

v.a. Ciclare attraverso i controlli

in alto

6.2 Nascondere/mostrare la finestra database
https://www.donkarl.com/it?FAQ6.2 aggiornato 2014-04-25

Problema

Vuoi nascondere o mostrare da codice la finestra database o il riquadro di spostamento (che mostra gli oggetti di Access).

Soluzione

Nascondi:
DoCmd.SelectObject acTable, , True
RunCommand acCmdWindowHide


Mostra:
DoCmd.SelectObject acTable, , True

Nelle versioni >=A07 il codice usato sopra per nascondere il riquadro di spostamento non sempre funziona: p.e. se tutte le tabelle sono filtrate fuori con la barra di ricerca. È certamente più sicuro:

DoCmd.NavigateTo "acNavigationCategoryObjectType"
RunCommand acCmdWindowHide

in alto

6.3 Punto o punto esclamativo
https://www.donkarl.com/it?FAQ6.3

Problema

Non sei sicuro quando tu puoi/devi usare "." e quando "!" come separatore nei riferimenti.

Soluzione

Esiste una regola di base:
"!" prima degli oggetti, "." prima di insiemi e proprietà.

Se, come principiante, sei indeciso sul da farsi, le seguenti regole possono aiutarti:

Se l'elemento che segue il separatore è creato da Access allora devi usare il punto.
Se invece l'elemento è stato creato da te, cioè definito dall'utente, allora devi usare il punto esclamativo. p.e.

Application.Forms!frmClienti.Controls!Cognome.Visible

L'insieme Forms è creato da Access quindi .Forms
"frmClienti" è creato da te e quindi !frmClienti.
L'insieme Controls è di nuovo creato da Access
"Cognome" è definito dall'utente. La proprietà Visible è ancora creato da Access.
Questa regola si applica anche al formato abbreviato normalmente usato:
Forms!frmClienti!Cognome.Visible

Non bisogna meravigliarsi che il separatore punto funzione anche per i controlli, p.e.
Me.Cognome

Il motivo è che i controlli sono sia oggetti (definiti dall'utente) che proprietà di una maschera (creati da Access). Ma, usando il punto con i controlli, ogni tanto ci sono delle sorprese e finora inspiegabili errori; alcune volte può addirittura capitare dopo particolari situazioni quali una ricompilazione. Di conseguenza in questo caso è più sicuro usare il punto esclamativo o l'altra sintassi sicura che fa uso delle parentesi:
Me("Cognome")

in alto

6.4 Parametri insufficienti
https://www.donkarl.com/it?FAQ6.4 aggiornato 2007-01-03

Problema

In una query hai un parametro che fa riferimento a un controllo di una maschera. Cioè:
Forms!NomeMaschera!NomeControllo
Quando tenti di aprire un recordset basato su questa query ottieni un messaggio di errore del tipo: "Parametri insufficienti. Previsto 1", perfino se la maschera è aperta.

Causa

DAO lavora con JET direttamente e pertanto non conosce il riferimento ad un oggetto di Access nella stringa SQL.

Soluzione

Utilizza la funzione Eval per il riferimento alla maschera nella tua query:
Eval("Forms!NomeMaschera!NomeControllo")
Eval invia l'espressione alla cosiddetta Expression Service che valuta tale riferimento.

Altra possibilità: Aprire una query parametrica con VBA

in alto

6.5 Ciclare attraverso i controlli
https://www.donkarl.com/it?FAQ6.5 aggiornato 2005-06-01

Problema

Con il tuo codice VBA vuoi ciclare in un gruppo o su tutti i controlli di una maschera o di un report, p.e. per cambiare una proprietà di tali elementi in un fiato.

Soluzione

Una soluzione molto usata è quella in cui i nomi dei controlli hanno una radice comune seguita da un numero progressivo: List1, List2, List3 ... Così facendo puoi cambiare p.e. la proprietà Visibile di questi controlli con il seguente codice VBA:

Dim i As Integer
For i = 1 To 3
    Me("List" & i).Visible = False
Next


Puoi anche usare la proprietà Tag per contrassegnare alla stessa maniera determinati controlli. Poi il ciclo scorre tutti i controlli della maschera o del report e analizza la proprietà Tag:

Dim ctl As Control
For Each ctl In Me.Controls
    If ctl.Tag = "Pippo" Then ctl.Visible = False
Next ctl

in alto

6.6 Compattare l'MDB corrente
https://www.donkarl.com/it?FAQ6.6 aggiornato 2010-12-20

Problema

Vuoi compattare il file MDB corrente via codice.

Soluzione

VBA non ha un comando nativo per fare ciò. Pertanto con A97 l'unica semplice soluzione via codice e' il brutto:
SendKeys "%suc"
per mezzo del quale si invoca la corrispondente voce di menù. Tale voce di menù dovra' essere visibile nel momento in cui verra' usata.

A partire da A00 è stata introdotta la possibilita' di compattare il db alla chiusura. (menù Strumenti/Opzioni/Generale)
Nelle versioni da A00 a A03 è possibile invocare la voce di menù per la compattazione (segnalazione di Access MVP Juan M. Afan de Ribera da Barcelona):

CommandBars("Menu Bar"). _
    Controls("Strumenti"). _
    Controls("Utilità database"). _
    Controls("Compatta e ripristina database..."). _
    accDoDefaultAction


Dall'introduzione dei ribbon con A07 questo metodo non funziona più.

Oltre a ciò' esistono soluzioni con chiamate ad altri file MDB o programmi.
p.e. da Dev Ashish: http://www.mvps.org/access/modules/mdl0030.htm

Michael Kaplan ha creato l'aggiunta TSI SOON-Addin per A97 e A00, che è in grado di compattare il db corrente: http://www.trigeminal.com/utility.asp

È anche possibile di usare il Windows Scripting Host per fare ciò. L'esempio "Compattare l'mdb in uso" di Federico Luciani si trova nella sezione General di http://www.sitocomune.com.

in alto

6.7 Compattare un MDB differente
https://www.donkarl.com/it?FAQ6.7

Problema

Vuoi compattare via codice un mdb diverso da quello in uso.

Soluzione

Fai attenzione a che non ci siano oggetti aperti o codice in esecuzione che si riferiscano all'mdb che vuoi compattare. Se per esempio hai tabelle collegate dall'mdb che sarà compattato allora non dovrà essere aperta nessuna maschera o recordset che abbiano origine da quelle tabelle.

A partire da A95 con dialogo: RunCommand acCmdCompactDatabase

Senza ogni dialogo: Copia la funzione seguente in un modulo standard

'*************** CODE START ******************
Function fctCompactOtherDB(strPath As String)
  'Compatta il MDB indicato
  'Chiamala con: fctCompactOtherDB "Percorso_e_Nome_del_MDB_che_vuoi_compattare"
  On Error GoTo myError
    
  DoCmd.Hourglass True
    
  Dim strFile As String
  Dim varDummyPath As Variant
  Dim varDummyFile As Variant
    
  strFile = Dir(strPath)
  varDummyPath = left$(strPath, Len(strPath) - Len(strFile))
  varDummyFile = varDummyPath & "Dummy.mdb"
  DBEngine.CompactDatabase strPath, varDummyFile
  Kill strPath
  Name varDummyFile As strPath
    
  myExit:
    DoCmd.Hourglass False
    Exit Function
    
  myError:
    Select Case Err.Number
      Case 3005, 3024, 53, 3044, 76
        MsgBox "Impossibile trovare il database.", vbOKOnly
      Case 3196
        MsgBox "Il database è attualmente in uso.", vbOKOnly
      Case Else
        MsgBox "Eccezione No " & Err.Number & ". Che significa: " & Err.Description
    End Select
    Resume myExit

End Function

'*************** CODE ENDE ******************

in alto

6.8 Passare una data ad una stringa SQL
https://www.donkarl.com/it?FAQ6.8

Problema

Tu crei un'espressione SQL da codice e vuoi usare il valore di un campo di tipo Data/ora come criterio. Ma ricevi un messaggio d'errore del tipo "Errore di sintassi nell'espressione..."

Causa

JET SQL necessita di una data nel formato americano (mm/dd/yy) o nel formato ISO (yyyy-mm-dd).

Soluzione

Poiché Access salva internamente i campi Data/ora come numeri di tipo dati in precisione doppia, tu puoi passare la data convertita in precisione doppia:
Str(CDbl(TuoCampoData))

Per una data che non contiene l'orario puoi usare anche:
CLng(TuoCampoData)

Un altro modo è quello di usare la funzione Format per trasformare la data nel formato americano o ISO. p.e.

Dim strDate As String
Dim strSQL As String

strDate = Format(TuoCampoData, "\#yyyy\-mm\-dd\#")

strSQL = "SELECT * FROM Tabella WHERE Tabella.Campo > " & strDate & ";"

in alto

6.9 Arrestare l'esecuzione del codice per dialogo
https://www.donkarl.com/it?FAQ6.9

Problema

Durante l'esecuzione di una procedura aprendo una maschera vuoi arrestare l'esecuzione del codice principale finchè non è stato inserito un dato nella maschera chiamata, o finchè la stessa non viene chiusa.

Soluzione

Apri la maschera in modalità Dialog per arrestare l'esecuzione del codice chiamante:
DoCmd.OpenForm "MiaMascheraDialogo", , , , , acDialog

L'esecuzione del codice continuerà solo quando la maschera di dialogo verrà chiusa o resa non visibile. Questo significa che dopo
Me.Visible = False
nella maschera di dialogo l'esecuzione del codice continua e tu puoi fare riferimento al controllo nella maschera non visibile.
Alla fine quando non ti serve più tener aperta la maschera di dialogo puoi chiuderla esplicitamente:
DoCmd.Close acForm, "MiaMascheraDialogo"

in alto

6.10 Seek con tabelle collegate
https://www.donkarl.com/it?FAQ6.10

Problema

Apri un recordset DAO sulla base di una tabella collegata. Se specifichi dbOpenTable come tipo di recordset riceverai il messaggio di errore:
"Errore di run time 3219: Operazione non valida"
Se non imposti nessun tipo di recordset e cerci di usare il metodo Seek per trovare un record riceverai l'errore: "Errore di run time 3251: Operazione non supportata con questo tipo di oggetto"

Causa

Un recordset aperto su una tabella collegata non può essere di tipo Table. Quindi non è possibile utilizzare il metodo Seek il quale funziona solo con questo tipo.

Soluzione

Puoi usare un recordset di tipo Dynaset e i metodi Find... per effettuare la ricerca (dbOpenDynaset, FindFirst, ecc).

Se vuoi continuare con il metodo Seek in quanto normalmente più veloce di FindFirst, devi aprire il database esterno e quindi puoi usare un recordset di tipo Table:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = DBEngine.Workspaces(0).OpenDatabase("DB esterno")
Set rs = db.OpenRecordset("Tabella esterna", dbOpenTable)

in alto

6.11 MsgBox formattati dopo A97
https://www.donkarl.com/it?FAQ6.11 aggiornato 2024-10-22

Problema

In A97 puoi usare il simbolo @ nella funzione MsgBox per formattare in maniera diversa le parti di un messaggio. In >=A00 ciò non è più possibile.

Causa

Il VBE (Visual Basic Editor) non fa più uso della funzione di visualizzazione dei messaggi di Access.

Soluzione

Michael Kaplan mostra un trucco che utilizza la funzione di Access anche nelle versioni successive ad A97 per formattare il testo della MsgBox:
https://www.theaccessweb.com/bugs/bugs0035.htm

in alto

6.12 Informazioni riguardanti le costanti Runcommand
https://www.donkarl.com/it?FAQ6.12 aggiornato 2014-03-03

Problema

L'Help in linea mostra solo l'elenco delle costanti di RunCommand ma non ne spiega i metodi di utilizzo.

Soluzione

Sul sito di Terry Wickenden
http://access.mvps.org/access/RunCommand/index.htm
(inglese) ci sono molte informazioni ed esempi riguardanti l'utilizzo delle costanti Runcommand. Ci sono anche dei confronti tra le costanti RunCommand e le voci dei menù.

in alto

6.13 Commentare più righe
https://www.donkarl.com/it?FAQ6.13

Problema

Vuoi commentare con il carattere apice (') tutta una sezione di codice o vuoi cancellare tale carattere di comando per tutta una sezione. Ma tu non trovi nell'editor di codice VBA il modo per farlo.

Soluzione

In A97 non esiste alcuna funzionalità nativa per fare questo. In alternativa puoi usare quanto ideato da Dev Ashish e Terry Kreft:
http://www.mvps.org/access/modules/mdl0031.htm

Nelle versioni >=A00 ci sono due pulsanti nella barra dei comandi Modifica di VBE (Visual Basic Editor). Con un clic del tasto destro del mouse su qualsiasi barra dei comandi e scegliendo Personalizza... puoi copiare questi pulsanti nella barra standard del VBE così che risulteranno accessibili più facilmente.

in alto

6.14 Attendere fino a Shell è terminato
https://www.donkarl.com/it?FAQ6.14 aggiornato 2021-10-25

Problema

Avvii un'altra applicazione usando la funzione Shell e vuoi sospendere l'esecuzione del restante codice VBA sino a quando non sia stato terminato il processo avviato con la Shell.

Soluzione

La soluzione classica usa le funzioni API CreateProcess e WaitForSingleObject. Nel seguente articolo KB è mostrato come usarle:
articolo KB nell'archivio web

Dai un'occhiata anche all'esempio realizzato da Terry Kreft:
http://www.mvps.org/access/api/api0004.htm

Una soluzione più breve (da Win2000) permette la funzione GetProcessVersion. (indicazione di Sven Gallin)
v.a. http://msdn.microsoft.com:80/en-us/library/ms683224(VS.85).aspx
La funzione ritorna un id processo dove il processo chiamante è 0. Per questo basta controllare se diverso da 0 in un ciclo. Ecco il solito esempio con Notepad (copiare in un modulo standard e chiamare):

Public Declare Sub Sleep _
    Lib "Kernel32" (ByVal dwMilliseconds As Long)

Public Declare Function GetProcessVersion _
    Lib "Kernel32" (ByVal ProcessId As Long) As Long

Sub procShellWait()

    Dim lngHandle As Long

    lngHandle = Shell("NOTEPAD.EXE", 1)
    While GetProcessVersion(lngHandle) <> 0
        DoEvents
        'Sleep evita che il carico del processore sale a 100%
        'indicazione di Michael Zimmermann
        Sleep 1
    Wend

   MsgBox "Process Finished"

End Sub

in alto

6.15 Copiare un testo su o dalla clipboard
https://www.donkarl.com/it?FAQ6.15 aggiornato 2023-03-01

Problema

Vuoi inviare un testo alla clipboard via codice, o vuoi recuperare un testo dalla clipboard.

Soluzione

Se vuoi gestire il contenuto dei controlli o records completi in una maschera puoi selezionare l'oggetto desiderato e (a partire da A97) usare una delle costanti di RunCommand, che corrispondono alle voci del menù Modifica:

RunCommand acCmdCut 'Taglia
RunCommand acCmdCopy 'Copia
RunCommand acCmdPaste 'Incolla
RunCommand acCmdPasteAppend 'Accoda

Se i dati non sono "a vista" di una maschera ma si tratta di una variabile o dati in un Recordset ecc. puoi usare le API.

Per inviare testo alla clipboard: articolo KB nel archivo web

Per recuperarlo dalla clipboard: articolo KB nel archivo web

in alto

6.16 Aprire una query parametrica da VBA
https://www.donkarl.com/it?FAQ6.16

Problema

Vuoi aprire una query parametrica da codice e non sai come passare i parametri.

Soluzione

Se vuoi aprire un recordset basato sulla query puoi usare un codice come questo:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef

Set db = CurrentDb
Set qdf = db.QueryDefs("Mia_Query_Parametrica")
qdf.Parameters!MioParametro1 = "Valore_parametro1_tra_doppi_apici_se_è_una_stringa"
qdf.Parameters!MioParametro2 = Valore_parametro2_tra_doppi_apici_se_numerico
'ecc.

Set rs = qdf.OpenRecordset(dbOpenDynaset)
'ecco un buon codice che lavora con il recordset
'...
'alla fine azzeriamo gli oggetti e variabili:
qdf.Close: Set qdf = Nothing
rs.Close: Set rs = Nothing
Set db = Nothing


Se non vuoi aprire un recordset ma solo eseguire una query di comando parametrica il codice è simile. La differenza è che dopo aver passato i parametri non usi "Set rs..." ecc. ma semplicemente:
qdf.Execute

in alto

6.17 Contare i record
https://www.donkarl.com/it?FAQ6.17

Problema

Vuoi determinare se una tabella, query o recordset siano vuoti o quanti record abbiano.

Soluzione

Ci sono vari modi per realizzare questo e non è sempre chiaro quale sia il più veloce. Così dovresti testarli con l'oggetto reale e con un numero di record variabile.

Per le tabelle e le query c'è la funzione di aggregazione sui domini DCount:
MsgBox DCount("*", "MiaTabellaOQuery")

Un altra soluzione è quella di usare la funzione di aggregazione Count di SQL. (vedi sull'Help in linea la Funzione "Count").

Se la tabella/query viene aperta come recordset o generalmente per i recordset di DAO, esiste la proprietà RecordCount:

Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("MiaTabella", dbOpenDynaset)

If Not rs.BOF Then 'se ci sono record nel recordset
  rs.MoveLast ' necessario per determinare l'attuale numero di record
  MsgBox rs.RecordCount
End If


Nel caso in cui vuoi conoscere soltanto se un recordset contiene almeno un record, ad esempio per non eseguire il codice che ciclerebbe sui record, puoi semplicemente testare la proprietà BOF come già mostrato precedentemente. Se apri un recordset DAO che non ha alcun record, BOF è TRUE. Così puoi utilizzare un codice del tipo:

If rs.BOF Then Exit Sub 'esci dalla sub se il recordset è vuoto

Anche ADO ha una proprietà RecordCount ma il suo funzionamento è condizionato dal tipo di cursore e dal tipo di origine record. (vedi sull'Help in linea proprietà "RecordCount" per ADO)

in alto

6.18 Informazioni su Treeview/Listview
https://www.donkarl.com/it?FAQ6.18 aggiornato 2021-10-25

Problema

Stai cercando informazioni ed esempi sui controlli ActiveX Treeview e/o Listview.

Soluzione

Se hai ottenuto i controlli come parte di una versione di Office Developer o di VB, allora cerca nel CD l'help file Vbcmn96.hlp (in ODE97 e nelle versioni di VB più vecchie) o il file Cmctl198.chm (in MOD o in VB6).

Michele de Nittis ha scritto 2 documentazioni sull'uso di Treeview e Listview con Access:
http://www.mdenittis.it/Documentazione.htm

Jörg Ackermann dà una lezione su questo tema in AEK3. Il testo (in tedesco, ma gli esempi di codice in inglese;-) è disponibile in Download di AEK3.

La Microsoft ha pubblicato diversi articoli sulla KB e altro materiale (solo in Inglese):
un database di esempio per A97
il Treeview Control Wizard per A97
testi di Help ed esempi, sia per Treeview che per Listview, sui siti web MSDN

in alto

6.19 Passare la password del database
https://www.donkarl.com/it?FAQ6.19 aggiornato 2007-07-25

Problema

Vuoi aprire via codice un altro MDB in una nuova istanza di Access e in aggiunta passare la password del database, così che non si debba digitarla.

Soluzione

NB: Per la password del database, al contrario di quanto avviene per il nome e la password utente, non c'è la possibilità di passarla tramite un parametro di una riga di comando in un collegamento.

Se vuoi aprire via codice un MDB da un altro MDB, allora (fino ad A2000) l'unico modo per passare la password, è quello di aprire il database in modo invisibile con OpenDatabase. Ad esempio:

DBEngine.Workspaces(0).OpenDatabase("C:\MiaCartella\MioDatabase.mdb", False, False,";PWD=MiaPassword")

Per quanto riguarda il modo visibile per aprire un DB in una nuova istanza via codice, iniziando da Access XP, il metodo OpenCurrentDatabase ha un nuovo parametro per la password. Ad esempio:

Dim appAcc As Access.Application
Set appAcc = CreateObject("Access.Application")
appAcc.OpenCurrentDatabase "C:\MiaCartella\MioDatabase.mdb", False, "MiaPassword"


Per versioni di Access precedenti ad Access XP c'è il seguente trucco di Günther Ritter:

Private Sub cmdOpen_Click()
    Dim db As DAO.Database
    Dim strDb As String
    'crea un'altra istanza di Access
    Dim acc As New Access.Application
    Const strPWD As String = ";pwd=123456"
    strDb = "C:\DBConPassword.mdb"
    'apre il database con password
    Set db = acc.DBEngine.OpenDatabase(strDb, False, False, strPWD)
    acc.OpenCurrentDatabase strDb
    'necessario allo scopo di massimizzare l'applicazione
    acc.RunCommand acCmdAppRestore
    acc.RunCommand acCmdAppMaximize
    acc.DoCmd.Maximize
    db.Close
End Sub

in alto

6.20 Creare un MDE via codice
https://www.donkarl.com/it?FAQ6.20 aggiornato 2015-09-14

Problema

Vuoi creare un MDE da un MDB con VBA come se lo facessi usando la barra dei menu.

Soluzione

1. Esiste una costante (non documentata) per la funzione SysCmd con la quale si può convertire in MDE un MDB (ma non quello corrente):

In A97:
SysCmd 603, "PercorsoENomeFileMDB", "PercorsoENomeFileMDE"

Se ci sono problemi con questa unica linea di codice, p.e. la conversione non sempre viene eseguita, allora prova il metodo che usa una nuova istanza di Access. Con A00 e versioni successive questo è l'unico modo di lavorare:

Dim appAcc As Access.Application
Set appAcc = CreateObject("Access.Application")

appAcc.SysCmd 603 , "PercorsoENomeFileMDB", "PercorsoENomeFileMDE"

Set appAcc = Nothing


2. Il rattoppo con la costante acCmdMakeMDEFile di RunCommand. Vedi l'esempio in http://access.mvps.org/access/RunCommand/index.htm

3. Per convertire il file MDB corrente in un file MDE usando A97 o A00 c'è l'Addin TSI SOON in http://www.trigeminal.com/utility.asp.

in alto

6.21 Passare un numero decimale ad una stringa SQL
https://www.donkarl.com/it?FAQ6.21

Problema

Crei una stringa SQL nel tuo codice e vuoi passare una variabile numerica con decimali (ad esempio per impostare un valore in una INSERT INTO). A causa delle Impostazioni internazionali di Windows, come separatore decimale viene usata la virgola invece del punto, che è invece richiesto come separatore decimale dal linguaggio SQL. Così ricevi il messaggio d'errore "Il numero dei valori nella query non corrisponde a quello dei campi di destinazione" (errore 3346).

Soluzione

Usa la funzione Str() che prevede un punto come separatore decimale. Ad esempio:

Dim strSQL As String
Dim dblFoo As Double
dblFoo = 2.5

Benché c'è un punto nel codice alla stringa SQL verrà passata una virgola, tranne che si usi:

strSQL = "INSERT INTO Tabella1 (Pippo) VALUES(" & Str(dblFoo) & ")"
o p.e.
strSQL = "INSERT INTO Tabella1 (Pippo, Pluto) SELECT " & _ Str(dblFoo) & ", 4711 FROM Tabella1 WHERE..."

in alto

6.22 Programmare i grafici
https://www.donkarl.com/it?FAQ6.22 aggiornato 2014-04-15

Problema

Vuoi modificare il diagramma di un Grafico con VBA, ma non sai come fare e non trovi alcuna documentazione.

Soluzione

La programmazione dei grafici in Access, di massima, funziona in questo modo:

Me!MioControlloGrafico.OggettoOProprietà = Qualcosa

p. e. per chiudere la legenda del grafico

Me!MioControlloGrafico.HasLegend = False

Naturalmente lo stratagemma è avere le relative conoscenze degli oggetti, delle proprietà e di quel Qualcosa.

Dal momento che la programmazione in Excel è quasi identica, il seguente semplice trucco ti aiuta nella maggior parte dei casi:
Crea un grafico in Excel e fai una macro del record di Excel mentre esegui le modifiche desiderate. Il codice creato, riguardo alle proprietà e agli oggetti, può essere caricato su Access quasi in rapporto 1:1 e puoi anche leggere in conformità l'help del VBA di Excel.
Il VBA di Excel utilizza fortemente le sue costanti del tipo "xlqualcosa". Per portarle su Access puoi aprire la finestra Immediata in Excel ed ottenere il valore numerico originale con ?xlqualcosa. Un'altra possibilità è quella di impostare un riferimento in Access alla libreria di Excel. A questo punto puoi usare direttamente le costanti di Excel.

Nel web esiste qualche documentazione circa i Grafici. p.e.

Help file per Graph 97: http://support.microsoft.com/?kbid=162883
Esempi di grafici in A97: http://support.microsoft.com/?kbid=186855
MSDN: http://msdn.microsoft.com/en-us/library/office/ff835247(v=office.15).aspx

in alto