【问题标题】:Trying to loop non-contiguous rows in a range试图循环一个范围内的非连续行
【发布时间】:2017-10-20 02:10:09
【问题描述】:

我正在尝试编写将循环遍历表中一系列非连续行的内容,并更改每行中的列数据......例如,ClearContents。范围将是动态的,并且我要循环遍历的行都将是“选定的”。

我尝试了以下操作,但在第一行之后就停止了。我很确定问题是下一行与第一行不连续:

 For Each b In a.Rows
 mainTasks.DataBodyRange(Range("mainTasks[Status]").Column).ClearContents
 Next b

然后我有了一个好主意,写一些只适用于“选定”列单元格的东西。我尝试使用If ... .Value = Selected,但没有成功。

我是否正在尝试做 Excel 2016 VBA 无法做的事情?也就是说,循环遍历一个范围内的非连续行?我一直在研究并尝试了其他一些不起作用的方法。你能告诉我我是不是走错了兔子洞吗?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您的循环中没有任何变量。

    它只会在循环中重复清除一列。您需要以某种方式在循环中引用 b 以在每个循环中获得不同的结果。

    【讨论】:

      【解决方案2】:

      出于测试目的,我试图简化您在 cmets 中的代码,但以下代码应该会有所帮助,

      Dim x As Integer
      Dim myrange As Range
      For x = 1 To 30
         If (mainTasks.Cells(x, 2) = "completed" Or mainTasks.Cells(x, 2) = "Dismissed") And mainTasks.Cells(x, 3) <> "" Then
            If myrange Is Nothing Then
               Set myrange = mainTasks.Cells(x, 2)
            Else
               Set myrange = Union(myrange, mainTasks.Cells(x, 2))
            End If
          End If
      Next x
      myrange.ClearContents
      

      我试过了,按照我的设置方式,它工作正常。希望对您有所帮助!

      您还必须添加代码来复制数据,鉴于这是您最初的问题,我正在清除其中的内容

      【讨论】:

      • 超级。只是一个简单的问题。 “For x = 1 to 30”是否假设表中有 30 行?没有行数的表末尾的语法是什么?我知道我已经看到了......我只是大脑冻结。
      • 如果我没记错的话,肯定会是类似 "Worksheets("mainTasks").UsedRange.Rows.Count"
      • 德曼,谢谢!我尝试了您的简化代码并得到了一个错误,所以我只是插入了我的旧代码块并且它工作了!现在我要回去对简化的代码进行故障排除......我可能做了一些改变,破坏了它。再次感谢。
      • 没问题 :) 如果您可以将此标记为已解决,那就太好了
      • Dman,抱歉延迟回复,但我认为当我说它有效时我错了......我一定已经看到“状态”列清晰并且错误地认为它只清除了“myrange”行,正如我需要的那样。相反,它清除了整个状态列。作为替代方案,我更改了代码以在同一个表中创建新行...有什么方法可以将这些新行声明为对象、范围或区域,并仅从该新行范围内清除状态?我试过这样做,但我似乎无法正确使用语法。
      【解决方案3】:

      这也有效(我认为)

      Dim selectedRange As Range
      
      Set selectedRange = Application.Selection
      
      For Each Row In selectedRange.Rows
          Debug.Print Row.Address
      Next Row
      

      【讨论】:

      • 德曼和迈克尔,谢谢。 Dman,我尝试了您的代码,它在第一行之后停止,与原始代码相同。我认为问题再次在于该范围内的选定行不连续。它会以某种方式说,好的,继续查看整个列,但只对选定的行执行此操作? If Then 语句?选择一行的正确语法是什么?
      • 你不应该遍历整个列,上面的代码对我有用,(我只在 C 列中选择了第 4、11、24 和 31 行)并打印了调试窗口( $C$4、$C$11、$C$24 和 $C$31) 你是如何选择“行”的,你是按住 CTRL 并选择它们吗?还是其他方法?
      • 您好 Dman,行是在宏的前一部分中选择的。我的项目是 Excel 表格中的“待办事项”列表。我正在尝试解决更新重复任务的问题。当任务在 [状态] 列下标记为“已完成”时,我的宏会将其复制到另一张工作表上的表中,以便我可以维护任务的记录。然后宏回到原表,重新选择已完成任务的范围,目的是清除【状态】和更新【开始】。每次完成的任务都会在不同的位置,所以我无法通过地址来识别它们。
      • 啊,好吧,这有所不同,现在当您选择单元格时,您可以发布选择它们的代码部分吗?
      • Tasks2.Activate Dim a As Range, b As Range Set a = myRange Dim myNewRows As Variant For Each b In a.Rows Set myNewRows = ActiveSheet.ListObjects("recurrCompl").ListRows.Add b .Copy myNewRows.Range.PasteSpecial xlPasteAll Next Tasks.Activate a.Select
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多