如何使用VB.net保留公式并清除Excel中的内容?

目标达成:

  • 我有一系列我想用新数据replace的数据。

  • 所以,我想清除旧的数据,并用新的数据replace它。

  • 但旧数据中的公式也需要处理新的数据。

我做了以下几点:

Private Sub updateData(ByRef sheet As Excel.Worksheet, ByVal dataRow As String, ByRef data As Object) Dim range As Excel.Range downRange(sheet, dataRow).ClearContents() // Note this !! // Both data and formulas are lost due to this. // What shall I use instead of this to retain the formulas in the first row. range = sheet.Range(dataRow.Substring(0, dataRow.Length - 1) + (data.GetLength(0) + 1).ToString()) range.Value2 = data // If the 1st row still has the formulas, then I can do AutoFill for this new data. End Sub Private Function downRange(ByRef sheet As Excel.Worksheet, ByVal rangeString As String) Dim range As Excel.Range range = sheet.Range(rangeString) range = sheet.Range(range, range.End(Excel.XlDirection.xlDown)) Return range End Function 

但是,问题是:

  • 公式正在迷失。 (明显)
  • 我想保留第一行中的公式,以便我可以做自动填充
  • 你能提出一些解决scheme吗?

所需结果演示:

旧数据:

  | A | B | C | 1 | H1 | H2 | H3 | 2 | =B2+C2 | 5 | 9 | Therefore, A2 = 14 3 | =B3+C3 | 7 | 2 | Therefore, A3 = 9 

我想replace数据并保留公式,以便(新数据):

  | A | B | C | 1 | H1 | H2 | H3 | 2 | =B2+C2 | 4 | 6 | Therefore, A2 = 10 3 | =B3+C3 | 3 | 5 | Therefore, A3 = 8 

给定的调用是updateData(sheet, "A2:C2", dataFromDB)

我怎样才能保存公式,但改变数据,而不改变函数调用?

我想你已经差不多了 – 看起来你只需要从上面一行开始清空。

假设你有访问Range.Offset方法(我没有一个简单的方法来从Vb.Nettesting这个,但我没有理由为什么它不应该可用),那么你应该能够只移动你的起始单元格:

 Private Function downRange(ByRef sheet As Excel.Worksheet, ByVal rangeString As String) Dim range As Excel.Range range = sheet.Range(rangeString).Offset(1, 0) // Here's the extra piece range = sheet.Range(range, range.End(Excel.XlDirection.xlDown)) Return range End Function 

我有一个类似的问题,并使用这个逻辑,当我清除细胞。 下面的代码片段将清除第2-1000行以外的列AC&F中的单元格,但第5行除外。如果要对要清除的内容进行细化控制,请使用此选项。 :

 Const clearCells = "A?:C?,F?" Sub clearCells() For i = 2 To 1000 If i <> 5 Then Range(Replace(clearCells, "?", i)).ClearContents End If Next i End Sub 

一个更简单的方法是清除行2-2000中的列AC和F:

  Range ("A2:C2000,F2:F2000").ClearContents 

最后,为了重写你的程序,你可以遍历范围实例化一个新的范围,并添加单元格到范围,只要他们没有像这样的公式:

 Private Function downRange(ByRef sheet As Excel.Worksheet, ByVal rangeString As String) Dim inRange As Excel.range Dim outRange As range Set inRange = sheet.range(rangeString) Set inRange = sheet.range(inRange, inRange.End(Excel.XlDirection.xlDown)) Dim r As range For Each r In inRange If Left(r.Formula, 1) <> "=" Then If outRange Is Nothing Then Set outRange = r Else Set outRange = Application.Union(outRange, r) End If End If Next r downRange = outRange End Function 

如果要保留第一行中的公式,请不要select要删除的第一行。 通过"A3:F3"function。

至于自动填充,请使用Range.FormulaR1C1属性。 从第一个单元格中读取FormulaR1C1 ,并在剩余的单元格中将相同的值写入FormulaR1C1