次の方法で共有

(VBA含む)EXCEL2010以降のチェックボックスについて

Anonymous
2017-03-22T09:29:16+00:00

EXCELシートのデータをVBAで別シートに帳票化していましたが、EXCELのバージョンによって動作速度の顕著な違いが発生しています。

他のQAサイトにも質問しましたが原因不明で、こちらのサイトに確認してみた方が良いと言われましたので質問致します。

印刷実行指示用のEXCEL、基本データが入っているEXCEL、出力用のEXCELの3つのブックを利用して、帳票作成をする形でした。

帳票表示時に、True/False系の情報が有り、この部分の表示を、

・マーク形式(■・□)・・・文字

・チェックボックス形式(コントロール使用)

で表示切り替えが出来るようにしました。

EXCEL2007でVBAを作成し、入力データ1800件程度でも数秒程度で帳票出力が出来ていました。

これをEXCEL2013以降で動かすと、20時間~動作停止等の状態になりました。

(マーク形式の場合は、EXCEL2013以降でも問題ありませんでした)

VBA側のプログラムが問題かとも思いましたが考えられる高速化処理は施しEXCELファイルの拡張子変更も試してみましたが、結果は変わりませんでした。

その後、問題解決をする為に、一つのEXCELブック上でテスト出来るVBAプログラムを作成し試しましたが変わりません。

また、結果帳票が出たものに対して、EXCELのファイルメニューからPDFエクスポートをしてみると、VBAの時と同様に、

・EXCEL2007では数秒で出力されるのに対し、

・EXCEL2013では、7~8分程度の時間が掛りました。(本番データでは20時間前後)

PCのスペックがとかも言われますが、EXCEL2013のPCの方が最新で高性能?(どちらも、i5 4GBメモリ)

・EXCEL2007:Win7 Home(64bit)

・EXCEL2013:Win10 Pro(64bit)

色々と検索していますが、行き詰りましたので、本家サイトで質問させて頂きます。

■VBAテスト用プログラム

Option Explicit

Private refWbk As Workbook

Private refWks As Worksheet

Private outWks As Worksheet

Private chkBoxRange As Range

Private chkBox As Object

Private flagDisplay As Integer

Sub printExecute()

    If MsgBox("印刷処理を実行しますか。", vbYesNo + vbQuestion, "確認") = vbNo Then

        Exit Sub

    End If

    Dim StartTime, StopTime, KeikaTime As Variant

    '-----------------------------------------------------------------

    '--- 表示形式:1:マーク形式, 2:チェックボックス形式

    '-----------------------------------------------------------------

    flagDisplay = 2

    '-----------------------------------------------------------------

    Set refWbk = ThisWorkbook

    Worksheets.Add

    ActiveSheet.Name = "Print"

    Set outWks = ActiveSheet

    Application.DisplayAlerts = False

    Application.ScreenUpdating = False

    Application.EnableEvents = False

    Application.Calculation = xlCalculationManual

    DoEvents

    StartTime = Time

    Debug.Print "-- start :" & Time

    Dim nextLine As Long

    nextLine = 1

    Dim i As Long

    Dim inpRecCount As Long

    '---------------------------------------------------------------------------

    inpRecCount = 1000

    '---------------------------------------------------------------------------

    For i = 1 To inpRecCount

        DoEvents

        Application.StatusBar = "■処理件数:" & i & " / " & inpRecCount

        If flagDisplay = 1 Then

            outWks.Range("A" & nextLine).Value = "■"

            outWks.Range("B" & nextLine).Value = "□"

            outWks.Range("C" & nextLine).Value = "■"

            outWks.Range("D" & nextLine).Value = "□"

            outWks.Range("E" & nextLine).Value = "■"

            outWks.Range("F" & nextLine).Value = "□"

        Else

            Set chkBoxRange = Nothing

            Set chkBox = Nothing

            DoEvents

            Set chkBoxRange = outWks.Range("A" & nextLine)

            Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)

            chkBox.Caption = ""

            chkBox.Value = True

            Set chkBoxRange = Nothing

            Set chkBox = Nothing

            DoEvents

            Set chkBoxRange = outWks.Range("B" & nextLine)

            Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)

            chkBox.Caption = ""

            chkBox.Value = False

            Set chkBoxRange = Nothing

            Set chkBox = Nothing

            DoEvents

            Set chkBoxRange = outWks.Range("C" & nextLine)

            Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)

            chkBox.Caption = ""

            chkBox.Value = True

            Set chkBoxRange = Nothing

            Set chkBox = Nothing

            DoEvents

            Set chkBoxRange = outWks.Range("D" & nextLine)

            Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)

            chkBox.Caption = ""

            chkBox.Value = False

            Set chkBoxRange = Nothing

            Set chkBox = Nothing

            DoEvents

            Set chkBoxRange = outWks.Range("E" & nextLine)

            Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)

            chkBox.Caption = ""

            chkBox.Value = True

            Set chkBoxRange = Nothing

            Set chkBox = Nothing

            DoEvents

            Set chkBoxRange = outWks.Range("F" & nextLine)

            Set chkBox = outWks.CheckBoxes.Add(Left:=chkBoxRange.Left, Top:=chkBoxRange.Top, Width:=chkBoxRange.Width, Height:=chkBoxRange.Height)

            chkBox.Caption = ""

            chkBox.Value = False

        End If

        DoEvents

        nextLine = nextLine + 1

    Next i

    StopTime = Time

    Debug.Print "-- end   :" & Time

    KeikaTime = StartTime - StopTime

    Debug.Print "-- Keika :" & Hour(KeikaTime) & "時間" & Minute(KeikaTime) & "分" & Second(KeikaTime) & "秒"

    Application.Cursor = xlDefault

    MsgBox "印刷処理終了。", vbInformation, "通知"

    Application.DisplayAlerts = True

    Application.Calculation = xlCalculationAutomatic

    Application.ScreenUpdating = True

    Application.StatusBar = ""

    Application.StatusBar = False

End Sub

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

2 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2017-03-23T07:59:38+00:00

    秋山様、ありがとうございます。

    今、MSDNフォーラムに質問してみました。

    ただ、VBA以前に、普通にEXCELにチェックボックスを配置したものを表示させた場合、

    EXCEL2007では、数千行あっても見れますが、

    EXCEL2013では、パラパラ表示状態になります。相当遅い表示状態です。

    (これは、PG無しの素のEXCELシートで試した結果です)

    これをPDFにエクスポートするパターンでも同様でした。

    ・・・MSに電話で問い合わせたけど、聞いたことないとのことでした。

    ちゃんと聞きたければ、お金が必要だと言われたので、少し躊躇しております。

    誰か、情報知らないかなと・・・

    この回答は役に立ちましたか?

    2 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2017-03-23T06:03:07+00:00

    Tatsuya.KAWAGUCHI さん、こんにちは。

    マイクロソフト コミュニティのご利用、ありがとうございます。

    投稿していただいた内容ですと、基本的な使い方やトラブルの対処法について情報交換を行っているマイクロソフト コミュニティでは情報が集まりにくいかと思います。

    VBA に関連する内容なので、開発者の方々が多く利用されていて専用のカテゴリがある MSDN フォーラムに投稿してみるとアドバイスや情報が集りやすいと思います。

    MSDN フォーラム - Visual Basic for Application(VBA)

    よろしければそちらを活用してみてくださいね。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません