Не писать с самого начала в электронной таблице. Эксель VBA.

Я пытаюсь сделать систему инвентаризации. У меня есть доступное количество и количество повторного заказа. Пользователь время от времени нажимает кнопку оповещения. Если количество повторного заказа меньше Доступного количества, делается запись на этой странице предупреждения. Я создаю новую страницу предупреждений каждый раз, когда пользователь нажимает кнопку «Предупреждение». Я очищаю содержимое этой страницы каждый раз для этого.

Проблема, с которой я сталкиваюсь, заключается в том, что MS Excel очищает содержимое, но не записывает новые записи из второй строки (в первой строке есть метки столбцов). Если у меня есть 5 содержимого на складе до того, как текущее количество ‹ количество повторного заказа, и предупреждение создается на странице предупреждений, а затем, если я позабочусь об этих 5 (добавлю количество так, чтобы оно было не меньше, чем количество повторного заказа), и теперь я имеют 6-й контент, количество которого меньше, чем количество повторного заказа, остальные 5 не отображаются, а 6-й отображается в 7-й строке, а не в первой строке. Где я ошибаюсь. Это происходит, даже если я закрываю файл и снова открываю его.

Спасибо

row = 2
Worksheets("Alerts").UsedRange.ClearContents
Worksheets("Alerts").Range("B1") = Str(row)
Worksheets("Alerts").Cells(1, 1) = "Warehouse Name"
Worksheets("Alerts").Cells(1, 2) = "Name"
Worksheets("Alerts").Cells(1, 3) = "Quantity available"
Worksheets("Alerts").Cells(1, 4) = "Reorder Quantity"
rows_present_alerts = Worksheets("Alerts").UsedRange.Rows.Count + 1
While (Worksheets("InventoryID").Cells(row, 1) <> "")
    If (CLng(Worksheets("InventoryID").Cells(row, 3)) <    
       CLng(Worksheets("InventoryID").Cells(row, 4))) Then
       Worksheets("Alerts").Cells(rows_present_alerts, 1) = (Worksheets("InventoryID").Cells(row, 1))
       Worksheets("Alerts").Cells(rows_present_alerts, 2) = (Worksheets("InventoryID").Cells(row, 2))
       Worksheets("Alerts").Cells(rows_present_alerts, 3) = (Worksheets("InventoryID").Cells(row, 3))
       Worksheets("Alerts").Cells(rows_present_alerts, 4) = (Worksheets("InventoryID").Cells(row, 4))
       rows_present_alerts = rows_present_alerts + 1
    End If
   row = row + 1
Wend

person Ank    schedule 23.11.2011    source источник


Ответы (2)


Почему бы просто не использовать row в своем цикле, а не row_present_alerts, если вы знаете, что каждый раз будете начинать со второй строки? Для меня не имеет особого смысла, что вы очищаете лист, а затем беспокоитесь о количестве строк в используемом диапазоне. Не говоря уже о том, что UsedRange, как известно, непредсказуем, особенно если у вас есть форматирование или что-то подобное на листе.

Я думаю, это то, что вам нужно:

row = 2
loopCounter = 2

Worksheets("Alerts").Cells.ClearContents
Worksheets("Alerts").Range("B1") = Str(row)
Worksheets("Alerts").Cells(1, 1) = "Warehouse Name"
Worksheets("Alerts").Cells(1, 2) = "Name"
Worksheets("Alerts").Cells(1, 3) = "Quantity available"
Worksheets("Alerts").Cells(1, 4) = "Reorder Quantity"

While (Worksheets("InventoryID").Cells(loopCounter, 1) <> "")
    If (CLng(Worksheets("InventoryID").Cells(row, 3)) <    
       CLng(Worksheets("InventoryID").Cells(row, 4))) Then
       Worksheets("Alerts").Cells(row, 1) = (Worksheets("InventoryID").Cells(loopCounter, 1))
       Worksheets("Alerts").Cells(row, 2) = (Worksheets("InventoryID").Cells(loopCounter, 2))
       Worksheets("Alerts").Cells(row, 3) = (Worksheets("InventoryID").Cells(loopCounter, 3))
       Worksheets("Alerts").Cells(row, 4) = (Worksheets("InventoryID").Cells(loopCounter, 4))
       row = row + 1
    End If
    loopCounter = loopCounter + 1
Wend
person Michael Kingsmill    schedule 23.11.2011
comment
ну, я использовал две переменные, потому что лист InventoryID будет иметь много строк, и не все будут соответствовать требованиям для предупреждений (условие состоит в том, что количество повторного заказа должно быть меньше доступного количества). Поэтому, если 2-й, 8-й и 10-й элементы в InventoryID нуждаются в изменении порядка, в моем листе предупреждений будут записи во 2-й, 8-й и 10-й строке, а остальные будут пустыми. - person Ank; 24.11.2011
comment
@Ankur, да, две переменные - это правильный способ справиться с этим, и я сохранил этот подход в своем решении. Я просто удалил немного об используемом диапазоне и очистил весь лист. Я думаю, это сработает для вас. - person Michael Kingsmill; 24.11.2011

Сохранено ли какое-либо форматирование в ячейках листа предупреждений? Excel имеет ряд странностей в том, как он вычисляет и работает с UsedRange, а ClearContents только очищает данные, а не форматирует и т. д.

Есть ли причина, по которой вы не можете просто удалить рабочий лист предупреждений, а затем каждый раз создавать новый? Это должно решить проблему.

person Vicky    schedule 23.11.2011
comment
Вы имеете в виду что-то вроде этого ................. Application.DisplayAlerts = False Sheets(Alerts).Delete Application.DisplayAlerts = True Worksheets.Add.Name = Alerts - person Ank; 24.11.2011
comment
Спасибо Вики!! в этом случае это работает, но есть еще одна похожая ситуация, с которой я сталкиваюсь, когда я не могу удалить рабочий лист. Что мне делать, если я не хочу удалять рабочий лист !! - person Ank; 24.11.2011