エクセルの学校


[[20121005110722]] 『シートの自動作成で・・・』(みほ) >>BOT

[ 初めての方へ | 一覧(最新更新順) |

|
| 全文検索 | 過去ログ | HOME ]

 

『シートの自動作成で・・・』(みほ)

エクセル2003を使っています。
また、わからない事がでてきましたので教えてください。

シート作成ボタンをシートに作り ユーザーフォームで翌月のシートを作成しています。

シート作成し シート名を翌月にするのまではできたのですが
前月のデータが残ったままになってしまいます。

シートの「平成24年○月」と表示されるF2部分は変更されています。

前月のデータをクリアにして翌月のシートを作るのには
どのようにすればいいのでしょうか?

以下、コードです。

標準モジュールに

Sub hannbai_Click()

    ActiveSheet.Copy After:=ActiveSheet

    UserForm4.Show

End Sub

ユーザーフォームに

Private Sub CommandButton1_Click()

    ActiveSheet.Range("F2") = TextBox1.Value

    ActiveSheet.Name = Format(Date, "ggge年m月")

    Unload UserForm4

End Sub

Private Sub CommandButton2_Click()

    ActiveSheet.Delete

    Unload UserForm4

End Sub

Private Sub UserForm_Initialize()

    TextBox1.Value = Format(Date, "ggge年m月")

End Sub

よろしくお願いします。


 前月のデータをクリアにしたい、そのクリアにする場所はどことどこ?
 それとも、F2 以外をすべてクリアにしていいの?

 それと、CommandButton2 だけど、これは、作ったけど、や〜めた 消しちゃおう というボタンだね。

 あと、もし、ある月のシートができたとする。で、また処理をすると、同じシート名が作られようとして
 エラーになるね。作成すべきシート名有無を事前にチェックしたほうがいいかな?

 (ぶらっと)


 これが解れば何とかなりそうですね。
 翌月
 MsgBox Format(DateAdd("m", 1, Date), "ggge年m月")

 先月
 MsgBox Format(DateAdd("m", -1, Date), "ggge年m月")
 BJ

ぶらっとさん BJさんありがとうございます。

ぶらっとさん

クリアにしたい部分は A14:L23,B26:K47,I11:J12,L11:L12のセルになります。

いろいろ調べていて
下記のコードに変更したところ クリアしてシート作成が出来たのですが・・・
大丈夫でしょうか?

Sub hannbai_Click()

    ActiveSheet.Copy After:=ActiveSheet

    UserForm4.Show

  クリア

    ActiveSheet.Range("A1").Select

End Sub

Sub クリア()

    ActiveSheet.Range("A14:L23,B26:K47,I11:J12,L11:L12").Select
    Selection.ClearContents

End Sub

ユーザーフォームは先ほどのままです。

それと、CommandButton2 だけど、これは、作ったけど、や〜めた 消しちゃおう というボタンだね。

そうです。

あと、もし、ある月のシートができたとする。で、また処理をすると、同じシート名が作られようとして エラーになるね。作成すべきシート名有無を事前にチェックしたほうがいいかな?

同じ月に再度シート作成を押してしまうと 平成24年○月(2)というようにシートが
作成されてしまいます。
これも作成できなくする方法ってあるのでしょうか?

お手数おかけします。
よろしくお願いします。

BJさん、すみません。
調べてみたのですが・・・ よくわかりませんでした。


 >    ActiveSheet.Range("A14:L23,B26:K47,I11:J12,L11:L12").Select
 >    Selection.ClearContents

 うん。これでもいいね。ActiveSheetなのでシート修飾はなくてもいいかな?
 でSelect/Selection はやめよう。

 Range("A14:L23,B26:K47,I11:J12,L11:L12").ClearContents

 この1行でいいね。

 >同じ月に再度シート作成を押してしまうと 平成24年○月(2)というようにシートが 
 >作成されてしまいます。 
 >これも作成できなくする方法ってあるのでしょうか? 

 その前に。
 この処理は、標準モジュールがわのボタンを押したときに
 
 ActiveSheet.Copy After:=ActiveSheet

 これで、とにかくシートを作ってしまうね。1回目であろうと2回目であろうと
 その時Activeだったシートのシート名(2) となるのはエクセルの仕様。
 このタイミングでシートを作るのがだめとはいわないけど、ここでは UserForm4を表示させるだけにして
 Private Sub CommandButton1_Click() 
 ここでシートを作成したらどうかな?そうしておくと、や〜めたというCommandButton2も不要になるよね。
 シートはまだ作られていないんだから。

 気になるのは

 >シートの「平成24年○月」と表示されるF2部分は変更されています。 

 F2 は
 ActiveSheet.Range("F2") = TextBox1.Value

 そうすると、シート名にすべき月は TextBox1 に入力するのでは?
 だけど、実際にシート名としてセットしようとしているのは

 ActiveSheet.Name = Format(Date, "ggge年m月")

 Date というのは、今日の日付。TextBox1の値は全く無視されているけど、それでいいの?

 この回答をもらえれば、シート名重複の回避のコードをアップすることができる。

 (ぶらっと)

