人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBA(エクセル)で、

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

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

●質問者: P-mako
●カテゴリ:コンピュータ
✍キーワード:VBA いただきます エクセル クローズ コピー
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● nitscape
●10ポイント

http://www.google.co.jp/

Google

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

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


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


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に変更します。


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

◎質問者からの返答

なかなか良い感じです。

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


2 ● nitscape
●10ポイント

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

インプレス グループ

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


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

Selection.OnAction = ”aaa”

◎質問者からの返答

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

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

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

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


3 ● yuki_n
●15ポイント

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


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


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

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

◎質問者からの返答

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

ほぼ完璧です。

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

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


4 ● yuki_n
●35ポイント

http://www.yahoo.co.jp/

Yahoo! JAPAN

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

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