0

私はあちこち検索しましたが、誰も私と同じ問題を抱えていませんでした。

基本的に、ユーザーは Excel 内のセルをクリックし、フォームを開き、値を入力し、挿入をクリックします。これらの変数を配列に追加し、Excel が読み取って配置するプログラム。

これは私の最初の Office アプリなので、ここでは完全に盲目的に飛んでいますが、これは私の擬似コードです。

私のソリューションが編集されました:

        static string GetColumnLetter(int columnNumber)
    {
        var dividend = columnNumber;
        var columnName = String.Empty;

        while (dividend > 0)
        {
            var modulo = (dividend - 1) % 26;
            columnName = Convert.ToChar(65 + modulo) + columnName;
            dividend = ((dividend - modulo) / 26);
        }

        return columnName;

    }



        // Insert into Excel
    public static void ExcelInsert(string mFunction, string mColor, int mQty, string mFau, string mPrice)
    {
        var values = new List<string>
                         {
                             mFunction,
                             mColor,
                             mQty.ToString(),
                             mFau,
                             mPrice
                         }.ToArray();

        var rowNumber = Globals.ThisAddIn.Application.ActiveCell.Row;
        var columnNumber = Globals.ThisAddIn.Application.ActiveCell.Column;
        var columnLetter = GetColumnLetter(columnNumber);

        for (var i = 0; i < values.Count(); i++ )
        {
            var range = Globals.ThisAddIn.Application.Range[String.Format("{0}{1}", columnLetter, rowNumber)];
            range.Value = values[i];
            columnNumber++;
            columnLetter = GetColumnLetter(columnNumber);
        }
    }
4

3 に答える 3

2

アクティブなセルの位置を取得して、次のように各値を一度に 1 つずつ追加していきます。

using Excel = Microsoft.Office.Interop.Excel;

void MyMethod()
{
    //Replace '7' with the number of fields on your Windows Form
    int numberOfFields = 7;

    string[] array = new string[numberOfFields];

    array[0] = textBoxOneValue;
    array[1] = textBoxTwoValue;
    array[2] = textBoxThreeValue;
    array[3] = textBoxFourValue;
    array[4] = textBoxFiveValue;
    array[5] = textBoxSixValue;
    array[6] = textBoxSevenValue;

    Excel.Application application = new Excel.Application();
    Excel.Workbook workbook = application.Workbooks.Open(@"C:\whatever.xlsx");
    Excel.Worksheet worksheet = workbook.ActiveSheet;

    Excel.Range activeCell = application.ActiveCell;

    int rowNumber = activeCell.Row;
    int columnNumber = activeCell.Column;

    string columnLetter = GetColumnLetter(columnNumber);

    for(int i = 0; i < numberOfFields; i++)
    {
        Excel.Range range = worksheet.get_Range(String.Format("{0}{1}", columnLetter, rowNumber));
        range.Value = array[i];
        columnNumber++;
        columnLetter = GetColumnLetter(columnNumber);
    }
}

string GetColumnLetter()
{
    int dividend = columnNumber;
    string columnName = String.Empty;
    int modulo;

    while (dividend > 0)
    {
        modulo = (dividend - 1) % 26;
        columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
        dividend = (int)((dividend - modulo) / 26);
    }

    return columnName;

}

もちろん、GetColumnLetterメソッドはGrahamの功績によるものです。これは、私が今まで見た中で最も天才的なものです。

于 2012-09-30T19:42:25.973 に答える
0

そのためのループは必要ありません。

arrが配列の場合、

ActiveCell.Resize(, UBound(arr) - LBound(arr) + 1).Value = arr
于 2012-09-30T19:07:48.923 に答える
0

これは、配列を反復処理する古典的な方法です

Dim x(3) As String ' your array
x(0) = "abc"
x(1) = "def"
x(2) = "ghi"
x(3) = "jkl"

Dim r As Range ' range to paste
Set r = ActiveCell

For Each s In x
    r.Value = s
    Set r = r.Offset(,1) ' keep going right
Next

0 の位置に何もない場合は、次の方法が役立ちます。

Dim x(4) As String ' this can actually contain 5 items, from 0 to 4
x(1) = "abc"
x(2) = "def"
x(3) = "ghi"
x(4) = "jkl"

Dim r As Range ' range to paste
Set r = ActiveCell

For i = 1 To UBound(x) ' skip 0
    r.Value = x(i)
    Set r = r.Offset(, 1) ' keep going right
Next
于 2012-09-30T19:12:25.280 に答える