ぶらっとさん、ありがとうございます。

ユーザーフォームのTextBox1には シートにあるシート作成ボタンを押して
ユーザーフォームを呼び出した時点で 今月だったら平成24年10月と入力されています。

Private Sub UserForm_Initialize()

    TextBox1.Value = Format(Date, "ggge年m月")

End Sub

このコードそうなるのだと思ってました。

で、シート名変更で TextBox1の値をだして変更したかったのですが
うまくいかなかったので 
ActiveSheet.Name = Format(Date, "ggge年m月") のコードを出したところ
シート名の変更もできたので それでいいのかな・・・と。

再度 コード書いておきます。

標準モジュール
Sub hannbai_Click()

    ActiveSheet.Copy After:=ActiveSheet

    UserForm4.Show

    クリア

    ActiveSheet.Range("A1").Select

End Sub

Sub クリア()

   Range("A14:L23,B26:K47,I11:J12,L11:L12").ClearContents

End Sub

Private Sub CommandButton1_Click()

    ActiveSheet.Range("F2") = TextBox1.Value

    ActiveSheet.Name = Format(Date, "ggge年m月")

    Unload UserForm4

End Sub

Private Sub CommandButton2_Click()

    ActiveSheet.Delete

    Unload UserForm4

End Sub

Private Sub UserForm_Initialize()

    TextBox1.Value = Format(Date, "ggge年m月")

End Sub

お手数おかけします。
よろしくお願いします。


 こんな構えではどうだろう。

 標準モジュール

 Sub hannbai_Click()

    UserForm4.Show

 End Sub

 ユーザーフォームモジュール

 Private Sub UserForm_Initialize()

    TextBox1.Value = Format(DateAdd("m", 1, Date), "ggge年m月")

 End Sub

 Private Sub CommandButton1_Click()
    Dim shn As String

    shn = TextBox1.Value
    If Len(shn) = 0 Then
        MsgBox "新規に作成するシート名を入力してください"
        Exit Sub
    End If

    If IsObject(Evaluate("'" & shn & "'!A1")) Then
        MsgBox "シート:" & shn & "が既に存在します"
        Exit Sub
    End If

    '現在のアクティブシートをその直後にコピー
    ActiveSheet.Copy After:=ActiveSheet

    '以下は新規に作成されたシートに対する処理
    ActiveSheet.Name = shn
    Range("F2") = TextBox1.Value
    Range("A14:L23,B26:K47,I11:J12,L11:L12").ClearContents

    Unload Me

 End Sub

 Private Sub CommandButton2_Click()
    Unload Me
 End Sub

 (ぶらっと)

ぶらっとさん ありがとうございます。

シートがタブって作成される事もなくなりました。

とても勉強になります。

本当にありがとうございます。


解決したようですが、気になったこと。

みほさんの運用では既存(新規シート)のシートを新しい月の分として
コピーを作成しているようですが、この使い方だと常に一番使い込んだ
シートをコピーしていくため、ファイル容量の肥大化が気になります。

一度新規シートから作成したシートをSheetテンプレートとして作成して
おいて、それを挿入する方法をお勧めします。

【シートのテンプレート作成】
[[20060227142045]] 『シートの範囲の設定』(ひろ)
 
【シートテンプレートの挿入】
最後のMookさんのコメントにサンプルがあります。
[[20110127142226]] 『コピーして貼り付け時にセル範囲の名前も保持したい』

(みやほりん)


コメント:

[ 一覧(最新更新順) |

]


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