编写用于Excel的Apple Script,删除单元格中具有特定值的行

时间:2012-10-11 18:25:49

标签: excel applescript

我正在尝试使用特定值删除excel中的单元格。我已经走得很远,并写了我自己的脚本借用了一些来自互联网的摘录。

    set theOutputPath to (path to desktop folder as string) & "FilteredNY.csv"
    set fstring to "(Not NY State)"

    tell application "Microsoft Excel"
     activate
     open workbook workbook yatta yatta
activate object worksheet 1
-->activate range current region
set LastRow to ((count of rows of used range of active sheet) + 1)
set lastCol to count of columns of used range of active sheet
set lastCol to (get address of column lastCol without column absolute)
set lastCol to (characters 1 thru ((length of lastCol) div 2) of lastCol as string)
set fullRange to range ("2:" & LastRow)
repeat with i from 2 to LastRow
    --code in repeat 
    if value of cell ("J" & i) is equal to fstring then
        delete range row i
    end if
end repeat
end tell

大多数代码都无关紧要,包括fullRange变量和顶部设置的路径变量。问题是删除代码甚至没有在第2行之后继续进行,并且它在此之上运行得非常慢,所以它实际上有很多问题。我猜我的循环一定有问题。如果有人能让我走上正确的轨道,那就太棒了。

我最近在经过大量的实验/挖掘后发现了这个问题。当我删除范围时,行实际上移动了前导excel以删除错误的范围。我目前正在开发一种解决方法,包括清除我不想要的行并隐藏所有空白单元格,然后将所有可见单元格复制到新工作表。

好的另一个更新,即上次更新。我终于完成了脚本,允许它做它需要做的事情。我只是通过在数组中添加要删除的所有行而不是将所有要删除的行转换为数组,而不是将所有行都删除,而不是将数组转换为一系列范围,删除范围可以在一次删除所有行时进行清除,隐藏和复制。这是一种更快速,更简单的解决方案。

这是伟大的苹果剧本:

 set theOutputPath to (path to desktop folder as string) & "FilteredNY.csv"
 set fstring to "(Not NY State)"
 set del_list to {}

 tell application "Microsoft Excel"
activate
open workbook workbook file name yatta yatta
activate object worksheet 1
set LastRow to ((count of rows of used range of active sheet))

repeat with i from 2 to LastRow
    --code in repeat 
    if value of cell ("J" & i) is equal to fstring then
        set di to i as string
        set end of del_list to di & ":" & di

    end if
end repeat
set AppleScript's text item delimiters to ","
set ToDelete to del_list as string
set AppleScript's text item delimiters to {""}
delete range range ToDelete
  end tell

我希望这能帮到那里的人!我养成了解决自己问题的坏习惯。 :)。

1 个答案:

答案 0 :(得分:2)

使用带有AppleScript的Excel时,请尝试避免循环并使用Excel强度在很短的时间内处理大量的行/列。

对于您的情况,我了解您要删除列“J”的值为“(非纽约州)”的所有行 您不必触摸必须有列标题的第一行。

所以这是代码:

tell application "Microsoft Excel"
    set autofilter mode of active sheet to false
    set lastRow to first row index of last row of used range

    autofilter range row ("1:" & lastRow) field 10 criteria1 "(Not NY State)"
    select row ("2:" & lastRow)
    delete selection -- if you want to delete 
    #clear contents selection -- if you only wish to clear the data
end tell

这不是更快吗?

加速代码加速的技巧:

tell application "Microsoft Excel" to set screen updating to false --vvv---
-- insert here operations that would change Excel display --
tell application "Microsoft Excel" to set screen updating to true --^^^---

您也可以使用autofilter + sort

但真正重要的是在Excel中巧妙地使用公式来快速完成任务。 (设置一个单元格的公式,然后填充到最后一行)