トップページtech
1001コメント373KB

Excel VBA質問スレ Part8

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/08/25(月) 23:16:33
ExcelのVBAに関する質問スレです

前スレ http://pc11.2ch.net/test/read.cgi/tech/1212587819/

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
   
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0748デフォルトの名無しさん2008/11/06(木) 02:13:25
>>747
set mySouce = の時は、データの入ってるワークシートが
アクティブになっててその書き方で行けるんだけど、
set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、
range("B21") がどこにあるのかわからんってさ
0749デフォルトの名無しさん2008/11/06(木) 02:51:43
>>748
なるほど!!明快な説明ありがとうございます。
つまり、set mySouce2 = の前に、
データが格納されているシートをセレクトすればよかったのですね。

対処だけでなく原因が分かりためになりました!
0750デフォルトの名無しさん2008/11/06(木) 10:11:14
>>749
そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、
最初にまとめて下準備しちゃえば効率がいいよね
selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい
0751デフォルトの名無しさん2008/11/06(木) 18:01:30
ある値xをアクティブセルの持つ書式に変換した値を取得したいのですが
Dim rng as Range
Set rng = ActiveCell
rng.Value = x
この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。
もう少しましな方法を教えて頂けるとありがたいです。
0752デフォルトの名無しさん2008/11/06(木) 18:14:58
>>751
Format(x, ActiveCell.NumberFormatLocal)
セルの書式によってはバグるかも試練がw
0753デフォルトの名無しさん2008/11/06(木) 18:35:33
そうなんです
[G/標準]とかでエラーになる為、セル代入を考えたのですが...
0754デフォルトの名無しさん2008/11/06(木) 18:50:58
「セルの書式に合わせた文字列に変換」でいいのね
? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal))
とかは?
0755デフォルトの名無しさん2008/11/06(木) 19:12:31
TEXT関数か・・・ならば
worksheetfunction.text(x, activecell.numberformat)
これでどうかな?
0756デフォルトの名無しさん2008/11/06(木) 19:20:37
>>755
書式に和暦や曜日が指定されてるとヘンになるよ
そういうの無視でいいならいいんだけど
0757デフォルトの名無しさん2008/11/06(木) 19:35:05
しつこいようだけど、頼む。
セルについて指定無しの状態にするすることは可能ですか?
set rg = nothing とか試してみたけどだめだったorz
0758デフォルトの名無しさん2008/11/06(木) 19:44:51
>>757
ほんとしつこいなぁ、、、って誰?w
というか、質問の意味がわからない

>>756
自己レス
曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる
0759デフォルトの名無しさん2008/11/06(木) 19:50:15
>>757
以前やってみようとした事があったけど見つからなかった
本当に出来るのかどうかも不明

>>758
お前頭悪そうだな
0760デフォルトの名無しさん2008/11/06(木) 19:56:56
>>759
質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ
0761デフォルトの名無しさん2008/11/06(木) 20:01:11
質問スレで分かってて答えないのは只の無能だと思われてもしょうがない。
0762デフォルトの名無しさん2008/11/06(木) 20:10:08
>>761
そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ
質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ
0763デフォルトの名無しさん2008/11/06(木) 20:46:09
喧嘩は他所でスレ立ててやれよ
目障り
0764デフォルトの名無しさん2008/11/06(木) 21:18:48
自己紹介乙
0765デフォルトの名無しさん2008/11/06(木) 21:53:02
>>763
おまえは引っ込んでろ!
このカス。
0766デフォルトの名無しさん2008/11/07(金) 04:10:27
俺も >>757 の質問がよくわからないし
つか、前に質問したなら名前欄にレス番とか入れてくれ
07675692008/11/07(金) 06:17:38
フォルダの中を検索して特定のExcelファイル(○○.xls)を見つけたいのだが
フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・)

