使用 SQL 将数据从工作表复制到同一工作簿中的其他工作表?
Using SQL to copy data from worksheets to other worksheets in the same workbook?
我想使用 SQL 在同一个工作簿中将数据从 sheet 移动到 sheet。
我的 sheet 很大(宽度和深度)并且处理 VBA 很慢。
场景是我有 sheets 1 到 5。
我想用 sheets 1 -5.
中的一两列创建 sheet(6)
索引键是 SKU,所有 sheets 通用。
所有 sheet 都按 SKU 开始排序。
当我在 Sheet(1) 中抓取一列时,我可以将它放在 Sheet(6) 的 A 列中。
当我抓取 sheet(2) 中的一列时,我需要确保每一行的 SKU 匹配并且来自 sheet(2) 的数据正确放置在该 SKU 的下一列中。如果该 SKU 的数据不可用,则相应的单元格留空。每一列的数据都保存在目标工作的一个选定列中sheet。
我不确定如何设置连接或记录集选择,因为我们在同一个工作簿中工作。我找不到在任何地方讨论的这个话题。确保 SKU 从所有 sheet 接收正确的数据对我来说似乎有点令人生畏。
我好像想起了无法建立ADO连接打开workbooks/sheets的事情。如果是这种情况,我将创建一个单独的工作簿来提取数据并在那里进行操作。
我非常感谢有关此主题的任何指导。这对我来说是全新的领域。
谢谢,CraigM
下面是我创建的解决方案:
我得到 sheet1,sheet2,如下图所示:
要使用 sql 复制,使用以下代码:
注意:您需要转到工具 > 参考 > 检查 Microsoft ActiveX Data Objects 2.8 Library 和 Microsoft Forms 2.0 Object Library
Sub SQLCopy()
Dim MyConnection As ADODB.Connection
Dim MyRecord As ADODB.Recordset
Set MyConnection = New ADODB.Connection
Set MyRecord = New ADODB.Recordset
' This is the Excel 97-2003 connection string. It should also work with
' Excel 2007 onwards worksheets as long as they have less than 65536
' rows
With MyConnection
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=Excel 8.0;"
.Open
End With
MyRecord.Open "SELECT [Sheet1$].[SKU],[SecondDATA] FROM [Sheet1$],[Sheet2$] WHERE " & _
"[Sheet1$].[SKU] = " & _
"[Sheet2$].[SKU]", MyConnection
Sheets("Sheet3").Cells(2, 1).CopyFromRecordset MyRecord
MyRecord.Close
MyConnection.Close
End Sub
以下是sheet3
处的结果
很棒的解决方案,keong kenshih!
我正在查看 Microsoft 文档,当我阅读它时,它表明您不能在打开的工作簿上使用 SQL。
感谢您提供概念验证代码。我将在接下来的几天内将其合并到我的项目中。应该会带来很大的性能提升。
我将从使用 .jet 提供程序更改为使用 .ace 提供程序以与更新版本的 Excel 兼容。
Nick.McDermaid: 由于Excel中的数据经常更新,我无法将所有数据移动到数据库中。我很幸运客户甚至 Excel 他们是如此落后。他们没有数据库的概念。他们停留在 1970 年代的雅虎。
再次感谢大家的评论!
我想使用 SQL 在同一个工作簿中将数据从 sheet 移动到 sheet。
我的 sheet 很大(宽度和深度)并且处理 VBA 很慢。
场景是我有 sheets 1 到 5。
我想用 sheets 1 -5.
中的一两列创建 sheet(6)
索引键是 SKU,所有 sheets 通用。
所有 sheet 都按 SKU 开始排序。
当我在 Sheet(1) 中抓取一列时,我可以将它放在 Sheet(6) 的 A 列中。 当我抓取 sheet(2) 中的一列时,我需要确保每一行的 SKU 匹配并且来自 sheet(2) 的数据正确放置在该 SKU 的下一列中。如果该 SKU 的数据不可用,则相应的单元格留空。每一列的数据都保存在目标工作的一个选定列中sheet。
我不确定如何设置连接或记录集选择,因为我们在同一个工作簿中工作。我找不到在任何地方讨论的这个话题。确保 SKU 从所有 sheet 接收正确的数据对我来说似乎有点令人生畏。
我好像想起了无法建立ADO连接打开workbooks/sheets的事情。如果是这种情况,我将创建一个单独的工作簿来提取数据并在那里进行操作。
我非常感谢有关此主题的任何指导。这对我来说是全新的领域。
谢谢,CraigM
下面是我创建的解决方案:
我得到 sheet1,sheet2,如下图所示:
要使用 sql 复制,使用以下代码:
注意:您需要转到工具 > 参考 > 检查 Microsoft ActiveX Data Objects 2.8 Library 和 Microsoft Forms 2.0 Object Library
Sub SQLCopy()
Dim MyConnection As ADODB.Connection
Dim MyRecord As ADODB.Recordset
Set MyConnection = New ADODB.Connection
Set MyRecord = New ADODB.Recordset
' This is the Excel 97-2003 connection string. It should also work with
' Excel 2007 onwards worksheets as long as they have less than 65536
' rows
With MyConnection
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=Excel 8.0;"
.Open
End With
MyRecord.Open "SELECT [Sheet1$].[SKU],[SecondDATA] FROM [Sheet1$],[Sheet2$] WHERE " & _
"[Sheet1$].[SKU] = " & _
"[Sheet2$].[SKU]", MyConnection
Sheets("Sheet3").Cells(2, 1).CopyFromRecordset MyRecord
MyRecord.Close
MyConnection.Close
End Sub
以下是sheet3
处的结果
很棒的解决方案,keong kenshih!
我正在查看 Microsoft 文档,当我阅读它时,它表明您不能在打开的工作簿上使用 SQL。
感谢您提供概念验证代码。我将在接下来的几天内将其合并到我的项目中。应该会带来很大的性能提升。
我将从使用 .jet 提供程序更改为使用 .ace 提供程序以与更新版本的 Excel 兼容。
Nick.McDermaid: 由于Excel中的数据经常更新,我无法将所有数据移动到数据库中。我很幸运客户甚至 Excel 他们是如此落后。他们没有数据库的概念。他们停留在 1970 年代的雅虎。
再次感谢大家的评论!