【问题标题】:Using single cell in loop as trigger to to copy multiple ranges VBA使用循环中的单个单元格作为触发器来复制多个范围 VBA
【发布时间】:2022-02-08 23:54:53
【问题描述】:

宏正在处理硬编码输入,但我需要循环来进行调试和未来的增长。我不知道最好的设置方法。

Range("b3:b8:) 是我想要循环的单元格。

如果 cell.value = 1 那么
Set var1 = range("a3:aq3") (* 这个范围总是和循环中的单元格具有相同的行号*)

Set var2 = range("a9:aq9") (*这个范围总是比循环中的单元格行大6。)

如果结束

下一个单元格 谢谢

【问题讨论】:

    标签: excel vba loops


    【解决方案1】:

    循环遍历范围的行

    Option Explicit
    
    Sub LoopThroughRows()
        
        Const srgAddress As String = "A3:AQ8"
        Const scCol As Long = 2
        Const sCriteria As String = "1"
        
        Dim sws As Worksheet: Set sws = ActiveSheet ' improve, e.g.:
        'Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
        'Dim sws As Worksheet: Set sws = wb.Worksheets("Sheet1")
        
        Dim srg As Range: Set srg = sws.Range(srgAddress) ' last use of 'sws'
        Dim srCount As Long: srCount = srg.Rows.Count
        
        Dim srg1 As Range
        Dim srg2 As Range
        Dim sCell As Range
        Dim sr As Long
        
        For Each sCell In srg.Columns(scCol).Cells ' don't forget '.Cells'!
            sr = sr + 1 ' monitoring each range row (not worksheet row)
            If CStr(sCell.Value) = sCriteria Then ' also avoiding error values
                Set srg1 = srg.Rows(sr)
                Set srg2 = srg1.Offset(srCount)
                ' Continue... e.g.:
                Debug.Print sr, sCell.Address(0, 0), _
                    srg1.Address(0, 0), srg2.Address(0, 0)
            Else ' not equal to sCriteria (usually do nothing)
                ' e.g.:
                Debug.Print sr, sCell.Address(0, 0), "Nope."
            End If
        Next sCell
        
    End Sub
    

    【讨论】:

    • 谢谢!看起来工作量很大。我已经能够让它的一部分运行。但我无法得到任何标准来评估为真。当你评论'不要忘记'.Cells'!里面应该放什么?
    • .Cells 只是一个提醒,因为没有它就无法工作。您已经发布了指向您的文件的链接,但它要求发送请求。我已发送请求,但您尚未允许。下次如果您希望人们能够下载您的文件,请右键单击它,选择Get Link,然后选择Anyone with a link,而不是Restricted
    • 我很抱歉。这是任何有链接的人。谢谢你的耐心。 docs.google.com/spreadsheets/d/…
    • 代码适用于您的文件。您甚至可以使用Dim srg3 As Range: Set srg3 = srg2.Offset(srCount) 获得sell only 关联的行范围。但我不知道你打算用这些范围做什么。如果您打算复制到另一个工作表,则需要解释或展示生成的工作表应该是什么样子。
    • 我搞定了!!太感谢了。我相信我投了你一票。如果不让我知道如何,我会的。你为我节省了很多时间。
    【解决方案2】:

    您是否尝试过使用 for 循环?

    例如:

    For Each Cell in Range("B3:B8")
      If Cell.Value = 1 Then
        Set var1 = range("a3:aq3")
      Else
        Set var2 = range("a9:aq9")
      End If
    Next Cell
    

    【讨论】:

    • 感谢您的回复。这正是我想要的那种想法。我需要的唯一更改是在评估 B4 时,我也需要更改两个范围。所以 B4 需要 ("a4:aq4:) 和 ("a10:aq10")。如果 B5 为真,我需要将范围设置为 ("a5:aq5") 和 ("a11:aq11")。简短version 是复制的范围,需要随着评估为 true 的单元格动态变化。
    • 很高兴它有帮助。您介意发送您想要的结果的快照,我会尝试编写代码并稍后发布吗?
    • 不确定发送快照的最佳方式。正如工作表现在所看到的,当评估 range("b3:b8") 时,"B4" 评估为真,需要设置 var1 = range(a4:aq4") 和 var2 = range("a4:aq4")。 “B7”也是如此,因此在该循环中它需要设置 var1 = range("a7:aq7") 和 var2 = range("a13:aq13") 。我在循环开始时有一行代码将最新记录移开,以便第二次触发它时不会覆盖“B4”条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多