2013-03-06 37 views
-1
SELECT Orders.PO_No, Orders.Order_No 
FROM DBase.dbo.Orders Orders 
Where Orders.PO_No = (Select Top 1 Orders.PO_No From Orders Where Order_No = ?) 

如果我專門使用如何在Excel中使用此查詢?查詢是錯誤的還是僅僅Excel不夠強大?

SELECT Orders.PO_No, Orders.Order_No 
FROM DBase.dbo.Orders Orders 
Where Orders.PO_No = (Select Top 1 Orders.PO_No From Orders Where Order_No = '555555') 

它返回值我怎麼能寫在使用小區內的用戶輸入的值在Sheet1 $ A $ 1我已經試過此查詢?在SQL語句框下的Command Text Under Definition和MSQuery裏面。

當使用命令文本字段和?我得到調用參數1新的參數,但是當我設置參數1的值=該小區i得到如下錯誤:

[微軟] [ODBC SQL Server驅動程序]語法錯誤或訪問衝突

而且

[微軟] [ODBC SQL Server驅動程序]無效的描述符索引

即使我確保單元格的值是555555

+0

不知道這是否是問題,但我注意到,你的硬編碼查詢使用的字符串(「555555」),而你有一個存儲在Excel中的整數。 – 2013-03-06 14:25:43

+0

試圖格式化單元格作爲文本沒有幫助...我總是使用文本,我也可以有部分命令也需要使用文本,以確保它不會使555555.1和555555.10相同。 – user2140261 2013-03-06 14:46:34

+0

只是格式化爲文本可能會或可能不會做任何事情,因爲它不會更改基礎值。就像我說的,我不確定這是個問題,但最後一個嘗試的方法是將單元格的值從「555555」更改爲「555555」(帶撇號),它表示文本值。 – 2013-03-06 14:57:10

回答

0

我想出了以下VBA工作速度超快,易於更改。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$A$1" Then 
     With Range("Table_Query_from_DBase_1[[#Headers],[PO_No]]").ListObject.QueryTable 
     .CommandText = Array(_ 
     "SELECT Orders.PO_No, Orders.Order_No" & Chr(13) & "" & Chr(10) & "FROM DBase.dbo.Orders Orders" & Chr(13) & "" & Chr(10) & "Where Orders.PO_No =(Select Top 1 Orders.PO_No From Orders Where Order_No = '" & Range("A1").Value & "')" _ 
        ) 
     End With 
    End If 
End Sub 

無論何時在單元格A1中輸入新值,代碼都會自動更改CommandText(選擇語句)。

而且使用方式命令,你可以在結束與以往增加

.Refresh BackgroundQuery:=False 

包括很多事情,例如讓它自動刷新自身更改參數後。

您可以更改當CommandText的改變通過將該成分配到一個按鈕或在工作表刷新或變量

0

我很抱歉,我沒有SQLServer的方便,以測試這一點,但我的正如傑夫評論的那樣,當期望字符串時你傳遞一個Long。試試這個

Where Orders.PO_No = (Select Top 1 Orders.PO_No From Orders Where Order_No = "'" & ? & "'") 

我不知道,如果是語法是正確的,但本質上,你需要把周圍的問號報價。格式化單元格不起作用,因爲Excel只是將值放入問號所在的SQL語句中。它不會評估單元格的值,並且包含字符串或哈希引用的日期或類似的內容。即使單元格值是字母(而不是看起來像數字的字符串),由於缺少單引號,SQL也不起作用。

我想。

+0

我也試過了。任何時候我使用Excel中內置的MS Query參數總是表示爲?沒有「'」 – user2140261 2013-03-06 15:41:30

+0

例如這工作沒有問題'選擇頂部1 Orders.PO_No從訂單哪裏Order_No =?'並返回所需的結果而當使用硬編碼的值,因爲我在問題中也有效,但由於某種原因組合不起作用。 – user2140261 2013-03-06 15:54:54

0

類似user2140261的解決方案几乎無限量的宏,使用worksheet_change事件來觸發的變化:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$A$1" Then 
     With ActiveSheet.Range("Table_Name").ListObject.QueryTable 
      .CommandText = ChangeParameter(.CommandText, "ParameterFlag", Range(Target.Address)) 
     End With 
     ActiveWorkbook.RefreshAll 
    End If 
End Sub 

在上文中,$ A $ 1是的動態信息(例如,日期),SQL表是TABLE_NAME的位置,和所述ParameterFlag是SQL代碼中的參數,以取​​代(見下文)。 這是用來改變SQL代碼ChangeParameter功能:

Function ChangeParameter(src As String, parameter As String, newValue As String) 
    'Replace src text surrounded by startParameter and endParameter with newValue 

    Dim startPosn As Long, endPosn As Long 
    Dim startParameter As String, endParameter As String 

    startParameter = "/*<" & parameter & ">*/" 
    endParameter = "/*</" & parameter & ">*/" 
    startPosn = 0 
    Do 
     startPosn = InStr(startPosn + 1, src, startParameter) 
     If startPosn Then 
      endPosn = InStr(startPosn + Len(startParameter), src, endParameter) 
      If endPosn Then 
       src = Left(src, startPosn + Len(startParameter) - 1) & newValue & Mid(src, endPosn) 
      Else 
       Exit Do 
      End If 
     End If 
    Loop While startPosn 
    ChangeParameter = src 
End Function 

如果所需的SQL代碼是,例如:

SELECT * FROM mytable WHERE startDate > '7/1/2015' 

那麼這將在命令文本框中說編輯:

SELECT * FROM mytable WHERE /*<StartDate>*/'7/1/2015'/*</StartDate>*/ 

和主叫線路是:

.CommandText = ChangeParameter(.CommandText, "StartDate", "'" & Range(Target.Address) & "'") 

(日期作爲常量存儲在代碼中,因此必須使用單引號括住電子表格的值)。所有這些都是有效的,因爲/* */所包含的評論即使在一行中間也會被忽略,通常是一種糟糕的編碼習慣,但在這裏很有用。

由參數標誌(在這種情況下/*<StartDate>*//*</StartDate>*/)包圍原始的SQL代碼,所有的地方會用新的值(「「」 &範圍(Target.Address)&「」」在這種情況下)被替換。下次目標單元格$ A $ 1發生更改時,該調用將再次運行,並且參數再次更改,而不需要知道之前的值是什麼。

對ChangeParameter的多次調用可用於要更改的每個參數以及每個包含要更改參數的基於SQL的表。

當然,就沒有今天如果參數替換工作了複雜的代碼是必要的......