Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4579 / 13644 ツリー ←次へ | 前へ→

【55668】ActiveWindow.View = xlPageBreakPreviewについて km 08/5/15(木) 7:29 質問[未読]
【55669】Re:ActiveWindow.View = xlPageBreakPrevi... ハチ 08/5/15(木) 8:51 回答[未読]
【55684】Re:ActiveWindow.View = xlPageBreakPrevi... km 08/5/15(木) 20:12 質問[未読]
【55700】Re:ActiveWindow.View = xlPageBreakPrevi... ハチ 08/5/16(金) 9:15 発言[未読]
【55723】Re:ActiveWindow.View = xlPageBreakPrevi... km 08/5/16(金) 20:10 質問[未読]
【55770】Re:ActiveWindow.View = xlPageBreakPrevi... ハチ 08/5/19(月) 9:48 発言[未読]
【55836】Re:ActiveWindow.View = xlPageBreakPrevi... km 08/5/20(火) 20:16 お礼[未読]

【55668】ActiveWindow.View = xlPageBreakPrevie...
質問  km  - 08/5/15(木) 7:29 -

引用なし
パスワード
   タイトルのようにActiveWindow.View = xlPageBreakPreviewは
改ページの情報を取得する際に下記のように、繁用されています。
例として

ActiveWindow.View = xlPageBreakPreview

N = 1

Do
 MsgBox ActiveSheet.HPageBreaks(N).Location.Row
 N = N + 1
Loop

しかし、上記の場合、ActiveWindow.View = xlPageBreakPreviewが
無くても正しく改ページの位置が取得できるので、
ActiveWindow.View = xlPageBreakPreviewは不要では?
ActiveWindow.View = xlPageBreakPreviewが必ず必要な場合はどのような
ケースが想定されるのでしようか?

【55669】Re:ActiveWindow.View = xlPageBreakPre...
回答  ハチ  - 08/5/15(木) 8:51 -

引用なし
パスワード
   ▼km さん:

>
>しかし、上記の場合、ActiveWindow.View = xlPageBreakPreviewが
>無くても正しく改ページの位置が取得できるので、
>ActiveWindow.View = xlPageBreakPreviewは不要では?
>ActiveWindow.View = xlPageBreakPreviewが必ず必要な場合はどのような
>ケースが想定されるのでしようか?

過去の質問で、
自動改ページで不具合が出たことがありました。

xlPageBreakPreview で「検索」してみてください。

【55684】Re:ActiveWindow.View = xlPageBreakPre...
質問  km  - 08/5/15(木) 20:12 -

引用なし
パスワード
   ハチさん回答ありがとうございます。

>自動改ページで不具合が出たことがありました。
そうなんですか・・・。
今回は強制的に1頁36行に改ページ設定しています。
どうもActiveWindow.View = xlPageBreakPreviewを使用して
プログラムを実行すると、処理時間が約2倍かかります。
同一ブック内のシートのデータをオートフィルターにて順次
抽出し、別シートの印刷用シートへ書き込んでいます。
強制的に改ページを各ページ全てに設定しておけば、
ActiveWindow.View = xlPageBreakPreviewを
使用しなくても不具合は発生しないでしようか?

プログラムは下記の通りです。

・・・・・・・・・・・・・
・・・・・・・・・・・・・
印刷用Sheet.Select

ActiveWindow.View = xlPageBreakPreview

DATA.AutoFilterMode = False 'DATAシートのAutoFilterを解除
DATA.Range("A1").AutoFilter 'DATAシートのAutoFilterを設定

On Error Resume Next
  Range("A3", Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count)).SpecialCells(xlCellTypeConstants, 3).ClearContents
On Error GoTo 0

Application.ScreenUpdating = False

Set Rng2 = DATA.Range("K2:K" & DATA.Columns("K").CurrentRegion.Rows.Count)

MyPage = 1
Count = 3

