簡體   English   中英

如何在Excel中移動NamedRange - VSTO而不是VBA

[英]How to Move a NamedRange in Excel - VSTO not VBA

我已經在網上搜索,根據文檔,似乎沒有移動NamedRange的方法: http//msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange_methods (v = VS.80)的.aspx

我有以下代碼將單元格數據復制到幾行:

activeSheet.Range[leftColumn + startRow, rightColumn + endRow].Copy();
//activeSheet.Range[leftColumn + startRow, rightColumn + endRow].Delete();
Range newRange = activeSheet.get_Range(leftColumn + (startRow + RowsToMoveDown.Count), rightColumn + (endRow + RowsToMoveDown.Count));
newRange.PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationNone, Missing.Value, Missing.Value);

NamedRange是我正在復制和粘貼的單元格,它確實將單元格值向下移動了幾行,但因為它的復制它將數據留在上面的單元格中,而Delete方法會導致異常。 然而,真正的問題是在我移動了我創建的NamedRange的單元格之后:

rnArea = activeSheet.Range[leftColumn + startRow , rightColumn + (MyData.Values.Length + startRow)];
Name name = activeBook.Names.Add(uniqueName, rnArea);

仍然指的是原始的細胞范圍(我移動細胞之前的位置)。

如何以編程方式在C#VSTO 4.0中移動NamedRange?

理想情況下,在將它們放入Range之前我不必移動單元格,但如果這是唯一的解決方案,那么我將不得不繼續使用它。

編輯:

在閱讀了Doug Glancy關於在VSTO C#中嘗試使用類似VBA語法的評論后,我想出了以下內容:

for (int i = 0; i < activeWorkbook.Names.Count; i++)
{
name = activeWorkbook.Names.Item(i + 1);
Debug.Write(name.Name.ToString());

System.Diagnostics.Debug.Write(name.RefersTo.ToString() + Environment.NewLine);
//prints out "Sheet1!$A$1:$A$25"
name.RefersTo = "Sheet1!$A$2:$A$26";
System.Diagnostics.Debug.Write(name.RefersTo.ToString());
//prints out "Sheet1!$A$2:$A$26"
}

但是,當我運行此代碼並更改NamedRange RefersTo值時,結果是NamedRange從Excel NamedRange DropDownList中丟失了?!?!

您可以通過使用不同的地址再次添加命名范圍來“移動”它。 例如,在VBA中:

Sub MoveNamedRange()
ActiveSheet.Names.Add Name:="test", RefersTo:="=$A$1"
Debug.Print ActiveSheet.Range("test").Address
ActiveSheet.Names.Add Name:="test", RefersTo:="=$A$2"
Debug.Print ActiveSheet.Range("test").Address
End Sub

這將編譯並運行並在即時窗口中生成以下內容:

$A$1
$A$2

編輯 - C很難! 但我設法在VS 2010 C#中拼湊了這個。 它來自一個工作簿項目,但我也相信它也適用於插件。 我不認為我需要VS 2010中的所有Type.Missing,但我很確定我已經讀過早期版本需要它們:

private void Sheet1_Startup(object sender, System.EventArgs e)
        {
            Globals.Sheet1.Names.Add("test", Globals.Sheet1.Range["A1"], System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
            MessageBox.Show(Globals.Sheet1.Range["test"].Address);
            Globals.Sheet1.Names.Add("test", Globals.Sheet1.Range["A2"], System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
            MessageBox.Show(Globals.Sheet1.Range["test"].Address);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM