如何运行查询,使用VBAmacros和Excel自动化,使“加载”function,同时协调?

我正在通过VBA构build一个协调工具,从我的oracle数据库和工作表中自动查询。 当我运行查询时,我希望用户input要查询的项目(在这种情况下是pipe道)(工作表中有许多项目)和结束/开始date。 我无法弄清以下几点:

1)它是查询 – 如果值是NULL,我怎么可以告诉它打印出“数据不可用”
2)当我查询pipe道B时,如何清理pipe道A的旧输出?
3)我的date在Oracle中保存为string – 我如何将其转换为date?
谢谢!

这是我到目前为止:

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 

既然你改变了你的问题,我会再添加一个答案。

1)它是查询 – 如果值是NULL,我怎么可以告诉它打印出“数据不可用”

哪个价值? 我怀疑你的意思是当查询返回没有logging。 要检查这个,testingrsObject.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 

您也可以testingrsObject.BOF或rsObject.EOF中的一个或两个为真(分别为“文件开始”或“文件结束”)。

在VBA中开发事情时,尤其是使用我不熟悉的新function时,我会做大量的testing,将事情输出到即时窗口。 为了解决这个问题,我使用了下面的一些例程:

 Sub Say(s as String) Debug.Print s End Sub 

它使得生成testing输出的能力变得更加容易,这种输出一直在input“Debug.Print”(甚至比使用Intellisenseinput“Debug.P”+ Enter稍微简单一些)。

所以当你打开你的logging集时,显示它之后的logging数:

 rsObject.Open strQry, cnnObject, adOpenStatic Say rsObject.RecordCount & " records" 

每当你想要validation一个值,就做这样的事情。

稍后,如果您想要在文本文件中捕获debugging语句,则只需更改Say()例程的操作即可。

2)当我查询pipe道B时,如何清理pipe道A的旧输出?

如上文所示:

 ws.UsedRange.Clear '' remove results of previous query if any 

3)我的date在Oracle中保存为string – 我如何将其转换为date?

您在技术上不需要将结果datestring转换为date值,您可能会发现只要将它们放入单元格中,Excel就会将它们视为date值。

您只需确保将用户的date转换为数据库预期的格式即可。

上面的查询string仍然显示两行合并用户的date。 使用Format()将其转换为“dd-MMM-yyyy”格式的格式是您要保留的格式。 删除其他行,确保你的string连接的语法仍然是正确的。

要实际上将datestring转换为date值,可以使用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 

我们可以validation它是否将string转换为date值,因为它显示为我的机器的默认date格式,并对datemath(加1天)作出响应。

回答以前的问题(释义):

1)“如何确定结束date是在开始date之后”:

有效的date值是浮点数,所以DateEnd应该> = DateStart。 整数部分是自1900-01-01以来的天数。 小数部分是当前的一天中的时间(例如,12中午= 0.5)。

2)“使用花式日历input控件的date”

查看“插入”>“对象”菜单下的控件(在Excel 2003及更早版本中 – 也是在2007年,但在不同的位置)。 其中之一是日历控件。 在“对象”列表中双击它将把它插入到当前单元格中,并将表单放入devise模式。 右键单击控件并select“属性”。 在LinkedCell字段中input单元格地址。 然后点击应该popup的小工具栏上的“退出devise模式”button。 现在,当您在控件上select一个date时,它将显示您链接到的单元格中的值。

同样的,还有一个下拉列表控件可以用来select你的pipe道types。

3)“为什么我在DateEnd = Range(”B3“)上得到一个错误。

DateEnd错误可能是由于您指定的单元格中缺less或无效的值,正如我在我的评论中所述。

你在做什么版本的Excel? Excel 2003