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

Excel vba - Convert dynamic range to static range then export to Access 2010 as new records

更新 4

已发布解决方案。


更新 3

终于找到了解决我的问题的方法,post 将在接下来的几天内得到答案。


更新 2!

将更新放在顶部以提高可读性。

很显然,在导出到 access 时,无法直接在 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

更新!

在绞尽脑汁几个小时并检查我 post 为一些急需参考而编辑的链接后,我想出了以下内容:

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"

从技术上讲,这应该 select 'ExportData' 范围来自测试工作表,基于 Whosebug 上的另一个问题,我只是不能 100% 确定它是否有效

.Open
.Execute strQuery
End With

With cn
.Close
End With

这会实际执行 INSERT INTO 吗?并且真的需要关闭连接吗? (我想是的,只是想确定地知道)

亲切的问候,


一段时间以来,我一直在努力让脑海中的想法发挥作用,但老实说,我现在不具备所需的专业知识。我对编程还很陌生,所以设置我自己可以实际使用的变量和数组对我来说仍然非常困难。 希望你能帮助我。

情况: 所以在一个 Excel 只读文件中,我基本上有一个 10 行乘 14 列的范围,用户可以将自己的数据放入其中,我只想导出具有这些用户填写的实际数据的行到访问 2010 数据库。

我之前尝试过的: 起初我想要一个尽可能简单的解决方案,我尝试通过将 Excel 工作表连接到 Access 数据库来实现这一点,然后然后通过对数据为 NOT NULL 的行执行 SQL 追加查询。 (检查最后一列中的条目是否为 NOT NULL)

然而,由于很多人会同时使用该文件,我担心 database/Connection 对 Excel 工作表的访问可能会混淆并开始做一些不应该做的事情。当我试图 Google 找出这是否真的是一个问题时,我的搜索结果是空的,所以我不确定我是否应该继续这个方向并最终放弃了这个解决方案。

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

有一些人在几次 google 搜索后尝试做同样的事情(不幸的是我不能 post 超过 2 个链接或 post linkbu.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:\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