For Each dd In Rng2
  
  DATA.Range("A1").AutoFilter Field:=DATA.Columns(DATA科分類_列).Column, Criteria1:=dd
  
  DATA件数 = Application.Subtotal(3, DATA.Columns(DATA科分類_列)) - 1
  
  With DATA.Range("A1").CurrentRegion.Columns(DATA科分類_列)
    Set CopyRng = .Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible)
  End With
    
  For Each wb In CopyRng
      
    Cells(Count, Columns(印刷用県名_列).Column).Value = DATA.Cells(wb.Row, Columns(DATA県名_列).Column).Value
    Cells(Count, Columns(印刷用科名_列).Column).Value = DATA.Cells(wb.Row, Columns(DATA科名_列).Column).Value
    Cells(Count, Columns(印刷用発行年_列).Column).Value = DATA.Cells(wb.Row, Columns(DATA発行年_列).Column).Value
    Cells(Count, Columns(印刷用免許No_列).Column).Value = DATA.Cells(wb.Row, Columns(DATA免許No_列).Column).Value
    'Cells(Count, Columns(印刷用備考欄_列).Column).Value = DATA.Cells(wb.Row, Columns(DATA備考欄_列).Column).Value
    'Cells(Count, Columns(印刷用県名カナ_列).Column).Value = DATA.Cells(wb.Row, Columns(DATA県名カナ_列).Column).Value
    
    Count = Count + 1
        
    If Count = ActiveSheet.HPageBreaks(MyPage).Location.Row Then
      Range(印刷用科分類_列 & ActiveSheet.HPageBreaks(MyPage).Location.Row - ActiveSheet.HPageBreaks(1).Location.Row + 1) = "【 " & dd & " 】"
      Count = ActiveSheet.HPageBreaks(MyPage).Location.Row + 2
      MyPage = MyPage + 1
    End If
    
  Next
  
  Range(印刷用科分類_列 & ActiveSheet.HPageBreaks(MyPage).Location.Row - ActiveSheet.HPageBreaks(1).Location.Row + 1) = "【 " & dd & " 】"
  Count = ActiveSheet.HPageBreaks(MyPage).Location.Row + 2
  MyPage = MyPage + 1
    
Next
・・・・・・・・・・・・・・・・・・・・・・・・・・

【55700】Re:ActiveWindow.View = xlPageBreakPre...
発言  ハチ  - 08/5/16(金) 9:15 -

引用なし
パスワード
   ▼km さん:

>強制的に改ページを各ページ全てに設定しておけば、
>ActiveWindow.View = xlPageBreakPreviewを
>使用しなくても不具合は発生しないでしようか?

自分は印刷系のマクロのときは、
「おまじない」のつもりで入れています。
現状で動作するのなら「たぶん」大丈夫では?

強制改行を入れるのなら、
設定する前にResetAllPageBreaks で
改ページをリセットしておくほうが安心だと思います。

【55723】Re:ActiveWindow.View = xlPageBreakPre...
質問  km  - 08/5/16(金) 20:10 -

引用なし
パスワード
   ハチ さん御助言ありがとうございます。

ActiveWindow.View = xlPageBreakPreviewに設定すると、
書込み時には、プログラム実行速度は落ちるものですか?
経験がありますか?
配列で処理しないと速度改善は無理?

【55770】Re:ActiveWindow.View = xlPageBreakPre...
発言  ハチ  - 08/5/19(月) 9:48 -

引用なし
パスワード
   ▼km さん:
>ハチ さん御助言ありがとうございます。
>
>ActiveWindow.View = xlPageBreakPreviewに設定すると、
>書込み時には、プログラム実行速度は落ちるものですか?
>経験がありますか?
>配列で処理しないと速度改善は無理?

あまり意識したことはありませんでしたが、
かなり落ちるみたいですね。
新規Bookでtest1とtest2 の実行結果を較べてください。

データの更新が終ってから、印刷プロセスに移るようにすれば良いのでは?

先のレスにも書きましたが自分の場合は
「おまじない」で入れてるだけですので、
不具合が無さそうなら要らないと思います。


Sub test1()
  Dim t As Double
  Dim R As Range
  ActiveWindow.View = xlNormalView
    
  t = [=NOW()]
  '5000セルへ書き込み
  For Each R In ActiveSheet.Range("A1:E1000")
    R.Value = R.Address(0, 0)
  Next
  
  t = [=NOW()] - t
  t = Round(t * 1440, 3)
  MsgBox t & "秒"
End Sub

Sub test2()
  Dim t As Double
  Dim R As Range
  ActiveWindow.View = xlPageBreakPreview
    
  t = [=NOW()]
  '5000セルへ書き込み
  For Each R In ActiveSheet.Range("A1:E1000")
    R.Value = R.Address(0, 0)
  Next
  
  t = [=NOW()] - t
  t = Round(t * 1440, 3)
  MsgBox t & "秒"
End Sub

【55836】Re:ActiveWindow.View = xlPageBreakPre...
お礼  km  - 08/5/20(火) 20:16 -

引用なし
パスワード
   わざわざコードまで書いて頂き、ありがとうございます。

TEST1:0.019秒
TEST2:0.524秒

相対的に比較してもかなり処理速度に差がありますね。

>不具合が無さそうなら要らないと思います。
ご指摘のように私の場合、不具合がないので、
ActiveWindow.View = xlPageBreakPreview
は使わず、コーディングしようと思います。
色々とありがとうございました。

4579 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free