我正在尝试使用以下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);
}
答案 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 )
表达式返回范围对象的表达式。
您有Critera1
和Criteria2
以及Operator
来组合这两者。使用另一组标准调用AutoFilter
方法将替换现有标准。