2009-07-09 66 views
1

我正在通过VBA构建一个对帐工具,它可以自动执行来自我的oracle数据库和工作表的查询。当我运行查询时,我希望用户输入要查询的项目(在这种情况下为管道)(工作表中有许多项目)和结束/开始日期。我有麻烦搞清楚以下几点:如何运行查询,使用VBA宏和Excel自动化,在协调时进行“加载”功能?

1)它查询 - 如果该值为NULL,请问有什么可以告诉它打印出“数据不可用”
2)我怎样才能清理旧管道A的输出,当我查询管道B时?
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

你的代码有点难以阅读。你需要删除你没有使用的声明(startDate,endDate,strPipelineName),并且你应该正确地缩进东西。 你用“DateEnd = Range(”B3“)得到了什么错误。那个牢房里有什么东西?这是一个有效的日期值吗? 此外,您分配这些值的每个值两次。它看起来像是将答案中的代码复制到上一个问题而不会看到重复。这些只是用户输入或单元格的两种不同方式的例子。 – Todd 2009-07-09 17:17:02

+0

当您构建查询字符串时,您将使用ldate复制该行,一次使用Format()函数,一次不使用。 此外,你的连接字符串是否是一个真正的密码?你需要从示例代码中删除它。您应该创建一个系统DSN,并简单地将其称为连接字符串,而不是所有这些详细信息。 – Todd 2009-07-09 17:21:29

回答

0

回答前面的问题(转述):

1) “如何确保结束日期为起始日期之后”:

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

2)“用花哨的日历项管制的日期”

看那控制插入>对象菜单下(在Excel 2003和更早版本 - 它在2007年也是如此,但在不同的地方) 。其中之一是日历控件。在“对象”列表中双击它将把它插入到当前单元格中并将表单放入设计模式。右键单击控件并选择“属性”。在LinkedCell字段中输入单元格地址。然后点击应该弹出的小工具栏中的“退出设计模式”按钮。现在,当您在控件上选择一个日期时,它会显示您链接到的单元格中的值。

同样有一个下拉列表控件,您可以用来选择您的管道类型。

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

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

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

2

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

1)它查询 - 如果该值为NULL,请问有什么可以告诉它打印出“数据不可用”

哪些价值?我怀疑你的意思是当查询没有返回记录时。要对此进行检查,对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(分别为“开头的文件”或“文件结束”为真)。

在VBA中开发事物时,特别是在使用我不熟悉的新功能时,我会进行大量测试,将事情输出到即时窗口。为了解决这个问题,我用的是下面的小程序:

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

这使得它更容易一些,以生成测试输出键入“Debug.Print”所有的时间(比打字“Debug.P”甚至稍微容易+使用智能感知输入)。

所以,当你打开你的记录,显示记录计数后:

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天)。