2010-06-02 100 views
2

我有一个Excel Spreadsheeet。Excel电子表格 - 在单元格上执行Oracle查询的最佳方式

有包含级联姓名细胞(不要问为什么),例如:

单元格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

这是什么意思,在A2单元上运行这个SQL? A2单元格是否与这个问题有关? – Mike 2010-06-02 11:28:17

+0

的确,我需要使用单元格的内容在SQL中执行where标准。 – Flukey 2010-06-02 11:32:36

回答

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 

上进行查找在Excel中,如果你格式化你的电子表格正常,你可以分配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

+0

非常好!非常感谢。我非常感谢你为此付出的努力。它工作得很好! :d – Flukey 2010-06-02 12:16:21

0

请检查我的回答here。 使用该代码,您可以调用您的Oracle查询(递归或不递归)。 我认为这将是更快:

  1. 先建的项目列表进行检索(BLOGGSJOE,JOEBAR,JUSTINCASE)
  2. 然后使用一个单独的列表检索您的Oracle数据(BLOGGSJOE,JOEBAR, JUSTINCASE)作为标准
  3. 最后是新下载列表