2017-05-02 19 views
0

Excel VBAとSQL Serverを使用してDISTINCT値を取得しようとしています。私はDBへの接続を確立し、他のクエリを実行することができます。ただし、次のSQLクエリは、私のVBAコードが破損する原因:Excel VBAの問題を使用してSQL Serverを照会

SQL文:

Select DISTINCT ZoneName, IsoName From vDeal 
Where PeriodMonth >= '2015-03-01' 
Order by IsoName, ZoneName ASC 

エクセルVBA:

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _ 
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$; & _ 
    Location=LOADZONE_DISTINCT", Destination:=Range("$C$1")).QueryTable 
    .CommandText = "Select DISTINCT ZoneName, IsoName From vDeal Where PeriodMonth >= & _ 
     '2015-03-01' Order by IsoName, ZoneName ASC" 
    .CommandType = xlCmdSql 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .PreserveColumnInfo = True 
    .ListObject.DisplayName = "LOADZONE_DISTINCT" 
    .Refresh BackgroundQuery:=False 
End With 

The field PeriodMonth is a date formatted "yyyy-mm-dd"

Excel error: "Run-time error '1004': Application-defined or object defined error

SQLクエリは、MS SQLサーブの管理に完璧に動作しますスタジオでは、Excel側で内訳が必要です。 VBA側で参照ライブラリが見つからないか、または日付書式の問題ですか?

+0

これらの行継続をポストの目的で追加しましたか、コードはVBEエディタと同じですか?文字列リテラルは、このように複数の行にまたがることはできないので...そのコードはコンパイルされません。 –

答えて

0

のために、このライン

.CommandText = " Select DISTINCT ZoneName, IsoName From vDeal Where PeriodMonth >= " & _ 
    " '2015-03-01' Order by IsoName, ZoneName ASC " 

を変更してくださいは、ActiveXデータオブジェクトを使用して別の方法でそれを働きました。

Dim strSql As String 
Dim rs As ADODB.Recordset 
Dim conn As ADODB.Connection 

Dim wks As Worksheet 
Set wks = ThisWorkbook.Worksheets("Sheet1") 

Set rs = New ADODB.Recordset 
Set conn = New ADODB.Connection 

conn.ConnectionString = "Provider=####;Data Source=####;Initial Catalog=####;User ID=####;Password=####" 
conn.ConnectionTimeout = 300 
conn.CursorLocation = adUseClient 
conn.Open 

strSql1 = "Select DISTINCT ZoneName, IsoName From vDeal Where ZoneName Is NOT NULL and IsoName IS NOT NULL and PeriodMonth > '2015-03-01' Order by IsoName, ZoneName ASC" 

rs.Open strSql1, conn 
If rs.RecordCount = 0 Then 
    wks.Range(Cells(1, 1).Address).Value = "No Data" 
Else 
    wks.Range(Cells(1, 1).Address).CopyFromRecordset rs 
    For i = 0 To rs.Fields.Count - 1 
     wks.Range(Cells(1, 1).Address).Range("A1").Offset(0, i) = rs.Fields.Item(i).Name 
    Next i 
End If 

rs.Close 

Microsoft ActiveX Data Objects 2.8ライブラリをVBAリファレンスで使用する。

関連する問題