我有一个Excel Spreadsheeet。
有一个包含连接名称和姓氏的单元格(不要问为什么),例如:
Cell A2 BLOGGSJOE
在这个单元格中,我想运行以下SQL并将其输出到单元格A3,A4和A5
SELECT i.id, i.forename, i.surname FROM individual i WHERE UPPER(REPLACE('" & A2 & "', ' ', '')) = UPPER(REPLACE(i.surname|| i.forename, ' ', '')) AND NVL(i.ind_efface, 'N') = 'N'
知道如何在每个单元格上执行oracle查询并返回结果吗?
我在Excel中启用了oracle数据源连接,但不知道现在该做什么。
这是一种愚蠢的方法,你能推荐一种更好的方法吗?
非常感谢!我在这类事情上缺乏必要的经验! : - )
编辑:我知道我可以写一个简单的ruby / php / python /无论什么脚本循环遍历excel电子表格(或csv文件),然后执行查询等但我认为可能会有一个快速在excel本身的方式。答案 0 :(得分:2)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Set cn = New ADODB.Connection
cn.ConnectionString = 'Get one from http://www.connectionstrings.com/oracle
'eg. "Driver={Oracle in OraHome92};Dbq=tns;Uid=uid;Pwd=pwd;"
cn.Open
sql = Your SQL
Set rs = cn.Execute(sql)
for loop or something to paste records
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
如果您正确格式化电子表格,则可以将rs指定给Variant,然后将变量指定给范围而不是循环遍历它。
修改强>
使用当前的SQL,您需要遍历每个单元格并查询数据库,然后将结果保存到A3:A5。 编辑2 ,类似的东西:
Private Function GetRow(user As String) As Variant
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String
Dim v As Variant
Set cn = New ADODB.Connection
cn.ConnectionString = "Driver={Oracle in OraHome92};Dbq=tns;Uid=uid;Pwd=pwd;"
cn.Open
sql = "SELECT i.id, i.forename, i.surname FROM individual i WHERE UPPER(REPLACE('" & user & "', ' ', '')) = UPPER(REPLACE(i.surname|| i.forename, ' ', '')) AND NVL(i.ind_efface, 'N') = 'N'"
Set rs = cn.Execute(sql)
v = rs.GetRows()
GetRow = v
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
Sub a()
Dim user As String
For i = 2 To x
user = ActiveSheet.Cells(i, 1).Value
GetRow (user)
ActiveSheet.Cells(i, 2).Value = GetRow(0)
ActiveSheet.Cells(i, 3).Value = GetRow(1)
ActiveSheet.Cells(i, 4).Value = GetRow(2)
Next
End Sub
请注意,我使用了您想要的不同单元格,而GetRow是2D而不是1D,但我很难将其编写而无法访问实际的电子表格/ db
答案 1 :(得分:0)
请检查我的回答here。 使用该代码,您可以调用Oracle查询(递归或不递归)。 我认为这会更快: