将动态范围转换为静态范围,然后作为新记录导出到Access 2010



UPDATE 4

发布解决方案。


更新3

终于找到了我的问题的解决方案,将在未来几天内张贴答案。


更新2 !

为了更好的可读性,把更新放在顶部。

所以很明显,这是不可能使用一个命名范围从excel直接在vba代码导出访问时。

在做了更多的研究之后,我发现有一种方法可以解决这个问题:首先将动态范围更改为静态范围,然后使用整个字符串作为变量。

然而,我当前的代码在下面说它找不到范围,即使我确信语法是正确的,这是因为我没有正确设置对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:UsersPublictest.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:UsersPublicDatabase.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:UsersPublictest.xls].ExportData"
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "C:UsersPublicDatabase1.accdb"
.Open
.Execute strQuery
End With
With cn
.Close
End With
End Sub

我还没有能够测试这个(明天将做这个第一件事)然而,我担心以下代码片段:

"SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=C:UsersPublictest.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追加查询来做到这一点。(检查最后一列的条目是否为非NULL)

然而,由于许多人会同时使用该文件,我担心Access数据库/连接到Excel工作表可能会混淆,并开始做它不应该做的事情。当我试图用谷歌搜索这是否真的是个问题时,我的搜索结果是空的,所以我不确定我是否应该继续这个方向,最终放弃了这个解决方案。

我现在要做的是:基本上我认为我可以在导出之前在Excel宏中做同样的事情,设置一个命名范围(通过名称管理器),然后在将命名范围中的剩余行追加到访问数据库之前,用一个简单的宏切除没有数据的行。

有几个例子,人们试图做同样的几个谷歌搜索后(不幸的是,我不能发布超过2个链接或发布链接。ch链接):

    搜索结果

然而,所有这些例子似乎都使用了静态范围,而不是动态范围。如何在VBA代码中插入名称管理器的范围?如果有人对不同的解决方案有任何想法,我也将不胜感激。

亲切的问候,FSDT


使用宏记录器。只需打开它并手动执行导出指定范围的步骤。然后查看生成的VBA代码。宏观记录器是人类有史以来最伟大的工具。试试吧,你会喜欢的。

好了,各位,正如之前所说的,这是我经过反复试验后想出的解决方案:

Sub ExportAccess()
Dim cn As ADODB.Connection
Dim strQuery As String
Dim dbFilepath As String
Dim xlFilepath As String
    dbFilepath = "C:UsersPublicDatabase1.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

最新更新