VBA(エクセル)で、


①ボタンを配置する
②そのボタンを押すと(そのシートの)マクロも含めてシートごとコピーする
③コピーするシート名は任意文字列+実行した日付(yyyymmdd)
 ※同名シートの存在確認があれば尚良い

にはどうすれば良いですか?
①+②のみ、③のみの回答でも構いません。
両方回答いただいた時点でクローズさせていただきます。
バージョンは、Execl2000以降でお願いします。(大差ないと思いますが)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/11/18 23:24:56
  • 終了:--

回答(4件)

id:nitscape No.1

nitscape回答回数526ベストアンサー獲得回数02005/11/18 23:42:08

ポイント10pt

ボタンの追加は表示メニューのツールバーでフォームを表示します。するとフォームツールバーが現れるので、ボタンを選択して、起きたいところにボタンをドラッグで作成します。

ボタンを作成すると押したときに実行するマクロ名を指定する選択欄が表示されます。ここで実行するマクロを選びます。


マクロは以下のようにします。


Sub Macro1()


strMonth = Month(Now)

strDay = Day(Now)

strDate = Year(Now)

If strMonth < 10 Then strDate = strDate & ”0”

strDate = strDate & strMonth

If strDay < 10 Then strDate = strDate & ”0”

strDate = strDate & strDay


Cells.Select

Selection.Copy

Sheets.Add

ActiveSheet.Paste

ActiveSheet.Name = ”ffff” & strDate

End Sub


ちょっと効率は悪いですが、シートを洗濯して、シートを追加、シートの名前を任意の文字列+yyyymmddに変更します。


...という感じではどうでしょうか?

id:P-mako

なかなか良い感じです。

シートに記述したマクロと、ボタン自身もコピーしたいです。

2005/11/18 23:49:54
id:nitscape No.2

nitscape回答回数526ベストアンサー獲得回数02005/11/18 23:49:42

ポイント10pt

http://www.impress.co.jp/

インプレス グループ

1です。ボタンの配置もVBAで、という意味だったのかもしれませんね。すみません。以下のようなコードでボタンを配置可能です。このばあいは「aaa」というマクロが実行されます。


ActiveSheet.Buttons.Add(171, 220.5, 47.25, 21.75).Select

Selection.OnAction = ”aaa”

id:P-mako

気づいていただけて嬉しいです。(私の説明もはしょりがちなのでマズいのですが・・・)

ようは、OnActionは、ボタンクリック時のハンドラ登録なわけですね。

それで、シートのマクロ自身もコピーしたい場合ってどうすれば良いのでしょう?

あとコピーした(厳密にはコピーではなく追加なので、そこはもう一押し欲しい)ボタンのキャプションは、Buttons.Captionなどのプロパティが存在しますか?

2005/11/18 23:55:44
id:yuki_n No.3

yuki_n回答回数24ベストアンサー獲得回数02005/11/19 01:08:36

ポイント15pt

http://d.hatena.ne.jp/

はてなダイアリー - キーワードでつながる多機能ブログ

URLはダミー


 1.表示→ツールバー→コントロールツールボックスでコントロールツールボックスを出す

 2.ボタンアイコン(コマンドボタン)をクリック

 3.シートの適当な所に貼り付ける

 4.定規にペンのアイコン押下(デザインモード終了)


②③

 1.ツール→マクロ→VisualBasicEditor で VBエディタを起動

 2.左にツリーが出ていると思うので、上記でボタンを追加したシートを選択(ダブルクリック)

 3.右側のエディタ部分の上部に二つドロップダウンリストがあると思うが、

  それの左側のリスト内に上記で貼り付けたボタンがあると思われるので、それを選択する。

  すると、下記のような物が出てくると思う。

Private Sub ボタン名_Click()

End Sub


 4.上記のようになったら、下記のコードを ”Private Sub ボタン名_Click()”と”End Sub”

  の間にコピペする。(一部編集してください。)

Dim MotoSeet

MotoSeet = ”シート名”  < 編集中のシート名

Dim DateStr

DateStr = ”任意文字列” + Format(Date, ”yyyymmdd”)

      ↑コピー後のシート名につけたい任意文字列

Sheets(MotoSeet).Select

Sheets(MotoSeet).Copy After:=Sheets(Sheets.Count)

Sheets(Sheets.Count).Name = DateStr


 5.VBエディタを終了

 6.ボタンを押下してみてください。 m(_ _)m


※同一シートがあれば、エラーとなります。


とりあえず、思いつきです。。

あんまり、使えなさそうなので ポイント要りません。。 (^^;;

id:P-mako

回答ありがとうございます。

ほぼ完璧です。

同一シートがあった場合に、VBでエラーになるのは当然なので、そのエラーをハンドリングするにはどうすれば良いですか?

わかりやすく言うと、同一シート名が存在するかをIf判定し、存在する場合はMsgBoxを出すにはどうすれば良いですか?

2005/11/19 09:53:26
id:yuki_n No.4

yuki_n回答回数24ベストアンサー獲得回数02005/11/19 15:16:58

ポイント35pt

URLはダミー


前回回答したものです。


ソースの部分を下記のように差し替えてください。

一部、仕様が変わっている部分があります。


前回のは、コピー元は固定シートでしたが、

今回のは、ボタンを押した時に表示されているシートをコピー元としています。


Private Sub ボタン名_Click()

Dim MotoSeet

Dim DateStr

MotoSeet = ActiveSheet.Name ’ 現在開かれているシート名を取得

DateStr = ”任意文字列” + Format(Date, ”yyyymmdd”) ’ 作成するシート名


’作成しようとしているシートを選択しようとする。

’選択できる場合は、既にあるというメッセージを表示する

’無い場合(選択できませんというエラー)は、『SeijoSyori』の処理に飛んで

’ボタンを押したシートをコピーし、シート名を変更するという処理を

On Error GoTo SeijoSyori

Sheets(DateStr).Select


MsgBox ”既に、シートが作成されています。”

Exit Sub’ 終了


’シートのコピー、シート名変更 を行います。

SeijoSyori:

Sheets(MotoSeet).Select

Sheets(MotoSeet).Copy After:=Sheets(Sheets.Count)

Sheets(Sheets.Count).Name = DateStr


End Sub

id:P-mako

すばらしいです。動作はこれで完璧です。

なるほど、シート選択できなかったときのエラーをトラップして、正常処理をするんですね。少し特殊な発想ですね。

もう少しストレートに、”シート名”が存在するか?という確認ってVBA(オブジェクト?)では無理なんでしょうか?

・・・と思うのですが、回答としては満たしているので、いったん終了し、別途質問をオープンすることにします。

2005/11/19 15:47:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません