2

Excelアドインで選択されているセルまたはセルに含まれる値をキャプチャする必要があります。現在、...ActiveWindow.Selectionとget_Value()を使用して、複数のセルを一度に選択し、...ActiveCellを取得しています選択されている単一のセルを取得する値。私の問題は、単一のセルに単一の値を入力し、値をキャプチャするボタンをクリックすると、そのセルがまだ編集されている場合、すべてが null に戻ることです (カーソルはセル内にありますが、値を入力しました)。 . この値を取得する方法を知っている人はいますか? 単一の値を入力しようとすると、ユーザーが混乱する原因になっていることはすでにわかっています。

要求された説明:

var selectedCell = Globals.ThisAddIn.Application.ActiveCell.Value;

このセルに値を入力してすぐにボタンをクリックすると、セルが編集モードで選択モードではないため、この値は null になります。それを機能させるには、セルをクリックしてから、シングルクリックして選択する必要があります。セルのさまざまな状態を考えてみてください...セルをダブルクリックすると、編集モードになります。一度クリックすると選択されます。まだ編集モードになっているセルの値が必要です。

4

2 に答える 2

3

VSTO アドインでも同じ問題に取り組みました。多くの調査を行った結果、まだ編集モードにあるセルの値を VSTO API で取得する方法はないと結論付けました。最終的に、次の解決策をハックしました。ボタンが押されるたびに、Excel が編集モードかどうかを確認し、編集モードの場合は、ボタンを押す前に編集モードを終了する必要があることをユーザーに通知するダイアログをポップアップ表示します。

編集モードかどうかを確認するコードは次のとおりです。

public bool IsInEditMode()
{
    const int menuItemType = 1;
    const int newMenuId = 18;

    CommandBarControl newMenu =
        Application.CommandBars["Worksheet Menu Bar"].FindControl(menuItemType, newMenuId, Type.Missing, Type.Missing, true);

    return newMenu != null && !newMenu.Enabled;
}

詳細については、Excel アプリケーションがセル編集モードかどうかを確認する方法をご覧ください。

于 2013-06-07T17:49:27.857 に答える
0

次の C# コードを使用して、セルの編集モードを終了します。できます :

private void exitEditMode()
{
    if (!isExcelInteractive())
    {
        // get the current range
        Excel.Range r = Globals.ThisAddIn.Application.ActiveCell;
        // bring Excel to the foreground, with focus
        // and issue keys to exit the cell
        xlBringToFront();
        Globals.ThisAddIn.Application.ActiveWindow.Activate();
        SendKeys.Flush();
        SendKeys.SendWait("{ENTER}");
        // now make sure the original cell is
        // selected…
        r.Select();
    }
}

private bool isExcelInteractive()
{
    try
    {
        // this line does nothing if Excel is not
        // in edit mode. However, trying to set
        // this property while Excel is in edit
        // cell mdoe will cause an exception
        Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive;
        return true; // no exception, ecel is 
        // interactive
    }
    catch
    {
        return false; // in edit mode
    }
}

private void xlBringToFront()
{
    SetForegroundWindow(Globals.ThisAddIn.Application.Hwnd);
}

[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);
于 2014-08-07T11:30:22.077 に答える