C# 如何用C语言从Excel中的非相邻单元格中读取数据#

C# 如何用C语言从Excel中的非相邻单元格中读取数据#,c#,vsto,excel-2007,add-in,C#,Vsto,Excel 2007,Add In,我有一个excel表格,其中选择了多个彼此不相邻的单元格。当用户单击按钮时,我们需要读取所有单元格数据,处理它并将其写入其他单元格 如果细胞彼此相邻,我就能够得到范围并能够执行操作。但是如果细胞彼此不相邻,我就无法得到范围。 Selection.Range始终提供我们选择的最后一个单元格的地址 但是我们需要得到所有单元格的地址,这是我无法做到的 请任何人给我建议一种处理这种情况的方法 示例代码: Range objRange = (Range) Globals.ThisAddIn.Applica

我有一个excel表格,其中选择了多个彼此不相邻的单元格。当用户单击按钮时,我们需要读取所有单元格数据,处理它并将其写入其他单元格

如果细胞彼此相邻,我就能够得到范围并能够执行操作。但是如果细胞彼此不相邻,我就无法得到范围。 Selection.Range始终提供我们选择的最后一个单元格的地址

但是我们需要得到所有单元格的地址,这是我无法做到的

请任何人给我建议一种处理这种情况的方法

示例代码:

Range objRange = (Range) Globals.ThisAddIn.Application.Selection;
                int nColCount = objRange.Columns.Count;
                int nRowCount = objRange.Rows.Count;
维奈

根据你的建议,我试过这个代码

 Range objRange = (Range) Globals.ThisAddIn.Application.Selection;

        foreach (Range cell in objRange)
        {
            MessageBox.Show("" + cell.Value2);
        }

但它不起作用。它总是给出最后一个选定的单元格。我选择了A1、A4、A13、A16单元。但此代码仅返回A16单元格值。

范围继承自IEnumerable。因此,您可以使用for-each迭代器通过所有单元格进行枚举。 请参见下面的等效VBA代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim result As String
  result = ""
  Dim c As Range
  For Each c In Me.Application.Selection
    result = result & ", " & c.Text
  Next c
  Me.Cells.Item(1, 1).Value = result 
End Sub
您始终可以使用Range.Row、Range.Column获取单元格地址

如评论中所述,使用foreach synatx:

foreach(Range cell in objRange)
{
   // now access cell's properties - c.Value will give value
}

经过多次尝试,我得到了答案

这是工作代码

Areas objAreas = (Areas)objRange.Areas;
foreach (Range area in objAreas)
{
   string CellAddress = (GetExcelColumnName(area.Column) + "" + area.Row);
   MessageBox.Show(CellAddress);
}

GetExcelColumnName是您编写的自定义函数,用于将列编号转换为列代码(如a、b、…aa、ab…等)

基本上,这将从一个单元格或连续单元格列表中获取数据。但我的问题不同。这更像是,例如,如果用户选择了几个单元格A12、D34、C1。我们如何能够自动从这些单元格中获取数据,而不将这些单元格地址硬编码到代码中。在上面的示例中,没有硬编码来读取选择。选择是一个范围对象,您可以通过它进行枚举。不管单元格是否连续,每个单元格都将被枚举。尝试在excel工作表中粘贴上面的VBA代码,选定的单元格内容将显示在A1单元格中。我已经在c#中尝试了相同的代码。我也用同样的东西应用。选择。但它只从最后一个单元格获取数据。剩下的单元格没有显示数据。你能编辑你的问题来粘贴访问选择的C代码吗?我已经添加了示例代码。我正在使用该代码获取选定的单元格。然后我使用迭代器逐单元读取。如果单元格是连续的,那么它可以正常工作,但是如果单元格不是连续的,那么它就不能工作。它总是只返回一个单元格。