EXCEL VBAでの質問です。

EXCEL2007で作成したVBAのプログラムがあります。

今まで動いていた書式([□]、[■])
をチェックボックス形式で表示したいと言うことになり、
その部分のロジックを変更しました。

PGを変更した所、入力データが1500件程度の場合、EXCEL2007では、1分程度で終了しましたが、EXCEL2013以降で動かすと、何時間も掛ったり、途中で動作不能状態になったりとします。

一般的な解決方法の、
 [Application.ScreenUpdating = False]とか、色々と検索した事例は入れておりますが、100数十件を超えた所から処理速度が劇的に落ち込んできます。
 (StatusBarに件数表示をして確認・・・全件だったり、100件単位での表示に変えたりとか)

何か、ヒントがあればお知恵を拝借したいと思い、質問させて頂きました。
宜しくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2017/03/16 16:55:03

回答0件)

回答はまだありません

  • id:ken3memo
    Excel2013が遅いとき、検索でよく目にするのが

    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 を キーワードに検索してみては?

  • id:ken3memo
    画面の描画は、
    >一般的な解決方法の、
    >  [Application.ScreenUpdating = False]とか、色々と検索した事例は入れておりますが、100数十件を超えた所から処理速度が劇的に落ち込んできます。
    >

    Application.ScreenUpdating = Falseで止められているみたいなので、
    あとは、再計算を
    Application.Calculation = xlCalculationManual
    で止めて、
    処理終了後忘れずに
    Application.Calculation = xlCalculationAutomatic
    で戻すぐらいですが、
    >色々と検索した事例は入れております
    なので、すでにお試しになっていると思いますが・・・
    処理のコードを載せると、何か別のヒントが付くと思います。
    ※念のため、再計算を疑ってみました。コメント汚してスミマセン。
  • id:tatsuya-kawaguchi
    ありがとうございます。
    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
    のような形です。
  • id:a-kuma3
    >本当はロジック部を記載しようと思ったのですが、文字数オーバーで出来ませんでした。
    質問文の領域にある「補足を書く」ボタンが便利です。
    質問者からの補足では、ベタテキストだけではなく、文字の修飾やはてな記法が使えるので、例えば、インデントを保ったままソースコードを貼り付けたりできます。
    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
  • id:a-kuma3
    見た目だけで良いんですよね?
    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

    フォントをメイリオとかにすると、それっぽく見えます。
  • id:tatsuya-kawaguchi
    a-kuma3さん、ありがとうございます。
    補足の書き方分かりました。
    チェックボックス文字も初めて知りました。
    最初、これがあれば良いかなとも思いましたが、出力したEXCEL内容を変更するパターンもあり得るようで、その時にチェックボックスだとやり易いとのことでした。
    (説明不足でした)
    何でEXCELのバージョンが違うだけで、こんなに動作が変わるんだろうと思います。
    もう少し試します。
    多分、これと同じようなことで悩む人もいると思うので・・・
  • id:a-kuma3
    >最初、これがあれば良いかなとも思いましたが、出力したEXCEL内容を変更する
    >パターンもあり得るようで、その時にチェックボックスだとやり易いとのことでした。
    Excel2013 の動作が不安定らしいのは、検索しててもいくつも引っかかるので、Excel のバージョンをコントロール(Excel 2013 は使わないとか)できないのであれば、Worksheet の SelectionChange を使うというような回避策をこうじるしかないのではないと思います。

    VBA に限らず、Office 製品を制御するのは、こんなもんです (´・ω・`)
    Word で VBA を使うとよく死ぬ(個人的な感想です)し、Windows 10 + Excel 2010 で、Windows 8.1 よりも遅くなったと騒いでた人が近く(リアルな世界の方で)にいたような、いないような。
  • id:taknt
    xlsにして やってみるってのは?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません