使用VBA基于B列的值重置A列中的值

时间:2012-08-17 16:04:35

标签: excel vba excel-vba excel-2003

我有一张看起来像这样的表,但更复杂:

Product            count     real count
Rake Complete      -1        n/a
Rake Head          2         =B3+B2
Rake Handle        2         =B4+B2
Bike Complete      -5        n/a
Bike Handle        10        =B6+B5
Bike Wheel         25        =B7+B5+B5
Bike Frame         90        =B8+B5+B6

使用公式,它看起来像这样:

Product            count     real count
Rake Complete      -1        n/a
Rake Head          2         1
Rake Handle        2         1
Bike Complete      -5        n/a
Bike Handle        10        5
Bike Wheel         25        15
Bike Frame         90        85

我很感激VBA代码的帮助,它会将列B的值重置为C列的值,如下所示:

Product            count    real count
Rake Complete      0        n/a
Rake Head          1        1
Rake Handle        1        1
Bike Complete      0        n/a
Bike Handle        5        5
Bike Wheel         15       15
Bike Frame         85       85

我有其他VBA代码,我将其放在其他工作表上,这些代码在count列中添加和减去值。为了保持这个工作库存尽可能准确而不是基于变量,我想每天重置B列。这样,如果计数稍微关闭,我不必重置所有内容。

我一直在研究这个问题,我知道有一个更好的方法可以做到这一点,而不是我尝试过的五个并且失败了。它需要基于列,但我的工作表有465行需要应用,随着业务的增长,此表上的行也将如此。

让我最接近的代码是:

Sub CommandButton1_Click()

    Columns("C:C").Select
    Selection.Copy
    Columns("B:B").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Dim r As Long
    For r = Cells(Rows.Count, 2).End(xlUp).Row To 1 Step -1
        If Cells(r, 2) = "n/a" Then Cells(r, 2).value = 0
    Next r

End Sub

我遇到的主要问题是每次运行代码时都会对我的其他产品进行计数。如果你看一下自行车车架,你可以单独出售,但是当你这样做的时候你也会得到自行车把手。当此代码重置时,它总是添加自行车手柄。如果我运行它10次没有变化我的库存增长更高,然后excel愿意显示。我知道如何解决这个或任何不同方式的想法吗?

3 个答案:

答案 0 :(得分:1)

复制并粘贴值 - 使用特殊粘贴 - 从C列到B列。

但是C列的值显然会发生变化 - 因为Eistein和因果或类似的东西。

答案 1 :(得分:1)

看起来你应该使用D列并将其称为Display Count,或类似的东西。在D栏中使用此公式:

=IF(C18="n/a", 0, C18)

如果他们混淆了你的老板,你可以隐藏B和C列。

Display Count Column

答案 2 :(得分:0)

在工作簿打开事件中尝试此宏。我希望它可以解决你的问题:

Dim realcount() As Variant
Dim x As Single

Private Sub Workbook_Open()
   On Error Resume Next:
    x = Sheet1.Cells(2, 3).End(xlDown).Rows
    ReDim realcount(x)
    For i = 2 To x
        realcount(i) = Sheet1.Cells(i, 3).Value
        Sheet1.Cells(i, 2).Value = realcount(i)
        If Sheet1.Cells(i, 3).Value = "n/a" Then
            Sheet1.Cells(i, 2).Value = 0
        End If
    Next
End Sub