在第一个单元格中输入数据后,宏在循环中运行 SQL 查询(104 次)
Macro runs SQL query in loop (104 times) after entering data in first cell
我有一个宏,它会在用户在第一个单元格中输入数据时运行。但是,当我在第一个单元格中输入数据时,宏执行 sql 查询并在循环中运行(104 次)并将 headers 列 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 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 变量来解决这个问题。如果模块中没有宏,则需要将其放入一个模块中,因为这在 Sheet 代码中不起作用。
发生了什么:
值在 sheet 上发生变化。
工作sheet变化事件调用宏
宏将 public 变量设置为 TRUE。
事情发生变化,再次触发变化事件
change 事件测试 inProgress,如果为真,则跳过调用宏。
宏完成,并再次将 inProgress 设置为 False。
在您的模块中:
Public inProgress As Boolean
Sub JobTaskHistory(ByVal Target As Range)
inProgress = True
'YOUR CODE AS WRITTEN
inProgress = False
End Sub
作品中sheet代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If inProgress = False Then
Call JobTaskHistory(Target)
End If
End Sub
注: 任何时候你有一个 change 事件,看看范围是什么(即 "worksheet_change"),因为当你 运行 作为它的结果时,如果它导致事件再次触发,你会有循环。 如果您陷入无法退出的循环,请尝试使用 'Ctrl+PauseBreak'