Aフォルダ
Bフォルダ
○○.xls
というパターンもあれば
Aフォルダ/Cフォルダ/○○.xls
Bフォルダ/○○.xls
というパターンもあり、○○.xlsが無いことも2個あることも5個あることもある。ただ幸い○○.xlsの名前は固定です。
このフォルダ内から存在する全ての○○.xlsを開いて中身から数字を
取り出す機能を持ったVBAを作ろうとしています。

フォルダのパスはFOを使って配列に入れてそれを
全てのフォルダパターンを使って○○.xlsを探そうとしています。
そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?

階層固定のフォルダ抽出、Excelファイルは問題ないのですが
階層実固定のフォルダ抽出で詰まっています。

例えば手抜きですが↓みたいな流れでうまく出来そうですかね?
Private Sub AAA()
今のパスを配列に格納
  if フォルダが有る時 then
call AAA
end if
End AAA
0768デフォルトの名無しさん2008/11/07(金) 06:18:18
すんません。上のやつ>>569さんじゃないです・・・。名前に入っちゃいました。
0769デフォルトの名無しさん2008/11/07(金) 08:44:46
>>767
>そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか?
試した?
試してもいないのに質問しに来てない?
07707512008/11/07(金) 09:34:48
>>754
>>755
>>758
ありがとうございます.orz
754さんの方法でグーですね。
07717512008/11/07(金) 09:47:36
ついでにもう1つ教えてください。
xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別
するにはどうしたらよいのでしょうか?
? Application.WorksheetFunction.IsError(x)
だとエラーにならないのですが...
0772デフォルトの名無しさん2008/11/07(金) 10:00:12
どういうエラーでそのxが何か分からないと答えられない
セル(Range)なのか数値や文字なのか
0773デフォルトの名無しさん2008/11/07(金) 10:09:03
>>767
「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ
07747712008/11/07(金) 10:50:19
入力したテキストxでAutoFilterの設定・解除をしています。
(フィールドはアクティブセルの列)
この時、xの書式をアクティブセルの書式への変換は
>>751
さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に
Set rng = ActiveCell: rng.Value = x
if WorksheetFunction.Iserror(rng)
とすると、アクティブセルの保存が必要になってしまう為もう少しましな
方法を模索中なのです。
0775デフォルトの名無しさん2008/11/07(金) 12:54:09
>>769
ちょっと試せない状態だったのでとりあえず聞きました。

>>773
ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。
お騒がせしました。
0776デフォルトの名無しさん2008/11/07(金) 13:14:43
初歩的な質問なんですが、
intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。
二つ目の変数に別のアクティブセルを代入するとerror13が現れます。
どなたかご教授願えないでしょうか?
0777デフォルトの名無しさん2008/11/07(金) 13:47:26
>>776
アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?
0778デフォルトの名無しさん2008/11/07(金) 15:38:15
>>776
Error 13は「型が一致しません。」だから
単純にint型に文字列(スペース含む)を代入しようとしてるとか?
セルが空なら0が入るし
0779デフォルトの名無しさん2008/11/07(金) 18:04:36
膨大な量じゃないならコード貼ってどこでエラーがでたか書いてくれよ
0780デフォルトの名無しさん2008/11/07(金) 18:10:46
>>774
x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ?
いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな
0781デフォルトの名無しさん2008/11/07(金) 18:27:19
説明が下手な奴大杉
0782デフォルトの名無しさん2008/11/07(金) 19:31:54
説明もまともに出来ない不出来な頭だから、問題も自分で解決できずにここに質問に来るんだよ

もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが
殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから
ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない
0783デフォルトの名無しさん2008/11/07(金) 19:45:31
>>782
よく分からない論理だな。
0784デフォルトの名無しさん2008/11/07(金) 21:12:21
わからんではないが、そこまで言い放つことでもない
甘え放題も困るが委縮させ過ぎるのもよくない
意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい
0785デフォルトの名無しさん2008/11/08(土) 07:17:57
ヒマだからスレ読み返してたらわかったw
>>757=>>729だね。たぶん>>715も同じ人っぽい

screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い
たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく
off にしたらしっぱなしになる位置でやらないと

