[[20130305090550]] 『コピーする雛形を非表示で操作』(ゆき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コピーする雛形を非表示で操作』(ゆき)

 いつもお世話になっています。

 出荷データブックを作成して、未出荷リストや未売上リスト、出荷予定リストなどいろいろな
 シートを作成しています。

 元のデータシートから各種シートを作成するのに「未出荷_雛形」「未売上_雛形」というような
 雛形シートを用意してそれをコピーして同じブックの後ろに追加するようにしています。

 (ほとんどがユーザーフォームから条件指定して条件に一致したデータを抽出して作成しています)

 それで、やることが増えるにつれ「雛形」シートが増え、一画面に表示されるシートのタブが
 「雛形」でいっぱいになり、シートの選択をするのに逐一スクロールしたり右クリックでシート一覧から選択したり、
 ちょっと見づらくなってきました、

 「雛形」シートを非表示にしてそれをコピーできればいいのですが、普通に非表示にしただけでは
 雛形がコピーできません。

 非表示にした雛形をコピーするにはどうしたらいいでしょうか。

 現在のコピー部分のコードは下記のような感じです

 Option Explicit
 Public lsh As Worksheet
 Public myRow As Long

 Dim cnt As Long
 Dim shName As String
 Dim bName As String
 Dim ws1 As Worksheet
 Dim ws2 As Worksheet
 Dim lRow As Long
 Dim z As Long
 Dim i As Long
 Dim j As Long
 Dim DataCnt As Long

    Set ws1 = ThisWorkbook.Worksheets("物件データ")

    z = ws1.Range("B" & ws1.Rows.Count).End(xlUp).Row

    DataCnt = 0
    cnt = 1
    bName = "未売上リスト_全件"
    ThisWorkbook.Sheets("未計上_雛形").Copy After:=Sheets(Sheets.Count)

    shName = bName

    Do
        If Not IsObject(Evaluate("'" & shName & "'!A1")) Then Exit Do
        cnt = cnt + 1
        shName = bName & "(" & cnt & ")"
    Loop

    ActiveSheet.Name = shName
    Set lsh = ThisWorkbook.Sheets(Sheets.Count)

  (以下略)

 よろしくお願いします。

 非表示シートをコピーしたり、指定した場合の挙動は通常と異なるようなので、
 コピー時だけ表示にしてはどうでしょうか。

 必要な部分だけに絞りましたけれど、サンプルです。
 (Mook)

 Option Explicit
 Sub Sample()
    Dim cnt As Long
    Dim shName As String
    Dim bName As String
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    cnt = 1
    bName = "未売上リスト_全件"

    Application.ScreenUpdating = False
    With ThisWorkbook.Worksheets("未計上_雛形")
        .Visible = xlSheetVisible
        .Copy After:=Worksheets(Worksheets.Count)
        Set ws2 = ActiveSheet
        .Visible = xlSheetHidden
    End With
    Application.ScreenUpdating = True

    shName = bName
    Do While IsObject(Evaluate("'" & shName & "'!A1")) = True
        cnt = cnt + 1
        shName = bName & "(" & cnt & ")"
    Loop

    ws2.Name = shName
 End Sub

 雛形のシートをコピーするのではなくて、
シートテンプレートを外部においておき、適時にテンプレートを挿入する
運用にしてはいかがでしょう?
(みやほりん)

 Mook様ありがとうございます。

 やはりコピーする際は表示させる必要があったのですね。
 でも、これなら普段は非表示でOKなので大丈夫そうです。

 みやほりん様、アイデアをありがとうございます。

 やってみて、例えば「雛形ブック.xlsm」というテンプレート用のブックを用意して

     Workbooks("雛形ブック.xlsm").Worksheets("未計上_雛形").Copy After:=Sheets(Sheets.Count)

 このようにした場合、ちゃんと「雛形ブック」が開かれているときはシートをコピーできたのですが、
 もし開いていなかった場合に「インデックスが有効範囲にありません」のエラーになります。

 例えば、「雛形ブック」を開いていなかった場合「雛形ブックが開かれていません」というメッセージを出すか、
 ブックを開くダイアログを表示させるとかしたいのですが、
 「対象のブックが開かれているかどうか」
 の判定はどのようにしたらよいのでしょうか?

 初歩的な質問ですみません

 (ゆき)

 「シートテンプレート」は雛形のブックを用意しておくのとは
また違った使い方です。
「名前をつけて保存」はご存知だと思いますが、
ファイル形式の中に「テンプレート」という類のものがあります。
私の言っているものはこれです。
 
「新規シート」をブックに作成することはたびたびありますよね。
「新規シート」の代わりに、「ユーザーが作成したシート」を
挿入することが出来ます。下記を参考にしてください。
 
[Office.com:ブックまたはワークシートをテンプレートとして保存する]
http://office.microsoft.com/ja-jp/excel-help/HA010218874.aspx 現在参照不可
 
操作をマクロ記録することである程度のコードは作成できます。
(みやほりん)

 一応の補足ですけれど上記のテンプレートファイル(拡張子xlt, 2007以降 xltx)を
 使う場合はファイルを開くのではなく、下記のようにTypeでファイルパスを指定します。
    Sheets.Add After:=Worksheets(Sheets.Count), Type:="D:\MyTemplate\未計上.xltx"

 この方がすっきりですね。
  (Mook)


 みやほりん様、Mook様、再度のご回答ありがとうございます。

 テンプレートは使ったことがなかったので試しにやってみました。

 しかし、まずデフォルトで保存された場所にエクスプローラからなかなか行き着くことができず(「最近使ったファイル」の履歴から
 ファイルのフルパスを辿って行けましたが、エクスプローラでは表示されない…)
 更にそこでは不便なので自分で操作しやすいフォルダに置いたら「テンプレートの挿入」に保存したテンプレートが
 表示されなくなりました。

 また、雛形の数が多いのでまとめて一つのテンプレートブックとして保存(とりあえずデフォルトの場所)して
 「テンプレートの挿入」をしたところ、全てのシートがまとめて挿入されてしまいました。
 (テンプレートブックの中から更にシートを選択して挿入できるものかと…)

 なかなか使いこなすのが難しいです…

 (ゆき)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.