【问题标题】:VBA- Copying Values from one cell to another offset cellVBA-将值从一个单元格复制到另一个偏移单元格
【发布时间】:2015-02-06 19:51:47
【问题描述】:

我正在尝试遍历第 6 行并从第 1 列到第 26 列,并搜索“赢得累积小时数”这句话。完成后,我将尝试从第 8 行转到最后一行(在本例中为 30),以获取第 6 行中已获得累积小时数的列。 然后我试图将这一列中单元格的值粘贴到同一行中的 2 个单元格中。但我不断收到错误,代码不起作用。

有人可以指出我正确的方向吗?谢谢

 Sub project()

    Dim lastrow As Long
    Dim i As Long
    Dim j As Long

    lastrow = Sheets("Progress").Cells(Rows.Count, 26).End(xlUp).Row

    For j = 1 To 26
        If Cells(6, j) = "Earned Cumulative Hours" Then
            For i = 8 To lastrow
                Cells(i, j).Copy
                Cells(i, j).Offset(0, -2).Select
                Selection.PasteSpeical Paste:=xlPasteValues
            Next i
        End If
    Next j
End Sub

【问题讨论】:

    标签: excel vba loops google-sheets offset


    【解决方案1】:

    我可以立即看到您的代码存在一些问题。首先,如果您要向后偏移两列.Cells(i, j).Offset(0, -2),那么您将覆盖现有值。如果这是您打算做的,那很奇怪,但没关系。

    下一个问题是,如果 A 列中包含“累计工时”,则会出现问题。如果是这种情况,Excel 将最不高兴尝试将两列向左偏移,并会给出错误。

    在这种情况下,而不是复制和粘贴,将一列中的值设置为另一列会更有效,您可以在我的代码中看到。最后,您的单元格引用仅对活动工作表有效。您需要限定您感兴趣的工作表,如我的代码中所示。如果它是一个独立的块,我通常把它放在代码的开头。

    您也可以消除i 循环并一次设置值的范围,但我们会将其保存到下一次!

    我没有测试过这段代码,但应该没问题。

    Sub projectawesome()
    
        Dim lastrow as Long, i as Long, j as Long
    
        'Qualify the sheet (assuming its in the activeworkbook)
        With Sheets("Progress")
            lastrow = .Cells(.Rows.Count, 26).End(xlUp).Row
    
            'I've changed this to column three to prevent offset errors.
            For j = 3 to 26
                If .Cells(6, j) = "Earned Cumulative Hours" Then
                    For i = 8 to lastrow
                       'Assuming overwriting data is ok.
                       'No need to copy and paste
                       .Cells(i, j - 2).Value = .Cells(i, j).Value
                    Next i
                End If
            Next 
        End With
    End Sub
    

    【讨论】:

    • 谢谢它有效。这个声明应该做什么,它的目的是什么? With Sheets("Progress") 非常感谢。
    • 当您使用With 时,它允许您使用任何属性或方法,而无需再次明确声明该对象。您会在代码中看到.Cells,前面的. 告诉代码您要使用With Sheets("Progress") 定义的工作表。希望这是有道理的!
    【解决方案2】:

    试试这个,我们可以摆脱那些选择

    Sub project()
    
    Dim lastrow As Long
    Dim i As Long
    Dim j As Long
    
    lastrow = Sheets("Progress").Cells(Rows.Count, 26).End(xlUp).Row
    
    For j = 1 To 26
    
        If Cells(6, j) = "Earned Cumulative Hours" Then
    
            For i = 8 To lastrow
    
                Cells(i, j).Copy
                With Cells(i, j)
                    .Offset(0, -2).PasteSpecial xlPasteValues
                End With
            Next i ' next row
        End If
    Next j ' next col
    End Sub
    

    【讨论】:

    • 非常感谢!有用。 with 函数的作用是什么?
    • 看起来像cuberchase,我同时回答了你的问题。如果您需要其他任何东西,请立即联系我们
    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2018-03-15
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多