Using Excel VBA to query Access Database - sql

I want to use Excel VBA to query an MS Access database, searching and adding to a table.
By searching this site I found this code:
Dim dbs As DAO.Database
Dim dbs As Object
Set dbs = OpenDatabase("FILEPATH\database1.accdb")
dbs.Execute "INSERT INTO Table1(ID, Field1, Field2, Field3) VALUES('1','Hello','Helo','Hi')"
which doesn't work because it says that the sub or function was not defined for the function OpenDatabase()
Has anyone got a better method of this
The reason I want to do this when I know there are better methods out there is because the database and spreadsheet already exist (run by my employer) and I just want to link them.

Try this (with a correct FILEPATH, of course):
Dim appAccess As Object: Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase ("FILEPATH\database1.accdb")
appAccess.CurrentProject.Connection.Execute "INSERT INTO Table1(ID, Field1, Field2, Field3) VALUES('1','Hello','Helo','Hi')"
Set appAccess = Nothing

Related

Error 3192 when try insert record in sql server

I have a strange problem: I do an insert into command using as usual example:
Dim dbs As DAO.Database
Dim sql As String
Set dbs = CurrentDb
sql = "INSERT INTO dbo_tblScheMod (Stato, Collezione, Modello, Articolo) VALUES ('x','x','x','x');"
dbs.Execute sql
I get error:
Could not find output table dbo_tblScheMod.(Error 3192)
The table dbo_tblScheMod exists and visible in the Access environment in the Tables section.
Do you have any ideas?

MS-Access Database Locking when running a Insert Query via VBA

I am creating a simple database. I have a functionality where i have simply created a Insert Into query an saved it in the database. what i want to do is,
call that query in VBA code.
I have done following coding :
Private Sub Update_ISO_Review_Register()
Dim dbs As DAO.Database
Set dbs = CurrentDb
dbs.Execute "Update_ISO_Review_Register_ApplicationData"
dbs.Close
Set dbs = Nothing
End Sub
The code works and it executes the query. Issue is that after that it locks the database and it gives the following error.
You do not have exclusive access to the database at this time. if you
proceed to make changes, you may not be able to save them later.
The SQL for the Update_ISO_Review_Register_ApplicationData query is:
INSERT INTO ISO_REVIEW_REGISTER ( SLTF_Ref, Brand, Application_No )
SELECT DISTINCT b.matter_No AS SLTF_Ref
, b.Brand
, b.CREDIT_APPLICATION_ID AS Application_No
FROM WBC_HFM_FileReveiw_Table AS a INNER JOIN WBC_HFM_Application_Table AS b ON
a.CREDIT_APPLICATION_ID = b.CREDIT_APPLICATION_ID;
Any help ?
Would it work if you only do this:
Private Sub Update_ISO_Review_Register()
CurrentDb.Execute "Update_ISO_Review_Register_ApplicationData"
End Sub
You can nicely live without these:
Dim dbs As DAO.Database
Set dbs = CurrentDb
dbs.Close
Set dbs = Nothing
especially set set dbs = Nothing, which is a local variable and "dies" after End Sub.

VBA to run specific queries

I have a table containing business priorities and the name of the query that is used to generate the results for each.
Is it possible to loop through this table and where it finds a query in the database with the same name, run it?
The closet thing I have found is below but I don't want to input my full query codes into a table.
http://www.experts-exchange.com/Database/MS_Access/Q_28284655.html
This will execute every query name that is in your table. It fills a recordset with the query names and then loops through and executes each one.
Dim sql As String
Dim rst As DAO.Recordset
Dim myQuery As String
sql = "Select myQuery from myTable"
Set rst = CurrentDb.OpenRecordset(sql)
Do While Not rst.BOF And rst.EOF
myQuery = rst(0)
DoCmd.OpenQuery myQuery, acViewNormal
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
Let me know if you need to check to see if the query exists before you execute it. If so, I can add the code to search the querydefs collection for a query with the same name and only execute it if a match is found.

