I am trying to connect to an SQL Server and pull certain data with a certain date range, so that the user just adds the year they want to pull and it will get all the data for that year.
The query works in SQL, but as soon as I add it to VBA it pulls nothing. Can someone please help or explain to me why?
At the moment I can connect to the database and my data record works because if I use a smaller query it works fine.
Option Explicit
Sub ADOExcelSQLServer()
Dim conn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim Data As ADODB.Recordset
Server_Name = "******" ' Enter your server name here
Database_Name = "******" ' Enter your database name here
User_ID = "*****" ' enter your user ID here
Password = "*****" ' Enter your password here
Set conn = New ADODB.Connection
Set Data = New ADODB.Recordset
conn.ConnectionString = "Provider=SQLNCLI10;Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";"
conn.Open
On Error GoTo CloseConnection
With Data
.ActiveConnection = conn
.Source = GetYearString
.LockType = adLockReadOnly
.CursorType = adOpenForwardOnly
.Open
End With
Sheets("Sheet3").Range("D4:O4").CopyFromRecordset Data
On Error GoTo 0
Data.Close
CloseConnection:
conn.Close
End Sub
Function GetYearString() As String
Dim Year As Integer
Dim SQLString As String
Year = Application.InputBox("Enter the Year of choice ?", Type:=1)
SQLString = "DECLARE @Test TABLE"
SQLString = SQLString & "("
SQLString = SQLString & "ID INT IDENTITY(1,1),"
SQLString = SQLString & "Value Float"
SQLString = SQLString & ")"
SQLString = SQLString & "DECLARE @InputDate DATETIME"
SQLString = SQLString & "SET @InputDate = '" & Year & "-01-01'"
SQLString = SQLString & "WHILE @InputDate <= CAST('" & Year & "-12-01' AS DATETIME)"
SQLString = SQLString & "BEGIN"
SQLString = SQLString & "DECLARE @MonthStartDate DATETIME"
SQLString = SQLString & "SELECT @MonthStartDate = CAST(DATEADD(dd, - DATEPART(dd, @InputDate) + 1, @InputDate)AS DATETIME)"
SQLString = SQLString & "INSERT INTO @Test"
SQLString = SQLString & "SELECT MAX([Value])*2 FROM DataLog2"
SQLString = SQLString & "WHERE DateAdd(HOUR,2,TimestampUTC) >= @MonthStartDate AND DateAdd(HOUR,2,TimestampUTC) < DATEADD(DAY,1,@MonthStartDate) AND SourceID = 26 AND quantityid = 129"
SQLString = SQLString & "SET @InputDate = DATEADD(MONTH, 1, @InputDate)"
SQLString = SQLString & "End"
SQLString = SQLString & "SELECT Value FROM @Test"
GetYearString = SQLString
End Function