類似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的表。
當然,就沒有今天如果參數替換工作了複雜的代碼是必要的......
不知道這是否是問題,但我注意到,你的硬編碼查詢使用的字符串(「555555」),而你有一個存儲在Excel中的整數。 – 2013-03-06 14:25:43
試圖格式化單元格作爲文本沒有幫助...我總是使用文本,我也可以有部分命令也需要使用文本,以確保它不會使555555.1和555555.10相同。 – user2140261 2013-03-06 14:46:34
只是格式化爲文本可能會或可能不會做任何事情,因爲它不會更改基礎值。就像我說的,我不確定這是個問題,但最後一個嘗試的方法是將單元格的值從「555555」更改爲「555555」(帶撇號),它表示文本值。 – 2013-03-06 14:57:10