1

特定の値で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 変数と先頭に設定された path 変数を含め、ほとんどのコードはそれほど重要ではありません。問題は、削除コードが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

これが誰かを助けてくれることを願っています!私は自分の質問を自分で解決する悪い癖があります。:)。

4

1 に答える 1

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 で数式を微妙に使用して、作業を非常に迅速に完了できることです。(1 つのセルの数式を設定し、最後の行まで入力します)

于 2013-04-19T12:31:24.843 に答える