首页 文章

复制公式 - 并将其应用于新的单元格范围

提问于
浏览
1

所以这就是我正在经历的事情 . 我正在使用带有c#的Excel dll,以便进入一个大而讨厌的excel表,以便其他人不必这样做 .

我们在一个单元格中有一个相当大的公式,我们不希望因此而将它复制到每一行 . 此公式在放置它的行上使用多个值 . 如果它在第1行,它会使用该行中的大量单元格 .

当通常在excel中复制此公式时,将修改单元格的新范围以反映新的起始位置 .

问题是,当我复制这样的公式时,它仍然给我所有与第一行有关的值,而不是我粘贴它的行.....这是我的代码:

sheet.Cells[77][row].Formula = sheet.Cells[77][1].Formula;

有人可以让我知道如何使公式实际应用于新行而不是第1行?

3 回答

  • 7

    这可能会起作用,因为它在VBA中起作用......在大多数情况下 .

    sheet.Cells[77][row].FormulaR1C1 = sheet.Cells[77][1].FormulaR1C1;
    

    这将起作用,因为FormulaR1C1(不是非常有用的链接)使用R1C1表示法,它描述了与当前单元格相关的引用单元格位置,而不是说要使用哪些单元格 . 这意味着实际参考值取决于具有公式的单元格 . 当你只使用 Formula 时,你正在复制 Formula 的字符串,其中包括硬编码的单元格引用 .

  • 1

    你可以用 Application.ConvertFormula

    所以,假设我的Cell = Cells 77有一个公式,表示 =Sum(B77,C77) (来自同一行的单元格) .
    如果想将它复制到它下面的单元格,你会做类似的事情:

    string formula = Sheet1.Cells[77][2].Formula;
    Sheet1.Cells[77][2].Formula = app.ConvertFormula(formula, XlReferenceStyle.xlA1, XlReferenceStyle.xlR1C1, XlReferenceType.xlRelative, Sheet1.Cells[77][3]);
    

    适用的完整控制台应用程序(您需要修改单元格) .

    static void Main(string[] args)
            {
               var app = new Microsoft.Office.Interop.Excel.Application();
    
                    var workbook = app.Workbooks.Open(@"C:\Users\user\Desktop\Book1.xlsx");
                    Microsoft.Office.Interop.Excel.Worksheet Sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item("Sheet1");
                    string formula = Sheet1.Cells[5][3].Formula;
                    Sheet1.Cells[5][4].Formula = app.ConvertFormula(formula, XlReferenceStyle.xlA1, XlReferenceStyle.xlR1C1, XlReferenceType.xlRelative, Sheet1.Cells[5][3]);
                    workbook.SaveAs(@"C:\Users\user\desktop\test.xlsx");
                    workbook.Close();
            }
    

    您可以根据自己的喜好修改 ConvertFormula 方法的第三个和第四个参数 . 在此处阅读有关此方法的更多信息:ConvertFormula .
    如果要跨多行拉伸公式,可以尝试使用range.AutoFill()

  • 0

    嗨大家好发帖,因为这段代码用于复制Excel中单元格后面的公式:

    public void copy_Formula_behind_cell()
    {
        Excel.Application xlapp;
        Excel.Workbook xlworkbook;
        Excel.Worksheet xlworksheet;
        Excel.Range xlrng;
        object misValue = System.Reflection.Missing.Value;
    
        xlapp = new Excel.Application();
        xlworkbook =xlapp.Workbooks.Open("YOUR_FILE", 0, true, 5, "", 
        "",true,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", 
        false, 
        false, 0, true, 1, 0);
    
        xlworksheet = (Excel.Worksheet)xlworkbook.Worksheets.get_Item(1);
    
        string sp = xlworksheet.Cells[3,2].Formula;//It will Select Formula using Fromula method//
    
        xlworksheet.Cells[8,2].Formula = 
        xlapp.ConvertFormula(sp,XlReferenceStyle.xlA1, 
        XlReferenceStyle.xlR1C1, XlReferenceType.xlAbsolute,
        xlworksheet.Cells[8][2]);
        //This is used to Copy the exact formula to where you want//
    
        xlapp.Visible = true;
        xlworkbook.Close(true, misValue, misValue);
        xlapp.Quit();
    
        releaseObject(xlworksheet);
        releaseObject(xlworkbook);
        releaseObject(xlapp);
    }
    
    
    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Unable to release the Object " + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    }
    

相关问题