不是从电子表格的开头写的。 Excel VBA。

时间:2011-11-23 20:52:02

标签: excel vba excel-vba spreadsheet

我正在尝试制作库存系统。我有可用的数量和重新订购数量。用户不时地单击警报按钮。如果重新订购数量小于可用数量,则会生成此警报页面的条目。每次用户点击“提醒”按钮时,我都会创建一个新的提醒页面。我每次都清除此页面的内容。

我面临的问题是MS excel正在清除内容,但没有从第二行写入新记录(第一行有列标签)。如果我在仓库中有5个内容,然后才有当前数量<重新订购数量并在警报页面中生成警报,然后如果我处理那些5(添加数量使其不再重新订购数量),现在我有第6个数量小于重新订购数量的内容,其他5个不显示但第6行显示在第7行而不是第1行。我在哪里弄错了。 即使我关闭文件并重新打开它,也会发生这种情况。

由于

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

2 个答案:

答案 0 :(得分:3)

如果您知道每次都要在第二行开始,为什么不在循环中使用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

答案 1 :(得分:2)

您的“警报”表格中的单元格中是否保存了任何格式? Excel在计算和使用UsedRange方面有许多奇怪之处,ClearContents只清除数据,而不是格式化等。

您是否有任何理由不能删除警报工作表,然后每次都创建一个新工作表?这应该可以解决问题。