プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。

罫線を1行づつ引く場合、とても時間がかかります。
なにか良い方法はないでしょうか。

ScreenUpdatingを使ってはいるのですが、
1行づつの処理が見えてしまいます。
(selectしている時点で、ダメなのでしょうか)

何か良い方法をご存知でしたら、ご教授いただきたく、
よろしくお願い致します。

下記に私のつたないソースを記入します。


Function kei07_縦中央線削除 _
(file_name, sh_name, f_gyo, e_gyo, f_retu, e_retu)

Application.ScreenUpdating = False
back_file_name = ActiveWorkbook.Name
back_sh_name = ActiveSheet.Name
Workbooks(file_name).Activate
Worksheets(sh_name).Select
Range(Cells(f_gyo, f_retu), Cells(e_gyo, e_retu)).Select
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Cells(e_gyo + 1, f_retu).Select

Workbooks(back_file_name).Activate
Worksheets(back_sh_name).Select
Application.ScreenUpdating = True

End Function

A 回答 (6件)

No.2です



この処理としてはこれ以上縮められそうにありません
「範囲を指定して縦中央線の削除を行っているこの範囲は」ですね
問題はここ以外、ここを蹴りだしている場所だと思いますが…

どのように引いているかも判らない現状ですし、改善案までたどり着けそうにありません
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

汎用的なfunctionにしたいため、
このような処理になりました。

ありがとうございました。

お礼日時:2011/05/25 17:51

>罫線を1行づつ引く場合、とても時間がかかります


Range(Cells(f_gyo, f_retu), Cells(e_gyo, e_retu)).Select
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
は、書いた罫線を消しているのでは。
又罫線を1行ずつ引く(消す)イメージの処理ではない。コードは、セル範囲を指定して抹消しているでしょう。
10000行x10列ぐらいでマス目罫線を引いて、下記を実行すると、一瞬で終わりましたが。
Application.ScreenUpdating = Falseも入れていません。
Sub test01()
Range(Cells(2, 2), Cells(10000, 10)).Borders(xlInsideHorizontal).LineStyle = xlNone
End Sub
またなぜ一旦書いた、横罫線を抹消する作業をするのか判らない。
何か外の原因で遅くなっているのでは。それを質問だけからは難しいと思うが。
>Function名で縦中央線削除 とあるが
>(xlInsideHorizontalだと横罫線が削除されるようだが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

ご指摘どおり、function名も変ですし、
書いている内容とPGも違いますね。
すみません。

同じような1行1行条件によって線をつける処理を
しているところもあり、また、縦線を消す処理もあったので、
色々なことがごちゃ混ぜになってしまいました。
すみません。

ご回答ありがとうございました。

お礼日時:2011/05/25 17:54

答えを貰うまでは「そんなのできない」と逃げる割に何をしているのかの情報は出さない,後出しでダメだしだけが得意な解決の難しいご相談です。



>1行づつの処理が見えてしまいます。

というお話の様子から,遅さの原因(ボトルネック)はご質問で掲示されたFunctionとは違う部分,この関数を呼び出している元のループ部分にある様子に思われます。掲示されたマクロも,「そこまで」処理を重くする要因は見あたりません。(あちこちselectしたりactivateしたりとかはあるにしても,です)
また,処理の対象となっているシートに何か別のイベントプロシジャを仕込んでいるなどで,そちらが割り込んで遅くなっているような状況も考えられます。

とりあえず最初の手として,掲示されたFunctionの中で行っている全てのアクションをコメントアウトして「全く何もしない」Functionにしてしまい,呼び出し元を実行してこの関数によってどれだけ遅くなっている(何もしないとどれだけ早くなる)か,まず確認してみてはいかがでしょう。


参考に:
条件付き書式でも,単に使い方に慣れていないだけで問題なく作成できそうに思われますが,まぁマクロでゴリゴリやりたいご希望なら勿論それはあなたのやりたいようになさって頂いて構いません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

確認等行います。

条件付書式についてのよく知らないのに、
マクロでと言ってしまったこと、すみませんでした。

今から、条件付書式で行えるか、
やってみようと思います。

ありがとうございました。

お礼日時:2011/05/25 17:57

遅いのは「マクロ自体を繰り返す」事に問題があるんであって、この処理そのものには「これ以上大きく処理速度を上げる要素」は無いです。



Range(Cells(f_gyo, f_retu), Cells(e_gyo, e_retu)).Select
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Cells(e_gyo + 1, f_retu).Select

要は、この部分を例えばFOR-NEXTでくくって

FOR i = 1 TO 10
Range(Cells(i, f_retu), Cells(i, e_retu)).Select
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
NEXT

と言う風にループで回すか、

Range(Cells(f_gyo, f_retu), Cells(f_gyo + 10, e_retu)).Select
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

と言う風に一気に全行を選択して罫線を引くかすればいい、という話です。


すいませんが、コードの確認テストはしていません。動かない時はごめんなさい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

やはり、処理速度を速めるのは難しそうです。

前の行と比較したりして、線をつけたり
消したりしなければならないため、
一気に選択をしたり、同じLOOPを回したりは
不可能なんです。

ご回答ありがとうございました。

お礼日時:2011/05/25 12:31

selectせずに試してみるのが一番最初かと思います


Worksheets(sh_name).Range(Cells(f_gyo,f_retu),Cells(e_gyo,e_retu)).Borders(xlInsideHorizontal).LineStyle=xlNone
のように繋げることも可能だと思います

あとはそのシートを不可視にする事も出来ます
worksheet(sh_name).visible=false
こうすれば処理が見える事はありません
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

早速やってみましたが、
処理時間は同じでした。

見え方も同じでした。

visible=falseにしても不安な時間を過ごすように
なるため、どうしようか悩み中です。

お礼日時:2011/05/25 11:33

マクロを使わず,条件付き書式で作成してください。


「中央線」と無理にこだわらず,各列ごと右(または左)の縦線を無しにするか,若しくは最初から表の全域の縦線を無しにしておいて「右(もしくは左)縦線のあるべき列」だけ条件付き書式でその縦線を表示させるように仕込んだ方が多分簡単です。

この回答への補足

ご回答ありがとうございます。

以下の観点などから、マクロで行わなければいけません。
(1)行数・列が確定していない
(2)条件が複雑
(3)マクロの一部で使われるfunction

説明不足ですみません。
よろしくお願い致します。

補足日時:2011/05/25 10:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A