|
▼miyake さん:
おはようございます。再投稿です。
>いつもお世話になっております。
>
>>過去ログを参照してください。
>>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=21998;id=excel
>
>上記を参考にして作ったところおおむねうまくいきましたが、失敗することがあります。
>
>〜プログラムの概要〜
> シート( Sheet1 )にコマンドボタン( cmd選択シート保存 )が貼り付けられ、そのボタンを押すと、そのシートのみ新規ブックにコピーして保存するプログラムです。
> コマンドボタンを押すと、標準モジュールの選択シート保存プロシージャを呼び出し、Sheet1を新規ブックにコピーし、コピー先シートに残っているコード( Private Sub cmd選択シート保存_Click() )とコマンドボタンを削除するもの。
>
>*うまくいくケース
> コピー元のブックのVBAプロジェクトを一度開いた後に実行すると、コピー先のシートのコードがきれいに消されている。
>(コードは消されているが、ファイルを開くときに、どういう訳かマクロを有効にするか否かのメッセージが出てきてしまう)
>
>*うまくいかないケース
> コピー元のブックのVBAプロジェクトを一度も開かずに実行すると、コピー先のシートのコードが残ってしまう。(コードが消されない)
>
>対処方法があればご教示ください。
>コードは下記のとおりです。
>
>
>〜Sheet1のイベントプロシージャ〜
>
>Private Sub cmd選択シート保存_Click()
>
>Module1.選択シート保存
>
>End Sub
'======================================================
Sub 本当に保存()
'保存するかどうかの確認
Dim ShName As String
ShName = Me.Name
DlgAnswer = Application.Dialogs(xlDialogSaveAs).Show(ShName)
DoEvents
If DlgAnswer = True Then
ActiveWorkbook.Close
Else
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
End If
End Sub
>
>〜module1の選択シート保存プロシージャ〜
>
>Sub 選択シート保存()
>
>Dim ShName As String
>ShName = ActiveSheet.Name
>
>'アクティブシートを新規ブックにコピー
>ActiveSheet.Copy
>
>'コピー先のシートモジュールを削除
With ActiveWorkbook.VBProject.VBComponents.Item(ShName).CodeModule
' シート名を変数に入れたのですからここで活用しましょう!!
> .DeleteLines 1, .CountOfLines
>End With
>
>'コピー先シートのオブジェクトを削除
>Dim cmdShape As Shape
>
>For Each cmdShape In ActiveSheet.Shapes
> 'コマンドボタン
> If Left(cmdShape.Name, 3) = "cmd" Then
> cmdShape.Select
> Selection.Delete
> 'テキストボックス
> ElseIf Left(cmdShape.Name, 3) = "txt" Then
> cmdShape.Select
> Selection.Delete
> 'ラベル
> ElseIf Left(cmdShape.Name, 3) = "lbl" Then
> cmdShape.Select
> Selection.Delete
> 'コンボボックス
> ElseIf Left(cmdShape.Name, 3) = "cmb" Then
> cmdShape.Select
> Selection.Delete
>
> End If
>
>Next cmdShape
>
Application.OnTime Now(), "'" & ThisWorkbook.Name & "'!sheet1.本当に保存"
>
>End Sub
これで確認してみて下さい。
ですが・・・・。
このコードをご自分以外の他の方にも使ってもらうものだとしたら
いくつかの問題があります。
・VbprojectがExcel2002以降では標準の設定ではアクセスできないこと。
Excel2000等で可能でもいつかは、Officeのバージョンアップをしなければ
なりませんよね?その時に大きくコードを変更を強いられる事になるかもしれませんよ
・「コントロールツールボックス」コマンドボタン等を削除するコードがありますが、
このツールバーのコントロールの動的な作成・削除には、問題がありそうです。
「マクロを有効にするか否か」のメッセージはこれが原因かと思われます。
ここに同様のご質問が以前にもこのサイトでありました。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=14064;id=excel
↑ここでさらにリンクしていますから、そこもご覧になって下さい。
動的な作成・削除には、他にも問題があるかもしれません。
それを洗い出す問題提起なら、それはそれで意義はありますけどね!!
IROCさんが
>シートをコピーせずにセルをコピーしてはいかがですか?
と言っていますよね?
>Private Sub cmd選択シート保存_Click()
Set bk = Workbooks.Add
Cells.Copy bk.Worksheets(1).Range("a1")
>End Sub
とすれば、コードもコントロールも含まないコピーが可能です。
Vbprojectは、サイトの検索で取得した知識として他に活用場所もあるかと
思います。
検討してみて下さい。
|
|