Refreshing a pivot table created in Excel Vba (ADODB Connection)

I can successfully create a pivot table in excel vba 2010 with the following code where the data come from an MS access database,
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=H:\SQL.accdb"
rs.Open "SELECT * FROM Table1", con, adOpenStatic, adLockReadOnly
Set piv = ActiveWorkbook.PivotCaches.Create(xlExternal)
Set piv.Recordset = rs
piv.CreatePivotTable TableDestination:=Range("A1"), TableName:="P2"
con.Close
Set rs = Nothing
Set con = Nothing
But i when i change the SQL code of the recordset then the pivot can't be refreshed. In fact the pivot table has to be deleted and created over. Is there a way i can create a pivot table this way and refresh the data without deleting the pivot table.
The above answer was not quite what i was look for as different users would query from the database and will be using parameters as well, which could cause problems when multiple users query at the same time. But i did found a way to around my problem.
The code i placed above in my question, I can use to initially create my pivot and pull all the data through. I then build a separate Sub that can refresh the pivot table that looks as follows,
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=H:\SQL.accdb"
rs.Open "SELECT * FROM Table1", con, adOpenStatic, adLockReadOnly
With Sheets(1).PivotTables("P2").PivotCache
Set .Recordset = rs
.Refresh
End With
Set rs = Nothing
con.Close
Set con = Nothing
A quick-fix, depending on how you usually update the SQL code, is as follows.
In ACCESS , create a query, using SQL mode as
SELECT * FROM Table1 and save it as Query1
In EXCEL, modify your code to SELECT * FROM Query1
That way, Excel will treat Query1 as a Table for all practical purposes and you may make Query1 in Access as complicated as you'd like, Excel will still pull up all its contents, keeping your code reusable.

How to check table exist or not exist

How to check table is there or not?
Using VB 6.0
cmd.CommandText = "drop table t1"
cmd.Execute
Above code is working fine, but if table is not exist then it showing “table does not exit”
How to check table exist or table not exist?
Need VB CODE help?
If you just want to drop the table without throwing an error message, you can use the following SQL if you're using MySQL.
DROP TABLE t1 IF EXISTS
Other databases have a similar feature, but the syntax is different. To do the same in MSSQL:
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1') DROP TABLE t1;
Although that looks very ugly.. there must be a better syntax to get the same result.
For a Jet MDB (and perhaps generically for many OLEDB Providers) you can use an approach like:
Private Sub Main()
Dim cnDB As ADODB.Connection
Set cnDB = New ADODB.Connection
cnDB.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Jet OLEDB:Engine Type=5;Data Source='sample.mdb'"
'Check presence of table --------------
Dim rsSchema As ADODB.Recordset
Set rsSchema = _
cnDB.OpenSchema(adSchemaColumns, _
Array(Empty, Empty, "t1", Empty))
If rsSchema.BOF And rsSchema.EOF Then
MsgBox "Table does not exist"
Else
MsgBox "Table exists"
End If
rsSchema.Close
Set rsSchema = Nothing
'--------------------------------------
cnDB.Close
End Sub
You'd be better off checking for existence of the table concerned, rather than trying to drop it.
The SQL syntax is dependent on the database server/engine you're using, but for Sql Server you could use something like:
Sql Server 2000:
SELECT 1 as Exists FROM sysobjects WHERE name = 't1'
Sql Server 2005/2008:
SELECT 1 as Exists FROM sys.objects WHERE name = 't1'
You can then use VB like:
Dim rs as Recordset
Dim iExists as Integer
rs = cmd.Execute
On Error Goto DoesNotExist
rs.MoveFirst
iExists = CInt(rs!Exists)
DoesNotExist:
If iExists = 1 Then
' Put code here for if the table exists
Else
' Put code here for if the table does not exist
End If
Note: This code needs tidying up and "productionising" (i.e. I haven't actually tested that it works as I don't have VB6 on this machine)