3

Excel.Worksheet.Cells 配列を操作しているときに、転置された動作が発生しています。

最初のセルは[row = 10, column = 3]
にある必要があります 2 番目のセルは[row = 11, column = 17]にある必要があります

次に、これら 2 つのセルを境界として使用して、範囲を作成し、結合します。上記の値からわかるように、範囲はほぼ水平である必要があります。そこで、私を助けるために、セルをマージする簡単なヘルパー関数を作成しました。

    public static void MergeRange(Excel.Worksheet worksheet, int startRowIdx, 
        int startColIdx, int endRowIdx, int endColIdx, bool across = false)
    {   //Get range boundaries.
        Excel.Range cells = worksheet.Cells;

        //commented out, resolved code is directly below - N. Miller, 9-24-2013
        //Excel.Range topleftCell = cells[startColIdx][startRowIdx];
        //Excel.Range bottomrightCell = cells[endColIdx][endRowIdx];
        Excel.Range topleftCell = cells[startRowIdx, startColIdx];
        Excel.Range bottomrightCell = cells[endRowIdx, endColIdx];

        //Merge range.
        Debug.WriteLine(String.Format("({0}, {1}) to ({2}, {3}).", startRowIdx, startColIdx, endRowIdx, endColIdx)); 
        Excel.Range range = worksheet.get_Range(topleftCell, bottomrightCell);
        Excel.Interior interior = range.Interior;
        interior.ColorIndex = XLColor.PERIWINKLE; //JUST HIGHLIGHTS RANGE FOR NOW.
        //range.Merge(across);

        //Cleanup
        Marshal.ReleaseComObject(interior);
        Marshal.ReleaseComObject(range);
        Marshal.ReleaseComObject(bottomrightCell);
        Marshal.ReleaseComObject(topleftCell);
        Marshal.ReleaseComObject(cells);
    }

上記のコードでは、列と行を入れ替えて必要なセルを選択しています。これは、予想に反して、望ましい動作をもたらしますが、MSDN のドキュメントと矛盾しています。

MSDN Worksheet.Cells

MSDNのドキュメントでは、行が最初にリストされ、次に列が続く例が示されています。

だから私の質問はこれです...どれが正しいですか?行を最初にする必要がありますか、それともを最初にする必要がありますか ? MSDN ドキュメントと一致するようにコードを変更すると、強調表示されたセルが転置されます。

4

1 に答える 1

3

私があなたを正しく理解していれば、あなたがsayを使うときcells[1][2]、それはつまり、A2そのような場合、列が最初に来て、次に行が来ます. のように書くと とcells[1,2]なりますB2。この場合、行が最初に来て、次に列が来ます。

Excel-VBAでも同じです。?Cells(1)(2).address即時ウィンドウで Give and Give あなたの質問を理解していないと思われる場合は$A$2?Cells(1,2).addressもう一度$B$1言い直してください...

これをテストするための完全なコードを次に示します。

: VS 2010 Ultimate + Excel 2010 を使用してテスト済み

using System;
using System.Windows.Forms;
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;

Namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Excel.Application xlexcel;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;

            object misValue = Missing.Value;
            xlexcel = new Excel.Application();
            xlexcel.Visible = true;

            //~~> Open a File (Change filename as applicable)
            xlWorkBook = xlexcel.Workbooks.Open("C:\\SomeFile.xlsx",
                         0, true, 5, "", "", true,

            Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
            "\t", false, false, 0, true, 1, 0);

            //~~> Set Sheet 1 as the sheet you want to work with
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            Excel.Range cells = xlWorkSheet.Cells;
            Excel.Range topleftCell = cells[1][2];

            MessageBox.Show(topleftCell.Address);

            topleftCell = cells[1,2];

            MessageBox.Show(topleftCell.Address);

            //~~> Once done close and quit Excel
            xlWorkBook.Close(false, misValue, misValue);
            xlexcel.Quit();

            //~~> CleanUp
            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlexcel);
        }

        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();
            }
        }
    }
}

スクリーンショット

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-09-23T21:11:40.380 に答える