当前位置: 首页 > 面试题库 >

如何在Excel工作表中的命名范围上运行SQL语句?

金兴朝
2023-03-14
问题内容

我要做的就是在excel工作表上使用标准范围(例如,命名范围,甚至A1:F100),并在其中运行一些sql查询,然后返回一个记录集,我可以在VBA代码中逐步执行该记录集,甚至只是粘贴到同一工作簿中的其他工作表中。

使用ADODB是一个想法,但是如何设置连接字符串以指向当前工作簿中的某个范围?

我知道在使用Microsoft查询向导之前,这并不理想,但是可以使用。我似乎无法使它仅引用其他excel文件来引用工作表中的范围。

这是我剩下的功能。当我运行几次时,我的excel崩溃,并显示通常的资源不足错误消息。我已经从电子表格中删除了此功能,并且所有功能都可以无缝地多次运行,因此,这肯定是由此处的代码引起的。

我已经清理了所有对象(正确吗?)。有人有什么想法会出问题吗?连接字符串中是否可以进行某些调整,或者与GetRows方法返回的变量有关?

我正在使用MS ADO 2.8,并且也尝试过2.5具有相同的性能。

Function getTimeBuckets() As html" target="_blank">Collection

Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim dateRows As Variant
Dim i As Integer
Dim today As Date

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
Set getTimeBuckets = New Collection

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
cn.Open strCon

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] where [Instrument Type] = 'LSTOPT'"

rs.Open strSQL, cn


dateRows = rs.GetRows
rs.Close

'today = Date
today = "6-may-2009"

For i = 1 To UBound(dateRows, 2)
    If (dateRows(0, i) >= today) Then
        getTimeBuckets.Add (dateRows(0, i))
    End If
Next i

Set dateRows = Nothing
Set cn = Nothing
Set rs = Nothing
End Function

问题答案:

您可以只使用名称。

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

strFile = Workbooks(1).FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

''Pick one:
strSQL = "SELECT * FROM DataTable" ''Named range
strSQL = "SELECT * FROM [Sheet1$A1:E346]" ''Range

rs.Open strSQL, cn

Debug.Print rs.GetString

针对第2部分的问题

我注意到您只需要今天的记录,因此您应该能够将sql修改为:

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] " _
& "where [Instrument Type] = 'LSTOPT' AND [Expiration]=#" _
& Format(Date(),"yyyy/mm/dd") & "#"

您尚未关闭连接:

cn.Close

接着

 Set rs=Nothing
 Set cn=Nothing


 类似资料:
  • 我试图从另一个表中创建一个子表,其中所有的姓氏字段排序为A-Z,其中有一个电话号码字段不是null。我可以用SQL很容易做到这一点,但是我不知道如何在Excel中运行SQL查询。我很想将数据导入postgresql,然后在那里查询,但这似乎有点过分。 对于我正在尝试做的事情,SQL查询可以做到这一点。这似乎太简单了,因为它是Excel本地无法完成的事情。如何在Excel中运行这样的SQL查询?

  • 问题内容: 我刚刚(昨天)学会了使用“存在”而不是“输入”。 我对此有一些疑问: 1)据我所知,解释是: “这样做更好的原因是,将只返回匹配的值,而不是建立大量可能的结果列表” 。这是否意味着虽然第一个子查询可能返回900个结果,但第二个子查询仅返回1(是或否)? 2)过去,我曾在RDBMS中抱怨:“只能检索前1000行”,第二种方法可以解决该问题吗? 3)第二个子查询中别名的范围是什么?…别名仅

  • 我想在工作簿工作表中选择特定范围的单元格。我目前能够将一个变量设置为下面一行的工作簿工作表。 我想更进一步,能够在工作表中选择一个单元格范围,这样我就可以在定义的范围内练习数据帧功能。我的某些范围的行值大于1000。如何为所需excel范围选择可变长度行值?

  • 试图将一个范围从Sheet1复制到31张表上的相同范围,但仍然得到“运行时错误1004:工作表类的粘贴方法失败”,调试器指示是问题所在。我可以复制到一张单张没有问题,但不能复制到多张。我试着到处找,但不知道问题是什么(可能也很简单)。

  • 问题内容: 我已经在这里和Google上进行了搜索,但仍然无法解决我的问题。我正在尝试在文件中等效地使用excel的命名范围。以下内容在excel中的VBA中可用,但无法在文件中使用。 因此,我尝试了不同的引用命名空间的变体,但是没有运气。 这就是我现在所拥有的: 其中涉及一些不同的变化:采用参数ByVal,使用rng代替DATA(字符串类型), 运行时出现错误消息: Microsoft(R)Wi

  • 我正在尝试阅读大型Excel文件(大小约10MB,. xlsx)。 我正在使用下面的代码 但它显示了堆内存问题。 我还看到了StackOverflow的其他解决方案,其中一些是为了增加JVM,但我不想增加JVM。 问题1)我们不能使用,因为这仅用于编写或创建新工作簿。 我的唯一目标是获取工作表的命名范围的数量,工作表的总数及其大型Excel文件的工作表名称。