2016-04-22 310 views
1

我已經建立了到我的SQL服務器到存儲過程所在的數據庫的連接。存儲過程在SQLServer中正常工作。存儲過程從Excel中的硬編碼參數連接運行得很好。我得到我的數據集並將其插入到我的電子表格中。宏不起作用。在宏中,我試圖指向包含我的參數值的電子表格中的範圍,以便我可以將值輸入到電子表格中,然後讓宏選取它們並將它們傳遞給存儲過程。我使用日期格式來存儲電子表格值和存儲過程中的參數。當宏運行時,我希望返回的數據集在電子表格中用新數據更新。這裏是我的宏:使用多個參數從Excel調用存儲過程

Sub GetHeatMapData() 

    With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = "EXECUTE dbo.GetBillingHeatMap '" & Range("A9").Value & "" & Range("B9").Value & "'" 

    End With 
    ActiveWorkbook.Connections("CARLA-PC-Billing-SP").Refresh 

End Sub 

但是,如果我嘗試從Excel宏運行存儲過程中,發生兩種情況之一:

  1. 如果在電子表格中現有的數據集是從連接窗口運行存儲過程創建的,然後宏運行沒有錯誤,但它沒有選擇動態變量,因此數據不會像應該那樣改變。

  2. 如果我從連接窗口中刪除通過運行存儲過程創建的數據集,請選擇數據應該啓動的單元格,然後觸發宏,出現'下標超出範圍'錯誤,並且沒有任何反應。

我將NOCOUNT設置爲在我的存儲過程結束時關閉。下面是參數定義的存儲過程:

​​

這裏是我的連接設置: enter image description here

我的問題是,爲什麼是存儲過程不從Excel的電子表格單元格讓我的參數,並使用它們來過濾返回的數據?

回答

0

你缺少逗號

「執行dbo.GetBillingHeatMap '」 &範圍( 「A9」)。價值& 「 ''」 &範圍( 「B9」)。價值& 「'」

+0

感謝您的回覆Mike Miller。我曾嘗試過,沒有逗號。我也沒有給出由電子表格的區域單元格中的參數值過濾的返回數據集。 –

0

當你執行一個存儲過程,語句一般是這樣的:

EXECUTE myProc('param1', 'param2') 

您的命令將擴大的方式就會出來,如:

EXECUTE myProc 'param1param2` 

這是無稽之談。嘗試改爲:

With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = "EXECUTE dbo.GetBillingHeatMap ('" & Range("A9").Value & "','" & Range("B9").Value & "');" 

您可能仍然運行與日期格式的問題,這樣你就可以處理,在VBA太:

With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = "EXECUTE dbo.GetBillingHeatMap ('" & FORMAT(Range("A9").Value, "m/d/yyyy") & "','" & FORMAT(Range("B9").Value, "m/d/yyyy") & "');" 

最後,我發現它很好的做法,動態生成的SQL發送到一個變量,並在執行之前將它打印到調試/立即窗口,以便我可以捕獲這樣的東西。

sqlStatement = "EXECUTE dbo.GetBillingHeatMap ('" & FORMAT(Range("A9").Value, "m/d/yyyy") & "','" & FORMAT(Range("B9").Value, "m/d/yyyy") & "');" 
debug.print sqlStatement 
With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = sqlStatement 

現在你將有你在你的眼前窗口,您可以複製並粘貼到一個SQL客戶端獨立代碼的執行語句。

+0

謝謝你的迴應JNevill。我嘗試了前兩個建議,並且宏運行沒有錯誤,但沒有選取電子表格範圍中的日期,因此返回的數據集未被新的日期範圍過濾。存儲過程在SQL Server客戶端中運行正常,所以我不確定你在第三個建議中推薦什麼。我正在爲非技術用戶構建電子表格。我需要宏使用預定義的連接和參數值來運行存儲過程,它們會進入指定範圍並返回更新的數據集。 –

+0

我得到的結果來自連接屬性窗口中的.CommandText值。它似乎不會動態地將.CommandText值更改爲我的宏中的值。 –

+0

它只會知道您發送給它的命令文本。所以如果你在連接的commandtext屬性中看到一些東西,它必須來自這個VBA。不過,我會建議做最後一步,將commandtext粘貼到一個字符串變量中,然後將該字符串發送到調試/立即窗口。當你運行這個宏時,你可以通過查看>> ImmediateWindow(或Ctrl + G)來查看發送到即時窗口的內容。你會看到命令文本打印在那裏,所以你可以弄清楚你發送給數據庫的是什麼,並正確地調試這個東西。 – JNevill

-1

1 - 暴露parametars在Excel

enter image description here

2 - 定義參數從Excel

enter image description here

3輸入 - 行和刷新。

enter image description here

OK, 您不必在命令文本輸入參數,就可以在某種程度上定義命令文本期望參數傳遞到從Excel單元格中的存儲過程。如果您的國家不使用美國數據格式,這非常有用。此外,它使最終用戶能夠使用其他一些參數進行刷新,而無需編輯命令文本。 很簡單 - 在存儲過程名稱進入後,在命令文本中連接到sql server的excel中很簡單 - - 儘可能多 ?因爲您有不同的參數,您的存儲過程期望(除以) - 像這樣 - 執行dbo.your_procedure?,? 然後,你進入參數標籤(與你輸入的命令文本相同的格式),並從巫婆細胞巫婆參數定義傳遞給存儲過程。當然,在存儲過程中還需要指定期望什麼參數:

CREATE PROCEDURE [DBO] [your_procedure]

( @DateFrom日期時間, @DateTo日期時間 ) 作爲

---你的商店程序---

在Excel中 - 參數1將被髮送到存儲過程的DateFrom參數。

+0

你能分享你的文字形式的輸入,使他們可以複製? –

相關問題