EXCEL2007で作成したVBAのプログラムがあります。
今まで動いていた書式([□]、[■])
をチェックボックス形式で表示したいと言うことになり、
その部分のロジックを変更しました。
PGを変更した所、入力データが1500件程度の場合、EXCEL2007では、1分程度で終了しましたが、EXCEL2013以降で動かすと、何時間も掛ったり、途中で動作不能状態になったりとします。
一般的な解決方法の、
[Application.ScreenUpdating = False]とか、色々と検索した事例は入れておりますが、100数十件を超えた所から処理速度が劇的に落ち込んできます。
(StatusBarに件数表示をして確認・・・全件だったり、100件単位での表示に変えたりとか)
何か、ヒントがあればお知恵を拝借したいと思い、質問させて頂きました。
宜しくお願い致します。
コメント(8件)
Excel15.xlb の 再構築とかなのですが、
>EXCEL2013以降で動かすと
2013だけじゃないんですよね。。。
Excel15.xlb を キーワードに検索してみては?
ダメもとで、
http://solaluna.hatenablog.com/entry/2015/06/06/185519
などを参考に再構築してみては?
でも、まったく原因が違う場合もあるみたいです
https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_winother/excel/1f343903-f58c-4efb-9f6e-3138f5e0b51e
Excel15.xlb を キーワードに検索してみては?
>一般的な解決方法の、
> [Application.ScreenUpdating = False]とか、色々と検索した事例は入れておりますが、100数十件を超えた所から処理速度が劇的に落ち込んできます。
>
Application.ScreenUpdating = Falseで止められているみたいなので、
あとは、再計算を
Application.Calculation = xlCalculationManual
で止めて、
処理終了後忘れずに
Application.Calculation = xlCalculationAutomatic
で戻すぐらいですが、
>色々と検索した事例は入れております
なので、すでにお試しになっていると思いますが・・・
処理のコードを載せると、何か別のヒントが付くと思います。
※念のため、再計算を疑ってみました。コメント汚してスミマセン。
Excel15.xlbの件は、これから確認してみたいと思います。
ここに質問するのは初めてで、本当はロジック部を記載しようと思ったのですが、文字数オーバーで出来ませんでした。
・・・一部ですが、、、
【前】
If (UCase(inpWks.Range("L" & refLine).Value) = "TRUE") Then
outWks.Range("N" & nextLine).Value = "■"
Else
outWks.Range("N" & nextLine).Value = "□"
End If
【後】
Set chkBoxRange = outWks.Range("N" & nextLine)
If (UCase(inpWks.Range("L" & refLine).Value) = "TRUE") Then
Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)
chkBox.Caption = ""
chkBox.Value = True
Else
Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)
chkBox.Caption = ""
chkBox.Value = False
End If
Set chkBoxRange = Nothing
Set chkBox = Nothing
DoEvents
のような形です。
質問文の領域にある「補足を書く」ボタンが便利です。
質問者からの補足では、ベタテキストだけではなく、文字の修飾やはてな記法が使えるので、例えば、インデントを保ったままソースコードを貼り付けたりできます。
http://hatenadiary.g.hatena.ne.jp/keyword/%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%82%84%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%EF%BC%88%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BCpre%E8%A8%98%E6%B3%95%EF%BC%89
Unicode には、チェックボックスの文字があるので、それを使うとか。
http://www.amp-what.com/unicode/search/checkbox
outWks.Range("N" & nextLine).Value = ChrW(9744) ' not checked
outWks.Range("N" & nextLine).Value = ChrW(9745) ' checked
フォントをメイリオとかにすると、それっぽく見えます。
補足の書き方分かりました。
チェックボックス文字も初めて知りました。
最初、これがあれば良いかなとも思いましたが、出力したEXCEL内容を変更するパターンもあり得るようで、その時にチェックボックスだとやり易いとのことでした。
(説明不足でした)
何でEXCELのバージョンが違うだけで、こんなに動作が変わるんだろうと思います。
もう少し試します。
多分、これと同じようなことで悩む人もいると思うので・・・
>パターンもあり得るようで、その時にチェックボックスだとやり易いとのことでした。
Excel2013 の動作が不安定らしいのは、検索しててもいくつも引っかかるので、Excel のバージョンをコントロール(Excel 2013 は使わないとか)できないのであれば、Worksheet の SelectionChange を使うというような回避策をこうじるしかないのではないと思います。
VBA に限らず、Office 製品を制御するのは、こんなもんです (´・ω・`)
Word で VBA を使うとよく死ぬ(個人的な感想です)し、Windows 10 + Excel 2010 で、Windows 8.1 よりも遅くなったと騒いでた人が近く(リアルな世界の方で)にいたような、いないような。