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
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
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")
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
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
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.
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 ******************
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 & ";"
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"
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)
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
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ù.
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.
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
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
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
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)
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
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
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.
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..."
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