2012-12-07 41 views
1

所以這裏是我經歷的一切。我使用Excel的DLL與C#爲了進入一個大而討厭的Excel表格,以便其他人不必。複製公式 - 並將其應用到新的小區範圍

我們在一個單元格的公式是相當大的,我們不希望它複製到因爲這每一行。此公式在放置的行上使用多個值。如果它在第1行上,則使用該行中的大量單元格。

當一個拷貝這個公式通常在Excel中,細胞的新的範圍被修改以反映新的起始位置。

的問題是,當我複製這樣的公式,它仍然給我的一切,與第一排的,而不是在那裏我粘貼它的行做的價值觀.....下面是我的代碼:

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

有人可以讓我知道如何使公式實際上也適用於新行,而不是第1行?

+0

爲什麼不只需將公式單元格複製/粘貼到新的目的地? –

+0

你可以用c#來做到這一點嗎?這就是我所追求的。 – Mizmor

+0

@Mizmor,是否有任何解決方案爲您提供幫助? – RAS

回答

5

這可能會工作,因爲它從VBA工作......在大多數情況下。

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

這工作,因爲FormulaR1C1(不是非常翔實鏈接)使用,它描述了引用的單元格位置相對於當前單元格,而不是說要使用的細胞R1C1符號。這意味着實際的引用依賴於具有公式的單元格。當你只是用Formula,你複製Formula恰好包括硬編碼的單元格引用的字符串。

+0

謝謝你,先生。 – Sam

1

你可以使用Application.ConvertFormula

所以,讓我們說我的手機= 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(); 
    } 
} 
相關問題