在Excel中为date范围创build一个“框”

以下通过单击一个button来提取信息:

Sub Sales() Dim StrSQl As String Con = "Provider=IBMDA400;Data Source=XXX.XXX.XXX.XXX;User Id=yyyy;Password=zzzz" Set Db = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.recordset") Db.connectionSTring = Con Db.Open StrSQl = "select myuc, sum (myac) as Amount from myabc.myqwerty where mydt >= 20100101 and mydt <= 20100831 group by (mycl)" rs.Open StrSQl, Db, 3, 3 Sheet2.Cells(1, 1).CopyFromRecordset rs rs.Close Set rs = Nothing Set cn = Nothing End Sub 

如何在Excel中创build一个“框”来在点击button之前selectdate范围(mydt> = 20100101和mydt <= 20100831)?

在VBA窗口中,您可以插入一个用户窗体。 通过单击插入菜单项。

然后,您可以添加几个文本框和一个button的forms。 另外,你可以添加一个dateselect控件,这将是eaiser为用户input正确的date。

在button的点击事件,你会从文本框中检索信息。 我会添加一些参数到SQLstring,并将它们添加到一个ADO命令对象。 你会最终得到类似于下面的东西。

 Sub Button1_Click() Dim strSql As String Dim cmd As ADODB.Command Dim db As ADODB.Connection Dim rs As ADODB.Recordset if IsDate(TextBox1.Text) and IsDate(TextBox2.Text) then Set db = New ADODB.Connection Set rs = New ADODB.Recordset Set cmd = New ADODB.Command db.ConnectionString = "Provider=IBMDA400;Data Source=XXX.XXX.XXX.XXX;User Id=yyyy;Password=zzzz" db.Open Set cmd.ActiveConnection = db strSql = "select myuc, sum (myac) as Amount from myabc.myqwerty where mydt >= ? and mydt <= ? group by (mycl)" cmd.CommandText = strSql cmd.CommandType = adCmdText cmd.Parameters(0).Value = CDate(TextBox1.Text) cmd.Parameters(1).Value = CDate(TextBox2.Text) Set rs = cmd.Execute Sheet2.Cells(1, 1).CopyFromRecordset rs rs.Close Set rs = Nothing Set db = Nothing Else MsgBox "Please ensure that you enter a Date in the to To and From boxes" End If End Sub Private Sub UserForm_Initialize() TextBox1.Text = DateTime.Date - 7 TextBox2.Text = DateTime.Date + 1 End Sub 

编辑
我通过删除命名参数更新了代码,并用问号replace。 这只是让eaiser,因为命令对象为你创build参数,你只需要设置值。 有一点要注意的是参数的顺序。 我在Excel 2007中执行了这个代码,唯一改变的是连接string和SqlString。 validation它的工作。

编辑2
通过工具 – >参考添加对Microsoft Activex数据对象(ADO)的引用。

编辑3
添加了一些validation,以确保用户inputdate。

编辑4
添加了文本框的初始化,以设置一周之前到今天的一些默认date。

编辑5检查文本框名称是否与代码中的名称匹配。 他们应该是一样的。 演示屏幕截图