DOBON.NETプログラミング道掲示板

■34477 / 1階層)  Excel複数シートの印刷順序
□投稿者/ 魔界の仮面弁士 大御所(1284回)-(2020/06/03(Wed) 10:51:40)
  • アイコンNo34476に返信(.net困惑者さんの記事)
    > Dim prSheet() as String ((0)[シート3],(1)[シート1],(2)[シート5]と準備済)
    > Dim selSheets As Excel.Sheets = xlBook.Sheets.Item(prSheet)

    xlBook.Sheets.Item の構文を使ってしまうと、Sheets コレクションの
    オブジェクト解放漏れに陥る可能性がありそうです…。


    .NET からだと解放手続きが面倒なので、以下の回答では
    VBA なコードにて検証しています。ご容赦ください。

    まず、元質問にあった

     Dim prSheet() As String
     prSheet = Split("Sheet3 Sheet1 Sheet5") '3シート

     Dim selSheets As Excel.Sheets
     Set selSheets = ThisWorkbook.Sheets(prSheet)

    の場合、For Each sh In selSheets することで、
    配列で指定した順序そのままで列挙されることを確認しました。

    また、配列の中身が Split("Sheet3 Sheet1 Sheet5 Sheet3") なら、
    Sheet3 が最初と最後に合計 2 回列挙されて 4 シートとなる状態でした。


    しかし上記いずれの場合も、selSheets.PrintPreview によって
    プレビューされるのは、Sheet1, Sheet3, Sheet5 の順番となりました。

    このことから、Excel.Sheets の列挙順を変えるだけでは、
    印刷順を制御できないのだという事が分かります。


    どうしても印刷順を変更したいのであれば、
    印刷順に反映されるよう、並び変える必要がありそうです。

    Dim xlSheets As Excel.Sheets
    Set xlSheets = xlBook.Sheets

    Dim selSheets As Excel.Sheets
    Set selSheets = xlSheets.Item(prSheet)

    If xlSheets.Count > 1 Then
      Dim xlSheet As Object
      Dim n As Integer
      For n = selSheets.Count To 1 Step -1
        Set xlSheet = selSheets.Item(n)
        Dim xlFirstSheet As Object
        Set xlFirstSheet = xlSheets.Item(1)
        If Not xlSheet Is xlFirstSheet Then
          xlSheet.Move Before:=xlFirstSheet
        End If
      Next
    End If


    もし、「元の順番を変更したくない」とか、
    「同じページが複数回現れる事も許可したい」となれば、
    別の作業用ブックにコピーしておき、
    それを印刷あるいは印刷プレビューするとか…。


    xlApp.SheetsInNewWorkbook = 1
    Dim newBook As Excel.Workbook
    Set newBook = xlApp.Workbooks.Add()
    Dim newSheets As Excel.Sheets
    Set newSheets = newBook.Sheets
    Dim firstSheet As Excel.Worksheet
    Set firstSheet = newSheets(1)
    Dim dstSheet As Object
    Set dstSheet = firstSheet
    dstSheet.Name = vbTab
    Dim srcSheet As Object
    For Each srcSheet In selSheets
    srcSheet.Copy After:=dstSheet
    Set dstSheet = newSheets(newSheets.Count)
    Next
    firstSheet.Delete

    newSheets.PrintPreview
    newBook.Close SaveChanges:=False
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Excel複数シートの印刷順序 /.net困惑者 →Re[2]: Excel複数シートの印刷順序 / .net困惑者
→Re[2]: Excel複数シートの印刷順序 /.net困惑者
 
上記関連ツリー

Nomalアイコン Excel複数シートの印刷順序 / .net困惑者 (20/06/02(Tue) 19:03) #34476
Nomalアイコン Excel複数シートの印刷順序 / 魔界の仮面弁士 (20/06/03(Wed) 10:51) #34477 ←Now
  ├Nomalアイコン Re[2]: Excel複数シートの印刷順序 / .net困惑者 (20/06/04(Thu) 13:07) #34478
  └Nomalアイコン Re[2]: Excel複数シートの印刷順序 / .net困惑者 (20/06/06(Sat) 15:40) #34480 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -