6

我希望编写一个宏来为我完成一项非常重复的任务,但进入 VBA 比预期的要难。当我有时间的时候,我会学习如何为 excel 编写宏,因为它看起来非常有用,但是我这周不能花 5 到 12 个小时。

也许这里有人可以提供帮助!

我有一些遵循这种模式的 excel 文件:

Column C - Column D
--------------------
text     | (empty)
number   | (empty)
number   | (empty)
text     | (empty)
number   | (empty)
text     | (empty)
text     | (empty)
number   | (empty)
text     | (empty)
number   | (empty)

文本和数字在几千个单元格中随机交替。我需要 D 列保存,当 C 列是数字时,与前一个数字的差值,否则它必须保持空白:

Column C - Column D
--------------------
text     | (empty)
3        | (empty)
14       | (=C3-C2) : 11
text     | (empty)
16       | (=C5-C3) : 2
text     | (empty)
text     | (empty)
21       | (=C8-C5) : 5
22       | (=C9-C8) : 1

所以算法是:

var previousNumberCell
var i = 1

for all (selected) cells/rows 
 if (Row(i).column(C) holds number) {
   Row(i).column(D).value = "=C"+i+"-"C"+previousNumberCell
   previousNumberCell = i;
 }
 i++

End

我不在乎第一个或最后一个单元格是否不起作用。

非常感谢您的帮助,或者如果您能指出我在哪里可以找到答案。

编辑:这是问题的简化版本,有两件事我不知道如何使用 excel 宏做得好:选择一个单元格,并判断单元格是否为数字...作为记录,数字单元格已被转换从文本到数字格式。

4

3 回答 3

13

试一试:

Sub MyMacro()
Dim rng as Range
Dim cl as Range
Dim lastNum as Range
Set rng = Range(Selection.Address) 'Make sure that your active SELECTION is correct before running the macro'

If Not rng.Columns.Count = 1 Then
    MsgBox "Please select only 1 column of data at a time.",vbCritical
    Exit SUb
Else:
    For each cl in rng
        If IsNumeric(cl.Value) Then
            If lastNum Is Nothing Then
                cl.Offset(0,1).Formula = "=" & cl.Address
            Else:
                cl.Offset(0,1).Formula = "=" & cl.Address & "-" & lastNum.Address

            End If
            set lastNum = cl
        End If
    Next
End If

End Sub
于 2013-04-03T11:49:21.137 回答
8

你需要VBA吗?

在 C 列之前插入一个新列 C
列与您的值成为 D 列
您可能需要列标题..
在单元格 C2 中放置:=IF(E2=0;0;SUM(E$2:$E2))这标识带有数字的行
在单元格 E2 中放置:=IF(ISNUMBER(D2);1;0)这将为每一行设置一个数字,以便在 vlookup 中使用下一个
在单元格 F2 中输入:=IF(ISNUMBER(D2);ABS(D2-VLOOKUP(MAX($C$1:C1);$C$1:D1;2;0));"")
自动填充列 C、E 和 F。
在列 F 中,您会得到结果,除了第一个,即“#VALUE”

于 2013-04-03T12:34:15.550 回答
-1

嗨,您可以使用 if 公式和命名公式来执行此操作。if (isnumber ,命名公式,0)

命名公式(=查找公式)

于 2015-02-13T14:03:23.730 回答