我有一个包含数字列表(列a)的Excel工作表。根据这个数字范围,我需要从Oracle数据库的表中检索选定的列,并将其带回Excel的B列中。
我打算将包含vba代码的电子表格部署给其他用户,因此我不希望将方法硬编码到特定的计算机上。
我有以下信息: Oracle数据库名称、Oracle用户名、Oracle密码、Oracle表名
我在网上找到一段代码,它使用一个公式来调用vba代码来连接到Oracle。返回结果时,我收到#Value错误消息。在列B1中有一个公式=GetToadData( A1 ),它检索列A1中的查找值。这将触发VBA函数代码连接到Oracle并检索所请求的数据HANDSET_SERIAL_NUMBER_NEW SERVREQ_TRANSACTION_TS。
我将获得#value作为公式结果,这意味着我的sql代码或连接字符串有问题。如果需要的话,我可以澄清任何事情。
XXXXX =用户定义输入
Function GetToadData(IMEI)
Dim Conn As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim Cmd As New ADODB.Command
Conn.Open "PROVIDER=MSDAORA.Oracle;DATA SOURCE=XXXXX;USER ID=XXXXX;PASSWORD=XXXXX"
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandText = "select HANDSET_SERIAL_NUMBER_NEW, SERVREQ_TRANSACTION_TS, from mi_tempadm.wome_tm_data_new where HANDSET_SERIAL_NUMBER_NEW = IMEI;"
Set RS = Cmd.Execute
GetToadData = RS.Fields(0).Value
End Function
发布于 2019-03-22 05:26:44
如果您的IMEI是数字,则:
Cmd.CommandText = "select HANDSET_SERIAL_NUMBER_NEW, SERVREQ_TRANSACTION_TS, " & _
" from mi_tempadm.wome_tm_data_new where HANDSET_SERIAL_NUMBER_NEW = " & IMEI
如果不是数字,则用'
括起来
如果为RS.EOF
(未找到匹配项),请不要忘记添加检查
尝试从子函数调用您的函数,任何错误都将更加明显:
Sub testOracle()
Debug.Print GetToadData(1234)
End sub
编辑-缓存示例(未经测试)
Function GetToadData(IMEI)
Dim Conn As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim Cmd As New ADODB.Command
Static cache as Object
'create cache if not already created
If cache Is Nothing Then Set cache = CreateObject("scripting.dictionary")
If Not cache.exists(IMEI) Then
Conn.Open "PROVIDER=MSDAORA.Oracle;DATA SOURCE=XXXXX;" & _
"USER ID=XXXXX;PASSWORD=XXXXX"
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandText = " select HANDSET_SERIAL_NUMBER_NEW, SERVREQ_TRANSACTION_TS, " & _
" from mi_tempadm.wome_tm_data_new " & _
" where HANDSET_SERIAL_NUMBER_NEW=" & IMEI
Set RS = Cmd.Execute
If Not RS.EOF Then
cache(IMEI) = RS.Fields(0).Value
Else
cache(IMEI) = "????"
End If
End If 'not cached
GetToadData = cache(IMEI)
End Function
https://stackoverflow.com/questions/55288045
复制相似问题