Delphi到Excel-使用自动筛选删除未知数据元素
德尔福东京,Excel 2016。通过使用Delphi程序,我可以控制Excel。我正在尝试删除一张工作表中的所有行,但在某列中具有某个值的行除外。。。例如,我有一个企业列表,其中第3列是企业所在城市。我需要删除除where City in('Chicago','Denver','Columbus')之外的所有行。我已经建立并查看了Excel宏,以了解Excel是如何做到这一点的。。。。具体来说,它将启用自动筛选,选择除这些城市以外的所有值,然后删除。我的问题是。。。如何知道此列中的值 下面是VBA宏代码Delphi到Excel-使用自动筛选删除未知数据元素,excel,delphi,com,Excel,Delphi,Com,德尔福东京,Excel 2016。通过使用Delphi程序,我可以控制Excel。我正在尝试删除一张工作表中的所有行,但在某列中具有某个值的行除外。。。例如,我有一个企业列表,其中第3列是企业所在城市。我需要删除除where City in('Chicago','Denver','Columbus')之外的所有行。我已经建立并查看了Excel宏,以了解Excel是如何做到这一点的。。。。具体来说,它将启用自动筛选,选择除这些城市以外的所有值,然后删除。我的问题是。。。如何知道此列中的值 下面是V
Selection.AutoFilter
ActiveSheet.Range("$A$1:$AF$66").AutoFilter Field:=3, Criteria1:=Array( _
"ADDISON", "CARROLLTON", "DALLAS", "DANBURY", "EDEN PRAIRIE", "EL PASO", "ELDRIDGE", _
"FARMERS BRANCH", "Franklin", "GEISMAR", "GRAPEVINE", "HOUSTON", "KROTZ SPRINGS", _
"MASON CITY", "NEW BRAUNFELS", "PALO ALTO", "PLANO", "POWAY", "PURCHASE", _
"RICHARDSON", "SAINT PAUL", "SAN ANTONIO", "SOUTHLAKE", "SUNNYVALE", "THE WOODLANDS" _
, "ULYSSES", "WEST LAKE HLS"), Operator:=xlFilterValues
Rows("2:62").Select
Selection.Delete Shift:=xlUp
ActiveSheet.ShowAllData
我需要做的是构建一个包含所有城市的数组,除了我想要删除的城市。自动筛选器知道所有唯一值是什么。。。除了遍历所有行之外,如何读取自动筛选(也称为唯一值列表)
自动筛选器知道所有唯一值是什么。。。如何读取自动筛选
我认为您无法从自动筛选中读取唯一值。如果查看已定义的属性,则唯一值不在其中,而只是过滤器操作的单元格范围
可能最接近的方法是确定屏幕上显示的是筛选范围内的哪些行,然后删除不显示的行。显示如何确定隐藏哪些行。但对我来说,这似乎是“在房子周围”,无论如何,这不是你特别要求的
所以,你必须,以某种方式,自己迭代这个范围
我需要做的是构建一个包含所有城市的数组,除了我想要删除的城市
如果忽略Excel自动筛选,这实际上在Delphi代码中更容易做到,因为使用Delphi代码在Excel范围内查找唯一的单元格值几乎是微不足道的
下面,我将展示如何在中实现与Coderre公式的Delphi等价。由你决定你喜欢哪个
启动一个新的Delphi VCL项目,并在其上放置一个TCheckListBox。然后编译
执行下面的代码。该代码使用A、B和C等值填充Excel范围
然后提取唯一值并用它们填充复选框。之后,
您可以使用各个复选框的状态在中处理Excel范围
随便你
vExcel,
vWorkBook,
vSheet,
vRange : OleVariant;
procedure GetUniqueValues(vRange : OleVariant; Strings : TStrings);
// scans the Excel range represented by vRange and populates the Strings
// variable with the unique values for in the range's Cells
var
S : String;
Row,
Col : Integer;
begin
Strings.BeginUpdate;
Strings.Clear;
try
for Row := 2 to vRange.Rows.Count do begin
for Col := 1 to vRange.Columns.Count do begin
S := vRange.Cells[Row, Col].Value;
if Strings.IndexOf(S) < 0 then
Strings.Add(S);
end;
end;
finally
Strings.EndUpdate;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
begin
vExcel := CreateOleObject('Excel.Application');
vExcel.Visible := True;
// Create a new workbox and populate two columns in it with random
// character data
vWorkBook := vExcel.WorkBooks.Add;
vSheet := vWorkBook.ActiveSheet;
vSheet.Range['A1'].Value := 'City';
for i := 1 to 20 do begin
vSheet.Range['A' + IntToStr(1 + i)].Value := Chr(Random(3) + Ord('A'));
vSheet.Range['B' + IntToStr(1 + i)].Value := Chr(Random(4) + Ord('A'));
end;
// Extract the range A2..B21
vRange := vSheet.Range['A2', 'B21'];
// Set CheckListBox1 to sort its contents
CheckListBox1.Sorted := True;
// Now get the unique values
GetUniqueValues(vRange, CheckListBox1.Items);
// Do whatever you like with tthe results
for i := 0 to CheckListBox1.Items.Count - 1 do begin
if not (CheckListBox1.State[i] = cbChecked) then
;
end;
end;
vExcel,
工作手册,
vSheet,
vRange:油变异体;
过程GetUniqueValues(vRange:OleVariant;Strings:TStrings);
//扫描由vRange表示的Excel范围并填充字符串
//变量,该变量在范围的单元格中具有唯一的值
变量
S:字符串;
一行
Col:整数;
开始
Strings.BeginUpdate;
字符串。清晰;
尝试
对于行:=2到vRange.Rows.Count不开始
对于列:=1到vRange.Columns.Count不开始
S:=vRange.Cells[Row,Col].Value;
如果Strings.IndexOf(S)小于0,则
字符串。添加(S);
结束;
结束;
最后
Strings.EndUpdate;
结束;
结束;
过程TForm1.FormCreate(发送方:TObject);
变量
i:整数;
开始
vExcel:=CreateOleObject('Excel.Application');
vExcel.Visible:=真;
//创建一个新的工作框,并用随机变量填充其中的两列
//字符数据
vWorkBook:=vExcel.WorkBooks.Add;
vSheet:=vWorkBook.ActiveSheet;
vSheet.Range['A1']。值:='City';
对于i:=1到20,开始
vSheet.范围['A'+IntToStr(1+i)]。值:=Chr(随机(3)+Ord('A');
vSheet.范围['B'+IntToStr(1+i)]。值:=Chr(随机(4)+Ord('A');
结束;
//提取范围A2..B21
vRange:=vSheet.Range['A2','B21'];
//设置CheckListBox1以对其内容进行排序
CheckListBox1.Sorted:=True;
//现在获取唯一值
GetUniqueValues(vRange,CheckListBox1.Items);
//对结果做任何你喜欢的事
对于i:=0的CheckListBox1.Items.Count-1,请执行开始操作
如果不是(CheckListBox1.State[i]=cbChecked),则
;
结束;
结束;
顺便说一句,如果您查看Excel的自动化对象的导入单元之一,例如Excel2000.Pas,您将看到其中定义了IAutoFilter的接口,因此如果您真的想从Delphi代码访问它,您可以想象得到
顺便说一句,如果我自己这样做的话,我可能会通过使用ADO对象(如TAdoQuery)访问电子表格来在SQL中进行数据操作,因为像“删除某些列值不在值列表中的所有行”这样的操作需要这样的处理。正如您所知道的,唯一值无法从
自动筛选
中获得,模拟您试图实现的手动筛选设置的功能会变得相当复杂
我的建议是使用Range.AdvancedFilter
而不是Range.AutoFilter
。它有一种更简单的方法来定义过滤条件
您将从Delphi调用的宏如下所示:
Public Sub UseAdvancedFilter()
Dim MyRange As Range
Set MyRange = Range("A1").CurrentRegion
Range(MyRange.Address).AdvancedFilter _
Action:=xlFilterInPlace, _
CriteriaRange:=Range("A28:C29")
Rows("2:" & MyRange.Rows.Count).Select
Selection.Delete Shift:=xlUp
ActiveSheet.ShowAllData
End Sub
这与MyRange
中的数据和CriteriaRange
中的标准一致
(我使用分割视图来减小图像大小。4到19之间的所有行都有数据)
您还有更多的列,但我们可以演示文件管理器如何处理这三个列。数据范围(MyRange
)必须包括数据的标题。城市字段的标题City
与标准范围的标题匹配
CriteriaRange
是一个有趣的标准。我们有三个标题单元格,都带有City
字段名。然后我们有三个标准:丹佛
,芝加哥
和达拉斯
。同一行上的条件在它们之间形成逻辑的和函数,
当然意味着不等于。因此,选择标准变成select记录,其中城市不是丹佛和C
Excel.Run('UseAdvancedFilter');
City
Denver
Chicago
Dallas
`select records where City is Denver OR City is Chicago OR City is Dallas`.
'Selection.Delete Shift:=xlUp
Selection.Copy Destination:=Range("A40")