代码之家  ›  专栏  ›  技术社区  ›  Aximili

C#和Microsoft.Office.Interop.Excel-如何用公式值替换公式?

  •  1
  • Aximili  · 技术社区  · 14 年前

    我试图用它们的值替换D列上的公式。

    当前D1=C1/2

    如果C1=10,我希望D1为5

    我需要这样做,因为我需要删除C列。

    我试着把格式改成下面这样的文本,但它似乎没有用公式的值替换公式

      Excel.Style style = workbook.Styles.Add("styleText", Missing.Value);
      style.NumberFormat = "@";
    
      Excel.Range range = (Excel.Range)sheet.get_Range("D1", Missing.Value);
      range.Style = style;
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Lorenzo OnoSendai    14 年前

    这是VBA中的宏,它可以满足您的需要。。。这是VB代码,但我认为用C语言翻译不成问题#

    Sub ValuesOnly()
        Dim rRange As Range
        On Error Resume Next
        Set rRange = Application.InputBox(Prompt:="Select the formulas", Title:="VALUES ONLY", Type:=8)
        If rRange Is Nothing Then Exit Sub
        rRange = rRange.Value
    End Sub
    

    另一种方法是模拟命令Paste Special->Values。我刚刚录制了一个执行此操作的宏(示例中的C5是一个包含函数的单元格)

    Sub Macro1()
        Range("C5").Select
        Selection.Copy
        Range("D5").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    End Sub
    
        2
  •  1
  •   Lorenzo OnoSendai    14 年前

    如何设置评论格式??

    这是我得到的解决办法,多亏了洛伦佐

    private static void ReplaceFormulasWithValues(ref Excel.Worksheet sheet, char column)
    {
      Excel.Range range = (Excel.Range)sheet.get_Range(column + "1", Missing.Value).EntireColumn;
      range.Copy(Missing.Value);
      range.PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteValues,
        Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
    }
    

    这是另一种方法(C1包含一个公式,结果放在D1中)

    static void Main( string[] args ) {
        string fileName = @"D:\devprj\Temp\TempProject\bin\Debug\Cartel1.xlsx";
        Application ac = new Application();
        Workbook wb = ac.Workbooks.Open( fileName );
        Worksheet ws = wb.Sheets[1];
    
        Range rangeOrigin = ws.get_Range( "C1" );
        Range rangeDestination = ws.get_Range( "D1" );
        rangeDestination.Value = rangeOrigin.Value2;
    
        wb.Save();
    }
    
        3
  •  0
  •   Andrew Cooper    14 年前

    不能只更改显示样式,因为这不会更改单元格的内容。在Excel中手动执行此操作时,需要复制列,然后选择“特殊粘贴->值”以粘贴值,而不是公式。我想有一种编程的方法来做同样的操作。