如何仅从 excel 的过滤单元格中获取选定的单元格值
How to get only selected cells value from filtered cells from excel
我有一个简单的 excel sheet:
现在,我对其进行过滤,使单元格值 > 1。现在我的数据如下所示:
现在,我select我需要的数据:
请注意,我已经select输入了所有手机号码。
现在在我的代码中,我正在尝试检索所有 selected 数据,如下所示:
Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
但是,它给了我从开始到结束的单元格。我认为 excel select 也是不可见的行。因为还检索了包含 0 的第 4 行。看下图:
所以,现在我创建了另一个范围并尝试添加所有可见的单元格值,如下所示:
Range onlyFilteredSelection = selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible);
现在,我可以看到 c# 只显示了两行。为什么它不显示最后一行,即在未过滤的行之后。看看这里的值:
更新:
发布这个问题后,我想到我可能会得到多个范围而不是 1 个范围,所以我开始探索。看看我发现了什么。我发现我完全正确。我得到多个范围。
这是我试过的代码:
Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
List<Range> onlyFilteredSelection = new List<Range>();
foreach (Range range in selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible))
{
onlyFilteredSelection.Add(range);
}
现在,我在 selection
变量中得到 4 个项目。在 onlyFilteredSelection
中有 3 个项目。
现在,我遇到了另一个麻烦:
之前,我得到的是一个范围,所以我使用下面提到的代码非常容易地将它转换为逗号分隔的字符串:
string[] AllRecepientMobileNumberValues = ((Array)(selection.Cells.Value2)).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);
但是现在,我得到了一个列表。所以,现在我的大问题是如何将列表转换为逗号分隔的字符串????????
我试了一下,也遇到了问题。但我想我可能已经找到了适合您情况的可能的解决方法。首先是我发现的一些事情。
- 我能够重现您的行为
- 所有可见单元格的选择失败,因为过滤器(似乎?)不隐藏行,而是将行高设置为 0!
- 我在 Application Member or the Range Member 上四处寻找时找不到任何其他有用的 method/property。
我创建了一个宏来记录什么VBA代码也会在您选择的复制操作上生成。奇怪的是,如您所见,代码中没有任何特殊之处。
vba宏代码
Range("A3:A5").Select ' correct as three lines are selected,
' but only two of them have a rowHeight > 0
Selection.Copy
Range("F8").Select
ActiveSheet.Paste ' and here is the magic?? why does vba only paste 2 cells??
所以我决定想出一个解决方法。为什么不模拟 VBA 看起来也做的事情。只处理那些 rowHeight > 0
.
的单元格
exampleCode.cs
private static void readFilteredCells()
{
Excel.Application xlApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
Workbook xlBook = (Excel.Workbook)xlApp.ActiveWorkbook;
Worksheet wrkSheet = xlBook.Worksheets[1];
Range selection = xlApp.Selection;
for (int rowIndex = selection.Row; rowIndex < selection.Row + selection.Rows.Count; rowIndex++)
{
if (wrkSheet.Rows[rowIndex].EntireRow.Height!=0)
{
// do something special
}
}
}
希望我的回答对你有用。如果您需要任何进一步的帮助,请告诉我。
您可以再使用一个 Select
从列表中获取值。
string[] AllRecepientMobileNumberValues = onlyFilteredSelection.Select(x => x.Cells.Value2).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);
我有一个简单的 excel sheet:
现在,我对其进行过滤,使单元格值 > 1。现在我的数据如下所示:
现在,我select我需要的数据:
请注意,我已经select输入了所有手机号码。
现在在我的代码中,我正在尝试检索所有 selected 数据,如下所示:
Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
但是,它给了我从开始到结束的单元格。我认为 excel select 也是不可见的行。因为还检索了包含 0 的第 4 行。看下图:
所以,现在我创建了另一个范围并尝试添加所有可见的单元格值,如下所示:
Range onlyFilteredSelection = selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible);
现在,我可以看到 c# 只显示了两行。为什么它不显示最后一行,即在未过滤的行之后。看看这里的值:
更新:
发布这个问题后,我想到我可能会得到多个范围而不是 1 个范围,所以我开始探索。看看我发现了什么。我发现我完全正确。我得到多个范围。
这是我试过的代码:
Range selection = (Range)Globals.ThisAddIn.Application.ActiveWindow.Selection;
List<Range> onlyFilteredSelection = new List<Range>();
foreach (Range range in selection.Cells.SpecialCells(XlCellType.xlCellTypeVisible))
{
onlyFilteredSelection.Add(range);
}
现在,我在 selection
变量中得到 4 个项目。在 onlyFilteredSelection
中有 3 个项目。
现在,我遇到了另一个麻烦:
之前,我得到的是一个范围,所以我使用下面提到的代码非常容易地将它转换为逗号分隔的字符串:
string[] AllRecepientMobileNumberValues = ((Array)(selection.Cells.Value2)).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);
但是现在,我得到了一个列表。所以,现在我的大问题是如何将列表转换为逗号分隔的字符串????????
我试了一下,也遇到了问题。但我想我可能已经找到了适合您情况的可能的解决方法。首先是我发现的一些事情。
- 我能够重现您的行为
- 所有可见单元格的选择失败,因为过滤器(似乎?)不隐藏行,而是将行高设置为 0!
- 我在 Application Member or the Range Member 上四处寻找时找不到任何其他有用的 method/property。
我创建了一个宏来记录什么VBA代码也会在您选择的复制操作上生成。奇怪的是,如您所见,代码中没有任何特殊之处。
vba宏代码
Range("A3:A5").Select ' correct as three lines are selected,
' but only two of them have a rowHeight > 0
Selection.Copy
Range("F8").Select
ActiveSheet.Paste ' and here is the magic?? why does vba only paste 2 cells??
所以我决定想出一个解决方法。为什么不模拟 VBA 看起来也做的事情。只处理那些 rowHeight > 0
.
exampleCode.cs
private static void readFilteredCells()
{
Excel.Application xlApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
Workbook xlBook = (Excel.Workbook)xlApp.ActiveWorkbook;
Worksheet wrkSheet = xlBook.Worksheets[1];
Range selection = xlApp.Selection;
for (int rowIndex = selection.Row; rowIndex < selection.Row + selection.Rows.Count; rowIndex++)
{
if (wrkSheet.Rows[rowIndex].EntireRow.Height!=0)
{
// do something special
}
}
}
希望我的回答对你有用。如果您需要任何进一步的帮助,请告诉我。
您可以再使用一个 Select
从列表中获取值。
string[] AllRecepientMobileNumberValues = onlyFilteredSelection.Select(x => x.Cells.Value2).OfType<object>().Select(o => o.ToString()).ToArray();
string RecepientMobileNumberValue = AllRecepientMobileNumberValues.Aggregate((a, x) => a + ", " + x);