我们公司有一个电子表格可以跟踪工作时间。它有一个列,用于显示每周在给定项目上花费的小时数以及该项目的总时数。每个项目都有一行。每个星期一,我都将上周的小时数手动添加到“总小时数”列中。我想使它自动化。我试图遍历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
在宏之前
宏之后
答案 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