У нас есть электронная таблица для отслеживания часов. В нем есть столбец часов, потраченных на данный проект в неделю, и общее количество часов для проекта. У каждого проекта есть ряд. Каждый понедельник я вручную добавляю количество часов с прошлой недели в столбец общего количества часов. Я хотел бы автоматизировать это. Я пытаюсь перебрать столбец J и, если есть число в J, добавить его в K. Затем очистить ячейку J (я еще не добавил эту часть в приведенный ниже код). J может быть пустым или иметь нечисловые значения, они должны быть пропущены. J никогда не пройдет мимо J500.
Это мой код, он, кажется, просто зацикливает текущую выбранную строку 500 раз в «Megan in Progress», а не перемещается из 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
До макроса
После макроса
4 ответа
Есть несколько вещей, которые я бы сделал по-другому, чтобы заставить это работать. Во-первых, я бы не использовал "ячейку" в качестве имени переменной, поскольку это имя функции 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
Я не уверен, если вы хотите удалить значение столбца 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, а не для каждого цикла.
Попробуй это.
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
Попробуй это:
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
Новые вопросы
excel
Только для вопросов по программированию для объектов или файлов Excel или для разработки сложных формул. Вы можете объединить тег Excel с VBA, VSTO, C #, VB.NET, PowerShell, OLE-автоматизацией и другими тегами и вопросами, связанными с программированием, если это применимо. Общая помощь по MS Excel для функций одного листа доступна в Super User.