我正在通过VBA构建一个协调工具,它可以自动从我的oracle数据库和工作表中查询。当我运行查询时,我希望用户输入要查询的ITEM(在这种情况下是管道)(工作表有很多项)和结束/开始日期。我无法搞清楚以下内容:
1)正在查询 - 如果值为NULL,我怎么告诉它打印出“DATA NOT AVAILABLE”
2)当我查询管道B时,如何清除管道A的旧输出?
3)我的日期在Oracle中保存为字符串 - 如何将其转换为日期?
谢谢!
这是我到目前为止所做的:
Option Explicit
Option Base 1
Dim cnnObject As ADODB.Connection
Dim rsObject As ADODB.Recordset
Dim strGPOTSConnectionString As String
Dim startDate As Date
Dim endDate As Date
Dim strPipelineName As String
Dim strQuery As String
Sub ClickButton2()
Debug.Print ("Button has been clicked")
Dim Pipeline As String
Dim DateStart As Date
Dim DateEnd As Date
Pipeline = InputBox("Enter PipeLine", "My Application", "Default Value")
DateStart = InputBox("Enter Start Date", "My Application", DateTime.Date)
DateEnd = InputBox("Enter End Date", "My Application", DateTime.Date + 1)
Pipeline = Range("B1").Value
DateStart = Range("B2").Value
DateEnd = Range("B3").Value
strQuery = "select pipelineflow.lciid lciid, ldate, volume, capacity, status, " & _
"pipeline, station, stationname, drn, state, county, owneroperator, companycode, " & _
"pointcode, pottypeind, flowdirection, pointname, facilitytype, pointlocator, " & _
"pidgridcode from pipelineflow, pipelineproperties " & _
"where pipelineflow.lciid = piplineproperties.lciid " & _
"and pipelineflow.audit_active = 1 " & _
"and pipelineproperties.audit_active =1 " & _
"and pipelineflow.ldate >= '" & Format(DateStart, "dd-MMM-yyyy") & "' and pipelineflow.ldate < '" & Format(DateEnd, "dd-MMM-yyyy") & "' " & _
"and pipelineflow.ldate >= '" & DateStart & "' and pipelineflow.ldate < '" & DateEnd & "' " & _
"and pipelineproperties.pipeline = '" & Pipeline & "' "
Call PullZaiNetData(strQuery)
Call TieOut
End Sub
Sub PullZaiNetData2(ByVal strQry As String)
Set cnnObject = New ADODB.Connection
Set rsObject = New ADODB.Recordset
strGPOTSConnectionString = "DRIVER={Microsoft ODBC for Oracle}; SERVER=hhh; PWD=hhhh; UID=hhh"
cnnObject.Open strGPOTSConnectionString
rsObject.Open strQry, cnnObject, adOpenStatic
Worksheets("ZaiNet Data").Cells(1, 1).CopyFromRecordset rsObject
rsObject.Close
cnnObject.Close
Set rsObject = Nothing
Set cnnObject = Nothing
End Sub
Sub TieOut()
End Sub
答案 0 :(得分:2)
由于您更改了问题,我将添加其他答案。
1)正在查询 - 如果值为NULL,我怎么能告诉它打印出“DATA NOT AVAILABLE”
哪个值?我怀疑你的意思是什么时候查询没有返回任何记录。要检查这一点,请测试rsObject.RecordCount = 0:
Dim ws As Worksheet
Set ws = Worksheets("ZaiNet Data")
ws.UsedRange.Clear '' remove results of previous query if any
If rsObject.RecordCount = 0 Then
ws.Cells(1, 1) = "DATA NOT AVAILABLE"
Else
ws.Cells(1, 1).CopyFromRecordset rsObject
End If
您还可以测试rsObject.BOF或rsObject.EOF中的一个或两个为true(分别为“文件开头”或“文件结尾”)。
在VBA中开发内容时,尤其是在使用我不熟悉的新功能时,我会进行大量测试,将内容输出到立即窗口。为了解决这个问题,我使用了以下小程序:
Sub Say(s as String)
Debug.Print s
End Sub
这样可以更容易地生成一直输入“Debug.Print”的测试输出(甚至比输入“Debug.P”+使用Intellisense输入更容易)。
因此,当您打开记录集时,请在其后显示记录计数:
rsObject.Open strQry, cnnObject, adOpenStatic
Say rsObject.RecordCount & " records"
在您想要验证值时,请执行类似的操作。
稍后,如果要在文本文件中捕获调试语句,只需更改Say()例程的操作。
2)当我查询管道B时,如何清除管道A的旧输出?
如上文所示:
ws.UsedRange.Clear '' remove results of previous query if any
3)我的日期在Oracle中保存为字符串 - 如何将其转换为日期?
您在技术上不需要将生成的日期字符串转换为日期值,您可能会发现只需将它们放在单元格中,Excel就会将它们视为日期值。
您只需确保将用户的日期转换为数据库所期望的格式。
上面的查询字符串仍显示包含用户日期的两行。使用Format()将它们转换为“dd-MMM-yyyy”格式的是您要保留的格式。删除另一行,确保字符串连接语法仍然正确。
要将日期字符串实际转换为日期值,您可以使用CDate()函数:
Sub DateTest()
Dim sDate As String
Dim dDate As Date
sDate = "09-Jul-2009"
dDate = CDate(sDate)
Say "sDate = " & sDate
Say "dDate = " & dDate
dDate = dDate + 1
Say "dDate = " & dDate
End Sub
Immediate Window output:
sDate = 09-Jul-2009
dDate = 7/9/2009
dDate = 7/10/2009
我们可以验证它是否将字符串转换为日期值,因为它以我的机器的默认日期格式显示,并响应日期数学(添加1天)。
答案 1 :(得分:0)
对先前问题的回答(转述):
1)“如何确保结束日期在开始日期之后”:
有效日期值是浮点数,因此DateEnd应为&gt; = DateStart。整数部分是自1900-01-01以来的天数。小数部分是当前时间(例如,中午12点= 0.5)。
2)“为日期使用花哨的日历条目控件”
查看Insert&gt;下可用的控件。对象菜单(在Excel 2003及更早版本中 - 它也在2007年,但在不同的地方)。其中一个是Calendar控件。在“对象”列表中双击它会将其插入当前单元格并将工作表置于“设计模式”中。右键单击该控件并选择“属性”。在LinkedCell字段中键入单元格地址。然后单击应弹出的小工具栏上的“退出设计模式”按钮。现在,当您在控件上选择日期时,它将在您将其链接到的单元格中显示该值。
类似地,有一个下拉列表控件可用于选择管道类型。
3)“为什么我在DateEnd = Range(”B3“)上收到错误。值?”
DateEnd错误可能是由于我指定的单元格中的值丢失或无效,正如我在评论中提到的那样。
你在做什么版本的Excel? Excel 2003