使用多个过滤条件自动过滤Excel

时间:2015-06-23 15:40:35

标签: perl vbscript argument-passing

我正在尝试使用以下VBScript代码在Excel中自动过滤。这个脚本从Perl程序中多次调用。

Dim objExcel : Set objExcel = GetObject(,"Excel.Application") 
objExcel.Visible = True
objExcel.Selection.AutoFilter
objExcel.ActiveSheet.Range("G1").AutoFilter WScript.Arguments.Item(0), _
    WScript.Arguments.Item (1)

现在我想知道:有没有办法可以为WScript.Arguments.Item (1)传递数组,以便一次性选择所有条件?任务是删除过滤的值。我通过Perl多次调用此脚本,上面的脚本一次过滤一个值并删除。该程序运行正常,但速度很慢。

以下是调用VBScript的Perl的一部分。

while(<FILE>){
    chomp;
    system("CSCRIPT "."\"$currentWorkingDirectory\"".'aboveVBS.vbs 9 '."\"$_\"");
    sleep(2);
}

2 个答案:

答案 0 :(得分:0)

如果在值周围加上引号,VBScript会将其视为单个参数。

WScript.Echo WScript.Arguments.Count    ' ==> 2

a = Split(WScript.Arguments(1))
WScript.Echo a(0)                        ' ==> multiple
WScript.Echo a(1)                        ' ==> values
WScript.Echo a(2)                        ' ==> for
WScript.Echo a(3)                        ' ==> arg
WScript.Echo a(4)                        ' ==> 2

在剧本中:

Range.AutoFilter <Field>, <Criteria>, <Operator>

Excel期望:

xlFilterValues

如果您想要过滤条件列表,则可以使用<Operator>作为<Criteria>参数。 Const xlFilterVaues = 7 objExcel.ActiveSheet.Range("G1").AutoFilter WScript.Arguments.Item(0), a, xlFilterValues 将是我们在上面创建的字符串值数组。

Split()

因此,只需尝试在现有代码中的WScript.Arguments(1)附近添加xlFilterValues,然后将 InputStream is = new ByteArrayInputStream(myString.getBytes()); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(is); doc.getDocumentElement().normalize(); NodeList nList = doc.getElementsByTagName("LMN"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); Map<String, String> map = new HashMap<String, String>(); convertNodeToMap(nNode, map); } 传递给第三个参数。

答案 1 :(得分:0)

如果只有你的第二个参数发生了变化,你可以将数据文件的全部内容传递给VBScript:

local $/;
my $args = <FILE>;
$args =~ s/^\s+|\s+$//g;
$args =~ s/\r?\n/" "/g;

system("cscript \"$currentWorkingDirectory\\your.vbs\" 9 \"$args\"");

并将VBScript中的处理更改为:

Set xl = CreateObject("Excel.Application") 
xl.Visible = True

Set wb = xl.Workbook.Open("C:\path\to\your.xlsx")
Set ws = wb.Sheets(1)
...
xl.Selection.AutoFilter

For i = 1 To WScript.Arguments.Count - 1
  ws.Range("G1").AutoFilter WScript.Arguments(0), WScript.Arguments(i)
  ...
Next

或者您只需使用字段和数据文件的路径调用VBScript:

system("cscript \"$currentWorkingDirectory\\your.vbs\" 9 \"$filepath\"");

并在VBScript中执行所有处理:

Set xl = CreateObject("Excel.Application") 
xl.Visible = True

Set wb = xl.Workbook.Open("C:\path\to\your.xlsx")
Set ws = wb.Sheets(1)
...
xl.Selection.AutoFilter

Set fso = CreateObject("Scripting.FileSystemObject")
Set f   = fso.OpenTextFile(WScript.Arguments(1))
Do Until f.AtEndOfStream
  ws.Range("G1").AutoFilter WScript.Arguments(0), f.ReadLine
  ...
Next
f.Close

无法同时对列应用2个以上的AutoFilter条件。检查documentation中的AutoFilter方法的签名:

  

表达。自动筛选 字段,条件1,运算符,条件2,VisibleDropDown

     

表达式返回范围对象的表达式。

您有Critera1Criteria2以及Operator来组合这两者。使用另一组标准调用AutoFilter方法将替换现有标准。