如何让用户在 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);
我需要的是让用户控制 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);