Excel Mac VBA Loop Through Cells и сбрасывает некоторые значения

2491
Dru Darby

В настоящее время у меня есть 12 экземпляров рабочей книги - по одной на каждое из мест нашей компании. Есть несколько столбцов и одна строка для каждого дня месяца. Каждый день Менеджер местоположений заполняет 2 столбца, а остальные рассчитываются автоматически. Есть несколько «сложных» пользователей, которые отказываются вводить ноль во втором столбце, если для этого дня нет суммы, и они оставляют это поле пустым, что приводит к ошибкам во всей таблице.

В столбце A всегда будет значение для каждого дня, поэтому я хотел бы запустить макрос, когда пользователи нажимают кнопку сохранения, чтобы проверить значение в столбце A. Если есть значение, то это означает, что этот день прошел, и ДОЛЖНО быть значение в столбце D (даже если оно равно нулю).

Чтобы подвести итог, если столбец A не пустой, отметьте столбец D. Если он пустой, заполните его нулем. Если оно не пустое, пользователь ввел значение, чтобы мы могли двигаться дальше. Когда он попадет в пустую ячейку столбца А, просто выйдите из всего процесса.

Я просматривал Интернет в течение нескольких дней, пытаясь понять это, и вот что у меня есть до сих пор:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim curCell As Range 'Labor Flow Sheet'.Select  For Each curCell in Range(A1:D31) If curCell.Value = "" Then <???????> End If Next curCell End Sub 

Я установил диапазон на всю область, однако я не уверен, как узнать, что цикл будет проверять только столбец A. Должен ли диапазон быть (A1: A31) вместо этого? Тогда как мне сказать, чтобы он пропустил в той же строке до столбца D, чтобы проверить это значение?

Я действительно ценю чью-либо помощь заранее. Я надеюсь, что окажу некоторую помощь в этом сообществе, отвечая на другие вопросы, где только могу!

еще раз спасибо

2

1 ответ на вопрос

1
Tom D

I didn't get a chance to test this but it should work all you will have to do is add your own workbook & sheet name.

Sub test() Dim Ws As Worksheet Dim X As Long Application.ScreenUpdating = False Set Ws = Workbooks("").Sheets("Sheet1") ' add your workbook here For X = 1 To Ws.Range("A" & Rows.Count).End(xlUp).Row If Not Ws.Cells(X, 1).Value = vbNullString Then If Ws.Cells(X, 4).Value = vbNullString Then Ws.Cells(X, 4).Value = "0" End If ElseIf Ws.Cells(X, 1) = vbNullString Then Exit Sub End If Next X Application.ScreenUpdating = True End Sub 

Depending on the size of your workbook i think it is worth disabling screen updating but its not a necessity also using VbNullString is better than "" as this take up no memory.

Hope it helps,

Tom

Большое спасибо, Том! Это направление мне нужно! Можете ли вы сказать мне, как сделать так, чтобы он не начинался до 5-го ряда? У меня есть некоторая информация заголовка в строках 1-4, которую я хочу обойти. Большое спасибо еще раз! Dru Darby 10 лет назад 0
нет проблем, если вы измените X = 1 на X = 5 в строке 10, это запустит цикл в строке 5. Tom D 10 лет назад 0