Vba 宏在第一个单元格中输入数据后循环运行SQL查询(104次)
我有一个宏,当用户在第一个单元格中输入数据时运行。但是,当我在第一个单元格中输入数据时,宏将执行sql查询并在循环中运行(104次),并将sql select语句的列标题放在电子表格上 这是我的宏:Vba 宏在第一个单元格中输入数据后循环运行SQL查询(104次),vba,excel,event-handling,Vba,Excel,Event Handling,我有一个宏,当用户在第一个单元格中输入数据时运行。但是,当我在第一个单元格中输入数据时,宏将执行sql查询并在循环中运行(104次),并将sql select语句的列标题放在电子表格上 这是我的宏: Sub JobTaskHistory(ByVal Target As Range) Dim sqlstring As String Dim connstring As String Dim Strcode As String Dim rangeTest As Range Set range
Sub JobTaskHistory(ByVal Target As Range)
Dim sqlstring As String
Dim connstring As String
Dim Strcode As String
Dim rangeTest As Range
Set rangeTest = Range("A1")
'Strcode = Trim(InputBox("Please enter a Job Number", "Job Task history"))
Strcode = Target.Cells(1, 1).Value
sqlstring = "select distinct m.JobNumber , cast(m.ExpectedDate as DATE) 'Ship Date' , m.QuantityOrdered 'Quantity' & _
" from ArchiveJobHeader m left join AuxiliaryInfoFile af (nolock) on af.jobnumber=m.jobnumber left join JobExtra j on j.JobNumber = m.JobNumber " & _
" where m.JobNumber = '" & Trim(Strcode) & "'" & _
" order by 'Resulttime'"
connstring = "ODBC;DSN=Test;UID=Test;PWD=Test123"
Dim thisQT As QueryTable
Dim lastRow As Long, nextRow As Long
lastRow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
nextRow = lastRow + 1
'Set thisQT = ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("a1", "a1000"))
Set thisQT = ActiveSheet.QueryTables.Add( _
Connection:=connstring, _
Destination:=Range("A" & nextRow))
thisQT.BackgroundQuery = False
thisQT.Sql = sqlstring
thisQT.Refresh
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Call JobTaskHistory(Target)
End Sub
可以通过在包含宏的模块中放置公共变量来解决此问题。如果在模块中没有宏,则需要将其放在一个模块中,因为这在工作表代码中不起作用 发生了什么:
Public inProgress As Boolean
Sub JobTaskHistory(ByVal Target As Range)
inProgress = True
'YOUR CODE AS WRITTEN
inProgress = False
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If inProgress = False Then
Call JobTaskHistory(Target)
End If
End Sub
- 值在图纸上更改
- 工作表更改事件调用宏
- 宏将公共变量设置为TRUE
- 事情发生了变化,再次触发了变化事件
- 更改事件测试inProgress,如果为真,则跳过调用宏
- 宏完成,并再次将inProgress设置为False
Public inProgress As Boolean
Sub JobTaskHistory(ByVal Target As Range)
inProgress = True
'YOUR CODE AS WRITTEN
inProgress = False
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If inProgress = False Then
Call JobTaskHistory(Target)
End If
End Sub
在工作表代码中:
Public inProgress As Boolean
Sub JobTaskHistory(ByVal Target As Range)
inProgress = True
'YOUR CODE AS WRITTEN
inProgress = False
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If inProgress = False Then
Call JobTaskHistory(Target)
End If
End Sub
注意:
任何时候发生更改事件时,都要查看作用域是什么(即“工作表\更改”),因为当您运行任何结果时,如果它导致事件再次触发,您将有循环。
如果遇到无法退出的循环,请尝试使用“Ctrl+PauseBreak”它似乎运行了那么多次,因为您正在使用工作表更改事件启动它。因此,一旦开始执行,情况就会发生变化,宏就会再次被调用。