2015-06-23 3 views
0

Я пытаюсь автофильтировать в Excel, используя приведенный ниже код VBScript. Этот скрипт вызывался несколько раз из программы Perl.Autofiltering Excel с несколькими условиями фильтра

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 несколько раз, и вышеупомянутый скрипт фильтрует одно значение за раз и удаляет. Программа работает нормально, но работает медленно.

Ниже приведена часть Perl, которая вызывает VBScript.

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

ответ

0

Если вы ставите кавычки вокруг значений, VBScript будет рассматривать его как один аргумент.

> cscript script.vbs arg1 "multiple values for arg 2" 

В сценарии:

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 

Excel ожидает:

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

Если вы хотите получить список критериев для фильтрации, вы будете использовать xlFilterValues для <Operator> аргумента. <Criteria> будет массивом строковых значений, которые мы создали выше.

Const xlFilterVaues = 7 

objExcel.ActiveSheet.Range("G1").AutoFilter WScript.Arguments.Item(0), a, xlFilterValues 

Так, просто попробуйте добавить Split() вокруг WScript.Arguments(1) в существующем коде, и передать xlFilterValues для третьих паров.

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, Оператор, Criteria2, VisibleDropDown)

выражение Выражение, которое возвращает Range объект.

Вы Critera1 и Criteria2 и Operator для объединения двух.Вызов метода AutoFilter с другим набором критериев заменяет существующие критерии.

+0

Благодарю вас, приведенный выше код также фильтрует одно значение за раз, я должен отфильтровать все параметры в текстовом файле за один раз ... 'ws.Range (" G1 "). AutoFilter WScript.Arguments (0) , f.ReadLine', в этом случае первый фильтр удаляется после первой итерации. поэтому, наконец, значение в конце текстового файла будет последним фильтром. – Programmer

+0

@Programmer Ваш существующий код делает то же самое, поэтому я предположил, что это то, что вы хотели. Если вы хотите применить все критерии к одному столбцу одновременно: это невозможно. Если вы более подробно рассмотрите метод ['AutoFilter'] (https://msdn.microsoft.com/en-us/library/office/ff193884.aspx) или графический интерфейс AutoFilter, вы заметите, что можете иметь большинство 2 фильтра для одной колонки. –

Смежные вопросы