Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 宏在第一个单元格中输入数据后循环运行SQL查询(104次)_Vba_Excel_Event Handling - Fatal编程技术网

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

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

我有一个宏,当用户在第一个单元格中输入数据时运行。但是,当我在第一个单元格中输入数据时,宏将执行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

可以通过在包含宏的模块中放置公共变量来解决此问题。如果在模块中没有宏,则需要将其放在一个模块中,因为这在工作表代码中不起作用

发生了什么:

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”

它似乎运行了那么多次,因为您正在使用工作表更改事件启动它。因此,一旦开始执行,情况就会发生变化,宏就会再次被调用。