根据另一个单元格值将公式写入单元格

时间:2013-04-03 11:41:46

标签: excel vba excel-vba excel-2007

我本来希望写一个宏给我做一个非常重复的任务,但进入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宏:选择一个单元格,并判断单元格是否为数字...为记录,数字单元格已从文本转换为数字格式。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:8)

你需要VBA吗?

在C列之前插入一个新列 带有您的值的C列成为D列 您可能需要柱头..
在单元格C2中放置:=IF(E2=0;0;SUM(E$2:$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”

答案 2 :(得分:-1)

您好,您可以使用if公式和命名公式。 if(isnumber,命名公式,0)

命名公式(=查找公式)