Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi到Excel-使用自动筛选删除未知数据元素_Excel_Delphi_Com - Fatal编程技术网

Delphi到Excel-使用自动筛选删除未知数据元素

Delphi到Excel-使用自动筛选删除未知数据元素,excel,delphi,com,Excel,Delphi,Com,德尔福东京,Excel 2016。通过使用Delphi程序,我可以控制Excel。我正在尝试删除一张工作表中的所有行,但在某列中具有某个值的行除外。。。例如,我有一个企业列表,其中第3列是企业所在城市。我需要删除除where City in('Chicago','Denver','Columbus')之外的所有行。我已经建立并查看了Excel宏,以了解Excel是如何做到这一点的。。。。具体来说,它将启用自动筛选,选择除这些城市以外的所有值,然后删除。我的问题是。。。如何知道此列中的值 下面是V

德尔福东京,Excel 2016。通过使用Delphi程序,我可以控制Excel。我正在尝试删除一张工作表中的所有行,但在某列中具有某个值的行除外。。。例如,我有一个企业列表,其中第3列是企业所在城市。我需要删除除where City in('Chicago','Denver','Columbus')之外的所有行。我已经建立并查看了Excel宏,以了解Excel是如何做到这一点的。。。。具体来说,它将启用自动筛选,选择除这些城市以外的所有值,然后删除。我的问题是。。。如何知道此列中的值

下面是VBA宏代码

 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")