範囲指定を解除(セルが select されていない状態に)する方法だけど、
高さ・幅 0のイメージを用意してそれを select すれば、
selection が range でない状態にすることはできる
activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない

でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ
ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う
0786デフォルトの名無しさん2008/11/08(土) 17:49:36
>>785
ベリー、ベリー、サンクス
お見込みのとおり、その3つは折れです。
展望が開けました。
サンクス。
0787デフォルトの名無しさん2008/11/09(日) 08:43:30
Enumとして宣言さている列挙型のmember名をStringとして取得できますか?
0788デフォルトの名無しさん2008/11/09(日) 11:32:30
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。

・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
0789デフォルトの名無しさん2008/11/09(日) 11:34:07
だれのための、どういう報告なの?
07907882008/11/09(日) 11:36:43
販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。

・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述
・実行ボタンを押す
・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す

そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、
xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?
0791デフォルトの名無しさん2008/11/09(日) 11:53:23
>>787
スレ違い
それはVBAではなくVB言語の質問だ

>>790
あるけど、それはWindowsの設定の問題だ
0792デフォルトの名無しさん2008/11/09(日) 12:30:57
windows弄ったら出来るのかー。

ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。

VisualStudioからEXCELのコントロールわからんしな;;
0793デフォルトの名無しさん2008/11/09(日) 14:49:50
できないだろ
無理にやると普通に開けなくなるだろ
バッチファイルかWSHにドロップして
引数を環境変数に設定して
xlsファイルを開き
環境変数を見る
0794デフォルトの名無しさん2008/11/09(日) 15:43:56
いつもそんなことやってるの?
0795デフォルトの名無しさん2008/11/09(日) 19:34:55
>>790
普通にアドインを作れば解決するケースに思えるけど。
0796デフォルトの名無しさん2008/11/09(日) 21:03:05
アドイン??
0797デフォルトの名無しさん2008/11/09(日) 21:16:11
>>795
教えてくれ
0798デフォルトの名無しさん2008/11/09(日) 21:31:57
「Excel アドイン」でググってトップのところに詳しい説明があるから
それを読んだ方がいいよ。

VBAのコードが普通に書ける人ならすぐに理解できると思う。
07997882008/11/09(日) 21:34:13
>>795
>>798
まさにこれだ!!!
ありがとう!!!
08006552008/11/10(月) 00:15:33
>>655
If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then
Range("A1").Value = "明日は第三週の日曜日"
End If
正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。
0801デフォルトの名無しさん2008/11/10(月) 10:07:40
>>786
書いて良かった。誰?とか言ってゴメンなw

>>790
処理対象ファイルが自動的に特定できれば一番ラクそうだけど、
人間が見ないと特定できないの?
あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理?
正直、アドインにする利点がピンと来ない、、、
0802デフォルトの名無しさん2008/11/10(月) 11:51:04
>>801
販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
たとえは今日なら20081110.xlsって手打ちで名前をつけてね。
それをこのマクロの入ったBook1.xlsから呼び出すんだ。

それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。
0803デフォルトの名無しさん2008/11/10(月) 12:55:12
>>802
>販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。
保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね?
一々保存してからマクロ動かさないといけない理由でもあるのか?
0804デフォルトの名無しさん2008/11/10(月) 12:58:20
>>802
なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、
0805デフォルトの名無しさん2008/11/10(月) 13:33:50
今までが無駄過ぎただけだな。
0806デフォルトの名無しさん2008/11/10(月) 14:03:48
>>803
保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz
0807デフォルトの名無しさん2008/11/10(月) 14:05:19
>>804

