更新4
发布解决方案。
更新3
终于设法找到了解决我的问题的方法,将在接下来的几天内发布答案。
更新2!
将更新放在顶部,以提高可读性。
因此,显然在导出到访问时,不可能直接在vba代码中使用excel中的命名范围。
经过更多研究后,我发现有一种解决方法:首先将动态范围更改为静态范围,然后将整个字符串用作变量。
但是我下面的当前代码说,即使我确定语法正确,也无法找到范围,这是因为我没有正确设置对excel文件的引用吗?
Sub ExportAccess()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strQuery As String
myAddress = Replace(ThisWorkbook.Names("ExportData").RefersToRange.Address, "$", "")
myAddress = "[GWU$" & myAddress & "]"
' [Excel 8.0;HDR=NO;DATABASE=C:\Users\Public\test.xls] < unused code snippet
strQuery = "INSERT INTO Table1" & vbCrLf & _
"SELECT * FROM " & myAddress & ""
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "C:\Users\Public\Database.accdb"
.Open
End With
rs.Open strQuery, cn
cn.Close
rs.Close
Set rs = Nothing
Set cn = Nothing
End Sub
更新!
在花了我几个小时并检查了我发布的链接以获取一些急需的参考信息之后,我想到了以下内容:
Sub ExportAccess()
Dim cn As ADODB.Connection
Dim strQuery As String
strQuery = "INSERT INTO Table1" & vbCrLf & _
"SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=C:\Users\Public\test.xls].ExportData"
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "C:\Users\Public\Database1.accdb"
.Open
.Execute strQuery
End With
With cn
.Close
End With
End Sub
我尚未能够对此进行测试(明天将做第一件事),但是我担心以下代码片段:
"SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=C:\Users\Public\test.xls].ExportData"
从技术上讲,这应该基于Stackoverflow上的另一个问题从测试工作表中选择'ExportData'范围,我不确定100%是否能正常工作
.Open
.Execute strQuery
End With
With cn
.Close
End With
这实际上会执行INSERT INTO吗?真的需要关闭连接吗?(我想是这样,只是想肯定地知道)
亲切的问候,
我一直在努力使自己的脑袋工作一段时间,但是老实说,我现在没有所需的专业知识。我对编程还是很陌生,因此设置自己可以实际使用的变量和数组对我来说仍然很困难。希望你能帮助我。
情况:因此,在一个Excel只读文件中,我基本上有一个10行乘14列的范围,用户可以将自己的数据放入其中,我只想将具有这些用户填写的实际数据的行导出到Access中2010数据库。
我之前尝试过的内容:最初,我想尽可能简化解决方案,我尝试通过将Excel工作表连接到Access数据库,然后对数据不为空的行执行SQL追加查询来做到这一点。(检查最后一列中的条目是否不为空)
但是,由于许多人会同时使用该文件,因此我担心Access数据库/ Excel工作表的连接可能会变得混乱,并开始执行原本不应该的操作。当我尝试使用Google查明这是否确实是一个问题时,我的搜索结果是否为空,因此我不确定是否应该继续朝这个方向发展,最终放弃了该解决方案。
我现在要执行的操作:基本上,我认为可以在导出之前,在Excel宏中执行相同的操作,设置命名范围(通过名称管理器),然后使用简单宏,然后将命名范围内的其余行追加到Access数据库。
有一些例子,人们尝试过几次Google搜索后尝试做同样的事情(不幸的是,我不能发布两个以上的链接,也不能发布linkbu.ch链接):
但是,所有这些示例似乎都使用静态范围,而不是动态范围。如何在VBA代码中从名称管理器插入范围?如果有人对其他解决方案有任何想法,也将不胜感激。
亲切的问候,FSDT
好的,大家好,正如之前所说的,这是我在反复试验后想到的解决方案:
Sub ExportAccess()
Dim cn As ADODB.Connection
Dim strQuery As String
Dim dbFilepath As String
Dim xlFilepath As String
dbFilepath = "C:\Users\Public\Database1.accdb"
xlFilepath = Application.ActiveWorkbook.FullName
xlFilepath = "[Excel 8.0;HDR=Yes;DATABASE=" & xlFilepath & ";IMEX=1]"
myAddress = Replace(ThisWorkbook.Names("ExportData").RefersToRange.Address, "$", "")
myAddress = "[Sheet1$" & myAddress & "]"
myAddress = "" & xlFilepath & "." & myAddress & ""
STRcn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & dbFilepath & ";"
strQuery = "INSERT INTO Table1" & vbCrLf & _
"SELECT * FROM " & myAddress & ""
Set cn = CreateObject("ADODB.Connection")
cn.Open STRcn
cn.Execute strQuery
cn.Close
Set cn = Nothing
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句