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

■34476 / 親記事)  Excel複数シートの印刷順序
  
□投稿者/ .net困惑者 一般人(1回)-(2020/06/02(Tue) 19:03:36)
  • アイコン環境/言語:[Windows10 .net2019 Excel2010] 
    分類:[.NET] 

    始めて投稿させて頂きます。
    VB2019にてExcel帳票を印刷するプログラムを作成中なのですが、

    [シート1][シート2][シート3][シート4][シート5]

    という内容で構成されたエクセルファイルがあるとしまして、

    [シート3][シート1][シート5]

    という内容で印刷しようとしています。
    (pdfの為、一括での印刷の必要があります)

    Dim prSheet() as String ((0)[シート3],(1)[シート1],(2)[シート5]と準備済)
    Dim selSheets As Excel.Sheets = xlBook.Sheets.Item(prSheet)

    と配列渡しでその順に印刷されると考えていたのですが

    [シート1][シート3][シート5]

    と出力されてしまい、出力順序を決める方法で困っています。
    皆様のお知恵をお貸しいただければと投稿させて頂きました。

マルチポストを報告
違反を報告
引用返信 削除キー/
■34477 / ResNo.1)  Re[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
違反を報告
引用返信 削除キー/
■34478 / ResNo.2)  Re[2]: Excel複数シートの印刷順序
□投稿者/ .net困惑者 一般人(1回)-(2020/06/04(Thu) 13:07:37)
  • アイコン出先から拝見させて頂いています。
    たいへん親切でご丁寧なご助言ありがとうございます!
    検証までして頂いて・・・涙

    戻り次第、下記ご助言の方法にて試してみます。
    本当にありがとうございました。結果は追ってご連絡させて頂きます。


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

違反を報告
引用返信 削除キー/
■34480 / ResNo.3)  Re[2]: Excel複数シートの印刷順序
□投稿者/ .net困惑者 一般人(3回)-(2020/06/06(Sat) 15:40:24)
  • アイコンNo34477に返信(魔界の仮面弁士さんの記事)

    引用させて頂き、無事に解決致しました!
    ありがとうございました!
解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -