在vba中读取文本文件时,变量sy1 和ssy1 无法获得日期的值,请问有什么办法可以解决?
Subaa()DimCNNAsNewADODB.ConnectionDimRSTAsNewADODB.RecordsetDimStpathAsString,strSQLA...
Sub aa()
Dim CNN As New ADODB.Connection
Dim RST As New ADODB.Recordset
Dim Stpath As String, strSQL As String
Dim txtLine
Dim FileObj
Dim TextObj
Dim FilePath
Dim sy1, ssy1
Dim kk
sy1 = Format("2013 - 1 - 1", "yyyy-mm-dd") '上月1
ssy1 = Format("2013-01-31", "yyyy-mm-dd") '上上月1
FilePath = "C:\text1.txt"
Set FileObj = CreateObject("Scripting.FileSystemObject")
Set TextObj = FileObj.OpenTextFile(FilePath)
Do While Not TextObj.AtEndOfLine
txtLine = txtLine & TextObj.ReadLine
Loop
'txtline内容为:select top 10 * from t_rm_daysum where oper_date between " & sy1 & " and " & ssy1 & "
Stpath = "Provider=SQLOLEDB;Server=0.0.0.0,8052;Database=bf;Uid=user;Pwd=300900;"
CNN.Open Stpath
strSQL = txtLine
RST.Open strSQL, CNN
Worksheets("基础表1").Cells(i, 1).CopyFromRecordset RST
Set RST = Nothing
Set CNN = Nothing
i = i + 1
End Sub 展开
Dim CNN As New ADODB.Connection
Dim RST As New ADODB.Recordset
Dim Stpath As String, strSQL As String
Dim txtLine
Dim FileObj
Dim TextObj
Dim FilePath
Dim sy1, ssy1
Dim kk
sy1 = Format("2013 - 1 - 1", "yyyy-mm-dd") '上月1
ssy1 = Format("2013-01-31", "yyyy-mm-dd") '上上月1
FilePath = "C:\text1.txt"
Set FileObj = CreateObject("Scripting.FileSystemObject")
Set TextObj = FileObj.OpenTextFile(FilePath)
Do While Not TextObj.AtEndOfLine
txtLine = txtLine & TextObj.ReadLine
Loop
'txtline内容为:select top 10 * from t_rm_daysum where oper_date between " & sy1 & " and " & ssy1 & "
Stpath = "Provider=SQLOLEDB;Server=0.0.0.0,8052;Database=bf;Uid=user;Pwd=300900;"
CNN.Open Stpath
strSQL = txtLine
RST.Open strSQL, CNN
Worksheets("基础表1").Cells(i, 1).CopyFromRecordset RST
Set RST = Nothing
Set CNN = Nothing
i = i + 1
End Sub 展开
3个回答
展开全部
strSQL = txtLine
改为
strSQL = Replace(txtLine, """ & sy1 & """, "'" & sy1 & "'")
strSQL = Replace(strSQL, """ & ssy1 & """, "'" & ssy1 & "'")
你想明白是什么错误了么?你把sy1和ssy1放入文本文件中,再读出来的时候,它们就成为文本的一部分了,VB怎么会知道它们是变量呢?我知道你的目的是把SQL字串放入文本文件中方便调用,而且可以随意修改,但这只适用于固定的SQL字串,对于含变量的是不适用的,VB(包括VBA)没有宏的功能,但VBScript则有。
我的方法是把字串中的变量重新替换为程序中变量值,但这显然不是你最初想实现的目的。
变通的方法是用一些约定的符号来替换变量,使用的时候再替换回来,比如
select top 10 * from t_rm_daysum where oper_date between '$1' and '$2'
这是用$1和$2分别表示要动态变换的两处地方,然后使用的时候可以这样:
strSQL = Replace(txtLine, "$1", sy1)
strSQL = Replace(strSQL, "$2", ssy1)
这样就简单明朗多了。
改为
strSQL = Replace(txtLine, """ & sy1 & """, "'" & sy1 & "'")
strSQL = Replace(strSQL, """ & ssy1 & """, "'" & ssy1 & "'")
你想明白是什么错误了么?你把sy1和ssy1放入文本文件中,再读出来的时候,它们就成为文本的一部分了,VB怎么会知道它们是变量呢?我知道你的目的是把SQL字串放入文本文件中方便调用,而且可以随意修改,但这只适用于固定的SQL字串,对于含变量的是不适用的,VB(包括VBA)没有宏的功能,但VBScript则有。
我的方法是把字串中的变量重新替换为程序中变量值,但这显然不是你最初想实现的目的。
变通的方法是用一些约定的符号来替换变量,使用的时候再替换回来,比如
select top 10 * from t_rm_daysum where oper_date between '$1' and '$2'
这是用$1和$2分别表示要动态变换的两处地方,然后使用的时候可以这样:
strSQL = Replace(txtLine, "$1", sy1)
strSQL = Replace(strSQL, "$2", ssy1)
这样就简单明朗多了。
追问
除此之外就没有别的方法吗?因为我的sql语句特别长,直接放vb里面,字符太多,运行不了,才不得已这么做,有没有别的更好的办法?因为替代的话,涉及到的变量也很多,
追答
VB中你可以分行写的,就不会出现字符太多的情况了。比如:
strSQL = "select * from ........"
strSQL = strSQL & " where xxxx=aaaa ......."
strSQL = strSQL & " order by xxxx ......."
......
RST.Open strSQL, CNN
或者
strSQL = "select * from ........ _
where xxxx=aaaa ....... _
....... _
order by xxxxx ........"
RST.Open strSQL, CNN
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询