在第一个单元格中input数据后,macros在循环(104次)中运行SQL查询

我有一个macros,当用户在第一个单元格中input数据时运行。 但是,当我在第一个单元格中input数据时,macros执行sql查询并在循环中运行(104次),并将sql select语句的列标题放在电子表格中。

这是我的macros:

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 

您可以通过在包含该macros的模块中放置一个Publicvariables来解决此问题。 如果模块中没有macros,则需要将其放在一个macros中,因为这不适用于Sheet代码。

怎么了:

  • 表格中的值发生变化。

  • 工作表更改事件调用macros。

  • macros将公共variables设置为TRUE。

  • 事情发生变化,再次触发变化事件。

  • inProgress的更改事件testing,如果它是TRUE,则跳过调用macros。

  • macros完成,并将进程设置为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 

注意:任何时候你有一个改变事件,看看是什么范围(即“worksheet_change”),因为当你运行任何事情的结果,如果它导致事件再次触发,你会有循环循环。 如果您陷入循环,则无法退出,请尝试使用“Ctrl + PauseBreak”