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

时间:2015-01-12 16:52:24

标签: excel vba excel-vba 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 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

1 个答案:

答案 0 :(得分:2)

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

发生了什么:

  • 工作表上的值会发生变化。

  • 工作表更改事件会调用宏。

  • 宏将公共变量设置为TRUE。

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

  • 更改事件测试inProgress,如果为TRUE,则跳过调用宏。

  • 宏完成,并再次将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

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