1

これが私が経験していることです。私は他の人がそうする必要がないように大きくて厄介なExcelシートの中に入るためにc#でExceldllを使用しています。

1つのセルにかなり大きな数式があり、これが原因ですべての行に数式をコピーしたくありません。この数式は、配置されている行で複数の値を使用します。行1にある場合は、その行の多くのセルを使用します。

この数式を通常Excelでコピーすると、セルの新しい範囲が変更され、新しい開始位置が反映されます。

問題は、このように数式をコピーしても、貼り付けた行ではなく、最初の行に関係するすべての値が表示されることです。コードは次のとおりです。

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

数式を行1ではなく新しい行に実際に適用する方法を教えてもらえますか?

4

4 に答える 4

12

ほとんどの場合、VBAから機能するため、これはおそらく機能します。

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

FormulaR1C1(あまり有益なリンクではありません)は、使用するセルを指定する代わりに、現在のセルに関連する参照セルの位置を記述するR1C1表記を使用するため、これは機能します。これは、実際の参照が数式のセルに依存していることを意味します。を使用するだけで、ハードコードされたセル参照を正確に含むFormula文字列をコピーすることになります。Formula

于 2012-12-07T23:56:39.007 に答える
2

あなたが使うことができます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();
        }   

メソッドの3番目と4番目のパラメータをConvertFormula好みに合わせて変更できます。このメソッドの詳細については、ConvertFormulaを参照してください。
複数の行にまたがって数式を拡大する場合は、range.AutoFill()を使用してみてください。

于 2012-12-08T00:22:07.420 に答える
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();
    }
}
于 2017-10-14T07:30:24.033 に答える
0

私は、c#コードとMicrosoft.Office.Interop.Excelライブラリを使用してExcelの数式を範囲指定するためにこのコードを投稿しています。

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.Excel();
    }

    public void Excel()
    {
        Application xlApp = new Application();
        Workbook xlWorkBook;
        Worksheet xlWorkSheet;
        object misValue = Missing.Value;

        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(1);

        for (int r = 1; r < 5; r++) //r stands for ExcelRow and c for ExcelColumn
        {
            // Its a my sample example: Excel row and column start positions for writing Row=1 and Col=1
            for (int c = 1; c < 3; c++)
            {
                if (c == 2)
                {
                    if (r == 1)
                    {
                        xlWorkSheet.Cells[r, c].Formula = "=SUM(A1+200)";
                    }
                    continue;
                }
                xlWorkSheet.Cells[r, c] = r;
            }
        }
        Range rng = xlWorkSheet.get_Range("B1");
        //  This is the main code we can range our excel sheet formulas
        rng.AutoFill(xlWorkSheet.get_Range("B1", "B4"), XlAutoFillType.xlLinearTrend);

        xlWorkBook.Worksheets[1].Name = "MySheetData";//Renaming the Sheet1 to MySheet

        xlWorkBook.SaveAs(@"E:\test.xlsx");

        xlWorkBook.Close();

        Marshal.ReleaseComObject(xlWorkSheet);
        Marshal.ReleaseComObject(xlWorkBook);
        Marshal.ReleaseComObject(xlApp);

    }
}
于 2020-11-22T15:19:41.797 に答える