3

Webをトロールしましたが、ドキュメントによると、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は、コピーして貼り付けるセルです。セルの値は2行下に移動しますが、コピーであるため、上記のセルにデータが残り、Deleteメソッドによって例外が発生します。ただし、実際の問題は、作成したNamedRangeのセルを移動した後です。

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

それでも元のセル範囲(セルを下に移動する前の場所)を参照します。

C#VSTO 4.0でNamedRangeをプログラムで移動するにはどうすればよいですか?

理想的には、セルを範囲に配置する前にセルを移動する必要はありませんが、これが唯一の解決策である場合は、それを使用する必要があります。

編集:

VSTO C#でVBAのような構文を試すことについてのDoug Glancyのコメントを読んだ後、私は次のことを思いつきました。

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?!?!から失われます。

4

1 に答える 1

4

名前付き範囲を別のアドレスで再度追加することにより、その範囲を「移動」できます。たとえば、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);
        }
于 2012-05-16T01:45:50.560 に答える