设置库存的上限和下限

时间:2018-06-12 14:46:35

标签: arrays excel vba excel-vba limits

所以我遇到了VBA的一些麻烦。我一直在做一个库存项目,正当我即将完成它时,我被抛出了一个涉及VBA的额外任务。我对VBA非常缺乏经验,所以希望有人可以指出我正确的方向。

Unfortunately, I cannot post actual pictures of the inventory sheets, so I will make a mock-up. The actual quantities of the items are in column G, starting at row 10 down to row 2084. 

Example: 2 8 4 13 29 29 38 55 8 75.

我的客户想要的是使用VBA脚本设置库存数量的上限和下限。请求的参数如下:

**Low Limit:** 
IF value is 10 or less - set low limit to 10;
IF value is between 10 and 30 - set low limit to 10;
IF value is 30 or greater - set low limit to 30;

**High Limit:** 
50% more than what each value is, rounded to the nearest whole number, unless that value is 10 or below. In which case the high limit would be 15, since the low limit of those values is set to 10. 

我目前拥有的库存数量是初始数量。在删除/添加到库存中时,这些数量将会更改。但是,这些初始量将用作高/低限制的基线。所以我的想法是,初始数量需要存储到一个数组中,并且数组中的初始数量将用于计算上限/下限,即使库存已更新。如果那是不可能的,我只会在电子表格中添加一个初始库存列,但它是一个固定的模板,所以他们宁愿我不这样做。

此外,在运行VBA脚本以确定上限/下限后,我希望单个数量单元格在该值低于下限时变为红色,如果该值高于上限,则为蓝色。显然,第一次运行时,将没有高于上限的值,因为这些值将用于计算上限。但是,最初低于10的所有数量都会使其单元格变为红色,因为它们的开始低于其定义的下限。

我知道这很多,但任何帮助都会受到赞赏,因为我不知道从哪里开始。谢谢!!

1 个答案:

答案 0 :(得分:0)

我相信这就是你所需要的。

如果要在初始值上保存上限,则需要为ex创建新的表单。配置和使用正常的Excel功能创建高限值。 (在Sheet1中,我创建了示例值的列表)

=ROUND(IF(Sheet1!A1<=10; 15;Sheet1!A1*1,5);0)

然后,您需要复制此单元格并仅粘贴Config中的值而不是公式。

这里有代码可以满足您的需求。

Private Sub prcCheckLimits()
    Dim ws As Worksheet: Set ws = ThisWorkbook.ActiveSheet
    Dim wsHighLimit As Worksheet: Set wsHighLimit = ThisWorkbook.Sheets("Config")
    Dim lngRow As Long 'lastRow
    Dim i As Long

    lngRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 1 To lngRow
        With ws
            If .Cells(i, 1).value < fncLowLimit(.Cells(i, 1).value) Then
                .Cells(i, 1).Interior.ColorIndex = 3
            ElseIf .Cells(i, 1).value > wsHighLimit.Cells(i, 1).value Then
                .Cells(i, 1).Interior.ColorIndex = 37
            Else
                .Cells(i, 1).Interior.ColorIndex = 0
            End If
        End With
    Next i
End Sub

Private Function fncLowLimit(value As Long) As Long
    Dim result As Long

    If value < 30 Then
        result = 10
    Else
        result = 30
    End If

    fncLowLimit = result
End Function