如何让用户在 c# vsto excel 加载项中访问 select 单元格(范围输入)?

How to get user to select cells(Range input) in c# vsto excel add-in?

我需要的是让用户控制 select 一些将在程序中使用的单元格。在许多 excel 函数中很容易看到该界面,例如在向图形中插入数据时。

Pre-selected 范围可以作为 Globals.ThisAddIn.Application.ActiveWindow.RangeSelection 轻松访问,但这不是我正在研究的,因为我需要多个这样的范围。 我正在 visual-studio 上尝试这个,有 Interaction.InputBox 函数来接收字符串,据说相当于 vba 的 Inputbox,但是 vba 的输入框有输入数据类型的参数,c# inputbox 没有。

VBA 相当于

Dim rngX as Range
Set rngX = Application.InputBox("Select a cell or a range", "Input Cells", Type:=8)

Type:=8 将使输入框接受范围输入。 但我需要在 c# 中完成(使用 visual studio)并且 c# 的 Inputbox 方法没有像 VBA.

这样的输入类型

我尝试了很多但找不到我要找的东西,但这个解决方法目前有效。 我使表单成为无模式的,然后将我需要对范围内的范围执行的任何操作放在该表单中,因此我实际上无法从表单发送回范围,但我至少可以执行任务。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using Microsoft.VisualBasic;

namespace ExcelAddInZeroSofts
{
    public partial class InterpolationForm : Form
    {
        Worksheet ws;
        public InterpolationForm(Range rng)
        {
            InitializeComponent();
            tbRange.Text = rng.Address;
        }
        private void SelectRangeForm_Load(object sender, EventArgs e)
        {
            ws = Globals.ThisAddIn.Application.ActiveSheet;
            ws.SelectionChange += ws_SelectionChange;
            // This one will add the event handling to worksheet.
        }
        void ws_SelectionChange(Range Target)
        {
            if (this.ActiveControl.Name.First() == 't')
            {
                this.ActiveControl.Text = Target.Address;
                // This one will add the address to the userform (I have 3 fields).
            }
        }

        private void SelectRangeForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            ws.SelectionChange -= ws_SelectionChange;
        }

        private void bSubmit_Click(object sender, EventArgs e)
        {
            // My main Logic Goes here
            this.Close();
        }

        private void bCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

我仍然希望有人能提供方法让它像原来的 VBA 输入框一样工作。

Range myRange;

myRange = Globals.ThisAddIn.Application.InputBox("Please select your range?", "Range Selector", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 8);