2015-02-06 128 views
2

我正在尝试通过第6行并从第1列到第26列并搜索句子已累积的小时数。一旦完成,那么我试图从第8行到最后一行(在这种情况下为30),以获得第6行累积小时数的列。 然后,我尝试粘贴此列中单元格的值到2个单元格留在同一行。但我不断收到错误,代码不起作用。VBA-将数值从一个单元格复制到另一个偏移单元格

有人可以请指出我在正确的方向吗?由于

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 
+0

为什么[google-spreadsheet]标记? – pnuts 2015-02-06 20:46:11

回答

2

的有几个问题,我可以看到你的代码,立竿见影。首先,如果你抵消了两列.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 
+0

谢谢你的作品。这个声明应该做什么?它的目的是什么?随着表(“进展”) 非常感谢。 – JA16 2015-02-06 22:23:14

+0

当你使用'With'时,它允许你使用任何属性或方法,而不用再次明确地声明对象。您将在代码中看到'.Cells',前面的'.'告诉代码您想使用'With With Sheets(“Progress”)'定义的工作表。希望是有道理的! – CuberChase 2015-02-06 23:11:42

0

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

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 
+0

非常感谢!有用。 with功能的目的是什么? – JA16 2015-02-06 22:24:04

+0

看起来像cuberchase,我在同一时间回答,也回答你有问题。让我们现在,如果你需要任何其他 – jamesC 2015-02-09 01:57:45

相关问题