それがアドインかと思ってたorz orz
0808デフォルトの名無しさん2008/11/10(月) 19:24:04
>>804
そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。
0809デフォルトの名無しさん2008/11/10(月) 19:26:46
>>808
ツールバーにマクロ登録すると
その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。
0810デフォルトの名無しさん2008/11/10(月) 19:30:27
うーんだからマクロっていうのはだなあ.....ってところから説明しないとダメ?
0811デフォルトの名無しさん2008/11/10(月) 19:40:33
マクロが記述してあるだけのブックを用意して
そのマクロをツールバーに登録するんだよ
ネットワーク越しでも大丈夫だし
0812デフォルトの名無しさん2008/11/10(月) 23:38:11
初心者なので、丸投げでお願いします。

application on timeを使って、
開始したら、
a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を
やって、終わる。
というものです。
どうにも、最近、頭が回らなくなって困ってます (~.~)
0813デフォルトの名無しさん2008/11/10(月) 23:48:19
はい次の話題
0814デフォルトの名無しさん2008/11/11(火) 00:02:20
812の追記
処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と
いうことでお願いします。

0815デフォルトの名無しさん2008/11/11(火) 01:31:29
A1に「08/11/11」と入力されているのをB1に「20081111」と変換させるマクロを作りたいと考えています。

Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが)

abc ="08/11/11";
sscanf(abc,"%d/%d/%d",&a,&,b,&c);
printf("20%02d%02d%02d",a,b,c);

VBAで書くにはどんな関数使えばいいのでしょう。
08168122008/11/11(火) 01:45:58
自己解決できましたので、
>>812 814はスルーでよろっ。
08178152008/11/11(火) 02:02:40
文字列操作でこうやってみた

                tmpdate_y = CStr(Left(Sheet1.Range("A" & i).Value, 2))
                tmpdate_m = CStr(Mid(Sheet1.Range("A" & i).Value, 4, 2))
                tmpdate_d = CStr(Right(Sheet1.Range("A" & i).Value, 2))
                tmpdate = "20" & tmpdate_y & tmpdate_m & tmpdate_d

スマートじゃねえよなーorz
0818デフォルトの名無しさん2008/11/11(火) 02:09:50
>>815
いったん日付型にしてから書式変換するとラクだと思う
文字列→日付型への変換は cdate()
日付型→書式付文字列変換は format()
詳しくはヘルプ読んでね
0819デフォルトの名無しさん2008/11/11(火) 19:44:30
すいません質問です
エクセルのマクロで
module1内にコード書くのと
sheet1内にコード書くのとでは
動作にどんな違いがありますか?
sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・
0820デフォルトの名無しさん2008/11/11(火) 19:50:39
訂正)Selection→Select
0821デフォルトの名無しさん2008/11/11(火) 20:51:01
>>445で解決しましたすいません
0822デフォルトの名無しさん2008/11/11(火) 21:15:30
こんばんは
複数のセルの値を一度に比較することってできますか?
Sheet1のA1:B5とSheet2のA1:B5のValueが
同じであるかどうか、が分かるだけでokなのですが。
0823デフォルトの名無しさん2008/11/12(水) 00:20:52
各シートは配列のようにアクセスできるが
0824デフォルトの名無しさん2008/11/12(水) 01:57:12
>>822
配列数式でできるよ
0825デフォルトの名無しさん2008/11/12(水) 05:52:03
Excel2003を使っています。
羅線の太さを調節する方法ってありますか?
できるだけ細くしたいのです。
0826デフォルトの名無しさん2008/11/12(水) 06:21:13
>>825
マクロの記録使って保存すればおk

単純に細くするだけの質問ならスレチ
0827デフォルトの名無しさん2008/11/12(水) 12:48:05
Excel2000:WindowsXP/Pentium4(1.8GHz)/RAM512

セルA1とA2を結合したシートに対して
下記のコードの実行時間は
1回目:13秒
2回目以降:54秒 (Pasteに変更すると29秒)

1回目と2回目以降の違いの理由は何なのでしょうか?

rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
selection.mergecells = false
selection.delete shift:=xlUp
range("A1").Select

