У нас есть электронная таблица для отслеживания часов. В нем есть столбец часов, потраченных на данный проект в неделю, и общее количество часов для проекта. У каждого проекта есть ряд. Каждый понедельник я вручную добавляю количество часов с прошлой недели в столбец общего количества часов. Я хотел бы автоматизировать это. Я пытаюсь перебрать столбец 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

До макроса

IMG1

После макроса

IMG2

0
Megan 20 Авг 2018 в 21:51

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
2
Steve Bull 20 Авг 2018 в 19:22

Я не уверен, если вы хотите удалить значение столбца 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, а не для каждого цикла.

0
Cyril 20 Авг 2018 в 21:17

Попробуй это.

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
0
Dy.Lee 21 Авг 2018 в 02:17

Попробуй это:

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
2
GMalc 20 Авг 2018 в 20:00
51936879