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

时间:2016-10-30 20:47:44

标签: excel vba excel-vba ms-access ado

更新4

发布解决方案。

更新3

最后设法找到我的问题的解决方案,将在接下来的几天内尽快发布答案。

更新2!

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

显然,在导出访问时,无法直接在vba代码中使用excel中的命名范围。

在做了一些研究后,我发现有一种解决方法:先将动态范围改为静态范围,然后将整个字符串用作变量。

但是我现在的代码下面说它找不到范围,即使我确定语法是正确的,这是因为我没有正确设置对excel文件的引用吗? < / p>

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

UPDATE!

在我的脑子里乱了几个小时并查看我发布的链接以获得一些非常需要的参考后,我想出了以下内容:

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附加查询执行此操作数据为NOT NULL的行。 (检查最后一列中的条目是否为非空)

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

我现在正在尝试做什么:基本上我认为在导出之前我可以在Excel宏中执行相同的操作,设置命名范围(通过名称管理器)然后切出在将命名范围中的其余行附加到访问数据库之前,使用简单宏没有数据的行。

有一些人尝试在一些谷歌搜索后尝试做同样的事情(不幸的是我不能发布超过2个链接或发布linkbu.ch链接):

然而,所有这些示例似乎都使用静态范围,而不是动态范围。如何在VBA代码中从名称管理器插入范围?如果有人对不同的解决方案有任何想法,也会受到赞赏。

亲切的问候, FSDT

2 个答案:

答案 0 :(得分:0)

使用宏录制器。只需打开它并手动完成导出命名范围的步骤。然后查看您生成的VBA代码。宏记录仪是有史以来赋予人类最伟大的工具。试试吧,你会喜欢它。

答案 1 :(得分:0)

所有人,如前所述,这是我在试错后提出的解决方案:

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