どうやったら速度アップできるか知りたいのですが...
0828デフォルトの名無しさん2008/11/12(水) 12:52:09
羅線ってなんだ?
らせん?
0829デフォルトの名無しさん2008/11/12(水) 13:26:01
螺旋
罫線
新羅
確かに間違える人は居るかも
08308272008/11/12(水) 14:59:51
やりたい事は
シート・アクティブ時にコピー挿入し編集
シート・ディアクティブ時に挿入データを削除(元の状態に戻す)
なのです。
0831デフォルトの名無しさん2008/11/12(水) 15:02:57
> 1回目:13秒
> 2回目以降:54秒 (Pasteに変更すると29秒)

単位、「秒」じゃなくて「_秒」の間違いだよね?
0832デフォルトの名無しさん2008/11/12(水) 15:15:35
秒です。
0833デフォルトの名無しさん2008/11/12(水) 15:17:38
セルを結合していなければ1秒未満です。
0834デフォルトの名無しさん2008/11/12(水) 15:20:33
いや、結合していても_秒でしょ
0835デフォルトの名無しさん2008/11/12(水) 15:34:39
結合云々は関係なく1秒かからんな
データは何かあるのか?

とりあえず高速化のために
Application.ScreenUpdating=False
はやってるよな?
0836デフォルトの名無しさん2008/11/12(水) 15:54:59
新規ブックでセルをマージし、>>827のコードを走らせただけです。
ScreenUpdating, EnableEvent, Calculation等もやってみています。

マシン・スペック(5年前)の問題でしょうか?
0837デフォルトの名無しさん2008/11/12(水) 16:15:36
スペックは漏れのマシンのほうが悪いくらいのはずw
計測方法の問題じゃないか?
0838デフォルトの名無しさん2008/11/12(水) 16:54:32
すまん、Mobile Pentium4の間違いだったorz
0839デフォルトの名無しさん2008/11/12(水) 17:23:09
Mobile Celeron(1200MHz)512MB RAM
Mobile云々は置いといてこっちは1.2GHzなんだよw
OSが2kだからってここまで差は出ないよな?
体感でも1秒以上かかってるのか?
0840デフォルトの名無しさん2008/11/12(水) 17:38:52
excel2003:WindowsXP/Pentium4(2.8GHz)/RAM512
でセルA1とB1を結合して走らせてみたら
1回目:9秒
2回目:40秒

体感で1秒未満は、セル結合無しの場合だけ
0841デフォルトの名無しさん2008/11/12(水) 17:53:33
あぁA1とB1を結合かw
それなら確かに遅くなるな
08428272008/11/12(水) 18:00:26
>>827のA1とA2はA1とB1の結合に訂正願います orz
0843デフォルトの名無しさん2008/11/12(水) 18:03:34
俺の古典的環境だと1回目20秒、2回目1分40秒w
遅過ぎワロタw
0844デフォルトの名無しさん2008/11/12(水) 22:23:38
>>830
どこまでが編集前でどこからが編集後?
編集は .mergecells = false の前?後?
0845デフォルトの名無しさん2008/11/13(木) 09:30:46
*)シート(A1とB1結合)アクティブ時の処理
rows(1).select
selection.copy
selection.offset(1).resize(20000).select
selection.insert shift:=xlDown
'コピー挿入した行に名前を付ける(後で削除の為)

*)コピー挿入したデータへの編集

*)シートディアクティブ時の処理(アクティブ時点の状態に戻す)
'実際にはSelectionでは無く名前で削除
selection.mergecells = false '<- これ無しだと遅くなる為
selection.delete shift:=xlUp
range("A1").Select
0846デフォルトの名無しさん2008/11/13(木) 09:40:02
メモリ1ギガとか積んでいる人だと1回目と2回目の差が無いなんて事ないですか?
0847デフォルトの名無しさん2008/11/13(木) 12:31:54
>>845
了解

多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ
メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、
シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね

オレなりに試してみた限りでは、

挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ
      コピーし、狭間へ 1行目を 20000行分コピー
削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す
      ( .mergecells = false もいらない)

ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる
■ このスレッドは過去ログ倉庫に格納されています