【问题标题】:Looping through a range to find a value循环遍历范围以查找值
【发布时间】:2022-08-17 01:28:15
【问题描述】:

我有一个包含 1-8 列、第 3 行到最后一行的工作表。我想遍历每个单元格以找出是否存在值 1。如果是,则为每个值 1 复制并插入该行,此外,该新行将在单元格 (13,row) 中插入一个文本,然后移动到下一行。这是据我所知....谢谢!

Sub Workcenter()
Application.ScreenUpdating = False
On Error Resume Next
Application.DisplayAlerts = False
On Error GoTo 0
Dim Test                                As Worksheet

   
Set TS = Worksheets(\"Test\")
Application.DisplayAlerts = True
For k = 1 To 8
For j = 4 To TS.Cells(Rows.Count, k).End(xlUp).Row
If TS.Cells(j, k).Value = 1 Then TS.Cells.Activate
\'TS.Cells.Activate.Row.Select
Rows(ActiveCell.Row).Select
Selection.Copy
Selection.Insert Shift:=xlDown
\'ShopOrderNumRow = j
Next j
Next k
End Sub
  • 我对发生的事情感到有点困惑......插入了什么以及在哪里?如果您正在插入,那么您将移动单元格的位置,这会导致您的循环出现问题。
  • 另外,为什么要在行的每个单元格中检查1 的值,而不是只使用Find() 来确定是否需要更新cells(row,13).value
  • 我正在扫描一系列行和列 1-8,每个可能包含 1 或没有,其中 1 表示操作已安排。目的是复制父行并将该信息传递到“1”出现的次数之下。我想从上到下到最后一行。之后,我开始用其他数据填充该行。
  • 所以你想countif(val,1) 并插入那么多次?你会想为此做一个反向战利品(step -1),因为如果你要从头到尾,每个插入都会调整你的行号(假设for rowNum = lastRow to firstRow)。
  • 西里尔,是的,自下而上可能是一个不错的选择。我想插入复制行的次数与该范围内该行中存在 (1) 的次数一样多。

标签: excel vba loops if-statement


【解决方案1】:

将尝试举一些例子,知道我仍然不明白插入是如何为一行的每个单元格发生的。

在您的帖子中提供更多详细信息或之前/之后的示例可能会有所帮助。

例如,由于您在每一行中只标记一个单元格,我建议Find() 的值为1 以确定您是否需要写入该特定单元格。

'untested code
sub test()
    toggle false
    dim rowNum as long
    for rowNum = firstRow to lastRow Step 1
        with sheets(1)
            with .range(.cells(rowNum,1),.cells(rowNum,8))
                dim foundCell as range
                set foundCell = .find(1)
                if not foundCell is nothing then .cells(rowNum,13).value = "text"
            end with
        end with
    next iterator
    toggle true
end sub

private sub toggle(val as boolean)
    with application
        .screenupdating = val
        .enableevents = val
    end with
end sub

编辑1: 看起来countif() 可能是这里的救星。编辑2:经过测试的代码输入(Edit1 的未测试代码部分)

Sub test()
    Dim lastRow As Long:  lastRow = 10
    Dim firstRow As Long:  firstRow = 1
    toggle False
    Dim rowNum As Long
    For rowNum = lastRow To firstRow Step -1
        With Sheets(1)
            Dim countRange As Range
            Set countRange = .Range(.Cells(rowNum, 1), .Cells(rowNum, 8))
            Dim countOfOnes As Long
            countOfOnes = Application.CountIf(countRange, 1)
            If countOfOnes > 0 Then
                With .Rows(rowNum)
                    .Copy
                    .Offset(1).Resize(countOfOnes).Insert Shift:=xlDown
                End With
                .Cells(rowNum, 13).Value = "text"
            End If
        End With
    Next rowNum
    toggle True
End Sub

Private Sub toggle(val As Boolean)
    With Application
        .ScreenUpdating = val
        .EnableEvents = val
    End With
End Sub

使用此数据进行测试:

运行代码的输出:

【讨论】:

  • 遇到代码问题。它不会根据行的总和而是根据范围的总和来复制和复制行数。想知道 SUMIF 或 COUNTIFS 是否可以工作.....谢谢
  • @GSpencer 你能在你的问题中发布你更新的代码吗?任何数据模型也将不胜感激,表明之前/之后。用经过测试的代码和示例信息更新了我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2015-10-17
  • 2018-08-23
相关资源
最近更新 更多