VBA添加相邻单元格

时间:2018-08-20 18:51:12

标签: excel vba excel-vba

我们公司有一个电子表格可以跟踪工作时间。它有一个列,用于显示每周在给定项目上花费的小时数以及该项目的总时数。每个项目都有一行。每个星期一,我都将上周的小时数手动添加到“总小时数”列中。我想使它自动化。我试图遍历J列,如果J中有一个数字,请将其添加到K。然后清除单元格J(我尚未将此部分添加到以下代码中)。 J可以为空白或具有非数字值,应跳过这些值。 J永远不会超越J500。

这是我的代码,它似乎只是将当前选定的行在“ Megan in Progress”中循环500次,而不是从J1移动到J500。有人可以帮我指出我做错了什么吗?谢谢。

Sub UpdateTotals()
Sheets("Megan In Progress").Activate
For Each cell In Sheets("Megan In Progress").Range("J1:J500")
    Dim weekVal As Double
    If IsNumeric(cell) = True Then
        weekVal = cell.Value
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = ActiveCell.Value + weekVal
        ActiveCell.Offset(0, -1).Select
    End If
Next
End Sub

在宏之前

IMG1

宏之后

IMG2

4 个答案:

答案 0 :(得分:2)

尝试一下:

For Each cell In Range("K2:K500")
    'Adds the adjacent cell in column J to the current cell value
    cell.Value = cell + cell.Offset(, -1)
    'Clears the weekly values form column J
    cell.Offset(, -1).Clear
    'Clear 0s in column K
    If cell.Value = 0 Then cell.Clear
Next

答案 1 :(得分:2)

要使此功能正常工作,我会做一些不同的事情。首先,我将避免使用“单元格”作为变量名,因为这是一个Excel函数名。它按原样工作,但是很尴尬。 rngCell(因为它是一个范围对象)怎么样?

weekVal变量不是必需的,实际上无论如何都不应该在循环中确定其尺寸。但是您应该确定正在使用的循环变量的大小。

IsNumeric函数带有文本参数,因此您应在函数中包含循环变量的.Text属性。

接下来,由于您要遍历范围内的所有单元格,因此无需选择任何内容,这只会减慢执行速度。只需相对于循环变量进行操作即可。

这是我重写函数的方式:

Sub UpdateTotals()

   Dim rngCell as range

   Sheets("Megan In Progress").Activate
   For Each rngCell In Sheets("Megan In Progress").Range("J1:J500")
     If IsNumeric(rngCell.Text) Then
        rngCell.Offset(0, 1) = rngCell.offset(0, 1).value + rngCell.Value
        rngCell = ""
     End If
   Next
End Sub

答案 2 :(得分:0)

我不确定是否要删除J列值,无论这种情况发生在以下位置:

Dim i As Long, j As Double, k As Double
With Sheets("Megan In Progress")
    For i = 1 To 500
        If IsNumeric(.Cells(i, "K").Value) = True Then k = .Cells(i, "K").Value
        j = .Cells(i, "J").Value
        .Cells(i, "K").Value = j + k
        .Cells(i, "J").Value = ""
        j = 0
        k = 0
    Next i
End With

这使用一个for循环,而不是每个循环。

答案 3 :(得分:0)

尝试一下。

Sub UpdateTotals()
    Dim Ws As Worksheet
    Dim vDB As Variant, rngDB As Range
    Dim i As Long, n As Long

    Set Ws = Sheets("Megan In Progress")
    Set rngDB = Ws.Range("j1:k500")
    vDB = rngDB
    n = UBound(vDB, 1)
    For i = 1 To n
        If IsNumeric(vDB(i, 1)) Then
            vDB(i, 2) = vDB(i, 1) + vDB(i, 2)
            vDB(i, 1) = Empty '<~~ clear numeric cells
        End If
        'vDB(i, 1) = Empty '<~~ clear all cells
    Next i
    rngDB = vDB
End Sub