范围对象通过“工作表1”而不是“工作表2”

时间:2016-11-22 17:51:49

标签: excel excel-vba loops range worksheet-function vba

我遇到了在for循环中迭代一系列项目的问题:

该程序应如何运作 -

我从工作表1开始(“跟踪电子表格”),并根据工作表1中的更改​​(在单元格中选择“是”),它会将您转移到工作表2(“延期提交”),然后迭代来自工作表2的一系列单元格(例如A1:A20).for循环将继续运行,直到它到达一个空的单元格,然后停止然后继续写入该单元格。

它现在如何工作 -

我从工作表1开始,根据工作表1的变化(在单元格中选择“是”),它会将您转移到工作表2,然后迭代一系列单元格(例如A1:A20)但是,不是迭代通过工作表2的A1:A20,而是迭代工作表1的A1:A20。在工作表1的A1:A20范围内找到一个空单元格之后,它将填写工作表2中的相应单元格(如果工作表1上的A5为空,则它将填写工作表2上的A5)。

我希望得到帮助,让范围在当时(工作表2)迭代活动工作表,而不是遍历工作表1。

到目前为止我的代码:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  ' Deferred Submittal, Column C = 3
  Dim cellTextDS As String
  Dim deferredArray As Range, deferredCell As Range, deferredRowEmpty As Long
  deferredRowEmpty = 1

  ' Deferred Submittal, Column C
  If Target.Column = 3 Then
    Row = Target.Row
    cellTextDS = ActiveSheet.Range("C" & Row).Text
    If cellTextDS = "Yes" Then
      Sheets(3).Activate

      Set deferredRange = Workbooks("BPS Tracking Sheet v6.xlsm").Worksheets("Deferred Submittals").Range("A1:A20") 
      For Each deferredCell In deferredRange
        Sheets(3).Activate
        MsgBox "inside deferredCell is " & deferredCell
        MsgBox " active sheet currently is " & name
        If IsEmpty(Range("A" & deferredRowEmpty).Value) = True Then Exit For

        MsgBox " deferredRowEmpty is " & deferredRowEmpty
        deferredRowEmpty = deferredRowEmpty + 1
      Next deferredCell

      MsgBox "Moving to 'Deferred Submittals' tab in order to input more information. row is " & deferredRowEmpty
      ActiveSheet.Range("A" & deferredRowEmpty).Value = "empty"

    End If
  End If
End Sub

任何帮助都会非常感激!

P.S。如果有任何不同,代码在工作表1的worksheet_change部分。

p.s.s。我尝试过使用this stackoverflow method for setting workbooks and worksheets, to no avail

p.s.s.s。发布了此部分的其余代码。本节中有更多代码,但它实际上只是复制和粘贴此部分,但适用于不同的列。我还编辑了工作表1和工作表2,但它们是此工作簿中的不同工作表选项卡,特别是工作表1 =“跟踪电子表格”和工作表2 =“延期提交”

1 个答案:

答案 0 :(得分:0)

好的 - 我认为这是你正在寻找的那种东西。使用worksheet_change事件时,应该做一些事情。

禁用事件意味着宏可以在不触发进一步错误的更改调用的情况下运行,因此需要进行一些错误管理。

我留下了一条可能有用的注释行,这样一次多个单元格的任何更改都不会触发进一步的更改,只会退出子

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    'If Target.Cells.Count > 1 Then Exit Sub
    If Target.Column <> 3 Then Exit Sub

On Error GoTo ExitSub
    Application.EnableEvents = False
    Dim wsSource As Worksheet: Set wsSource = Me
    Dim wsTarget As Worksheet: Set wsTarget = ThisWorkbook.Worksheets("Deferred Submittals")

    Dim NextEmpty As Range
    If wsSource.Cells(Target.Row, 3) = "Yes" Then
        Set NextEmpty = wsTarget.Range("A1:A20").Find("", LookIn:=xlValues)
        If Not NextEmpty Is Nothing Then
            Debug.Print NextEmpty.Address ' Function check
            NextEmpty.Value = Target.Row ' Or whatever you want the value to be
        End If
    End If

ExitSub:
    Application.EnableEvents = True
End Sub