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