【问题标题】:Excel column autofiltering using VBScript使用 VBScript 自动筛选 Excel 列
【发布时间】:2012-12-20 03:22:05
【问题描述】:

假设我有一个如下所示的矩阵:

     EMPID    Type Of employment
   #1 10            "T"
   #2 11            "P"
   #3 20            "P"
   #4 40            "T"
   #5 50            "T"
   #6 15            "P"
   #7 19            "T"

过滤后

    EMPID    Type Of employment
  #2 11            "P"
  #3 20            "P"
  #6 15            "P"

你们能建议我如何在 vbscript 中做到这一点吗?我知道 VBA 的语法,但是在 VBScipt 中不知道如何格式化?

过滤后,如果我在第 1 列上使用 CountA,我应该将行号设为 3 还是 7?我在这里太困惑了。

更新

  objSheet2.Range("B1").AutoFilter 2, "Parent",,,False

要删除自动过滤,我使用了代码 - objSheet2.Rows("1:1").Select.AutoFilter 但收到错误 Unable to get the select property of the Range Class

已更正 objSheet2.Range("B1").AutoFilter 2, "Parent",,,True objSheet2.AutoFilterMode = False

查询:一旦过滤了行,那么当循环遍历它们时,我将如何识别过滤数据行的实际行数?

回答

    For rowIndex=2 To objExcel1.Application.WorksheetFunction.CountA(ob1.Columns(1))
    If objSheet2.Rows(rowIndex).Hidden Then
        ' do nothing - row is filtered out
    Else
        MsgBox(rowIndex)
    End If
    Next 

这样我得到了过滤行的实际行号。如果你们发布任何更好的想法,请提出建议:-)

屏幕截图

谢谢

【问题讨论】:

  • 也许这会对您有所帮助...因为您似乎有很多关于如何在vbscript 中使用 Excel 而不是 VBA 做事的问题。一旦你通过vbscript建立了Excel对象,对象模型的工作原理和VBA一样……所以,如果你掌握了VBA语法,你就可以申请写XL对象了。
  • @ScottHoltzman 请查看我的更新!为什么设置为假?应该是“开”吧?我想过滤列#1 上的值。那我该怎么做呢?因为这种语法在 Vb 脚本中不起作用。
  • 你读过关于AutoFilter 的任何信息吗?这在 vBA 中也不会做任何事情,除了在第 1 行的 A-D 列上放置过滤器。此外,“.AutoFiltermMode = False”确实会关闭您的过滤器。但有时您需要在重新设置之前删除所有现有的过滤器。
  • 要实际过滤第1列,您需要在AutoFilter方法中设置columnfilter string属性。
  • @ScottHoltzman 请看我上面的更新。现在,当我的脚本将通过其处理完成时,如何将其还原?

标签: excel vbscript vba


【解决方案1】:

我认为这会让你想要你更快一点。

objSheet2.Range("B1").AutoFilter 2, "Parent",,,True 

Dim rngFilter as Range
Set rngFilter = objXL.Application.Intersect(objSheet2.UsedRange,objSheet2.UsedRange.Offset(1),objSheet2.Columns(1)).SpecialCells(xlCellTypeVisible)

msgbox "Filtered range has " & rngFilter.Rows.Count & " rows."
'do with the range as you wish.

Dim cel as objXL.Range 'or just leave this off
For each cel in rngFilter
   msgbox cel.row
Next

objSheet2.AutoFilterMode = False

通过这种方式,您只选择过滤后的可见单元格。然后,您可以将该范围加载到一个数组中,或者在您认为合适的时候循环遍历它。

【讨论】:

  • 是的,我理解了你的代码,但只是部分理解。你能澄清一下我如何使用Range 对象获取可见行的原始行号吗?请帮我理解!
  • 但是For each cel in rngFilter msgbox cel.row Next 不能在VBScript 中工作,因为For each ...In.. next 不受VbScript 支持。所以有什么解决方法吗?
  • @TukaiRakshit -> 如果你用 XL 对象限定它会起作用,不是吗?
  • 我说的是For 循环结构,您编写VBScript 的方式从不支持这种语法。 For I=1 to N ... Next 仅支持 VBS。
  • @TukaiRakshit -> 好的,所以去掉Range 或添加objXL.Range,至于vbscript 不支持For Next 循环,我不知道你从哪里得到这些信息...见this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多