質問: newsheetname activesheet.drawingobjects.delete range("a2").select end sub 2 コマンドボタン名「クリアー」 sub clearcell() range("k3:s32").clearcontents end sub
回答: こんにちは。 「フォーム コントロール の ボタン」 と 「activex コントロール の コマンドボタン」 の区別や用語の使い分けが曖昧になっているようですから、 その点を、まず、ご自分で確かなものにするようにしてください。 excel2010では、「フォーム コントロール の ボタン」のことを 「コマンドボタン」と呼ぶことはありません。 お使いのコントロールは、ボタンなのか、コマンドボタンなのか、 ハッキリと確認するようにしてください。 プロシージャの名前だけ見ると、 「フォーム コントロール の ボタン」だと判断するべきなのでしょう。 「activex コントロール の コマンドボタン」ならば private sub sheetcopy_click() または private sub commandbutton1_click() というようなプロシージャになりますから。 削除するべきコントロールの「名前=オブジェクト名」を把握しましょう。 > コマンドボタン名「sheetcopy」 ボタンに表示されている文字列=captionが、 ボタンの名前=nameと一致するとは限りませんが、 ご自分で、sheetcopyと名前を変更する手順を踏んでいますか? コントロール挿入後の初期状態では、 「フォーム コントロール の ボタン」なら、button 1 「activex コントロール の コマンドボタン」なら、commandbutton1 という形式の名前が割り当てられます。 ボタンに表示される文字列を変更しても名前は変更されません。 captionとnameの違いを確認してください。 以下は、それらを確認する為だけのマクロです。 (メッセージを表示するだけで何も処理しません (シート名だけは正しく指定してください) ' ' /// sub chckbuttons() dim o as object dim s as string for each o in worksheets("元本").drawingobjects select case typename(o) case "oleobject" if typename(o.object) = "commandbutton" then s = s & vblf & "オブジェクト名:" & o.name s = s & vblf & vbtab & "タイプ:activex コントロール/" & typename(o) & "/" & typename(o.object) s = s & vblf & vbtab & "表示文字列:""" & o.object.caption & """" end if case "button" s = s & vblf & "オブジェクト名:" & o.name s = s & vblf & vbtab & "タイプ:フォーム コントロール/" & typename(o) s = s & vblf & vbtab & "表示文字列:""" & o.caption & """" end select next msgbox s debug.? s end sub ' ' /// inputboxに例えば、"0101"と入力されたとして、 セルにも"0101"と表示させたい場合は、 そのままでは、101 という数値を設定するだけになってしまいますから、 うまくいきません。 書式の表示形式を"0000"のように変更してあげる必要があります。 シートのコピーが済んだ後の処理対象は、すべて コピー後のシートに限定されているようですから、 「コピー後のシートの」という意味が明確になるような書き方を するようにしましょう。 セル範囲を捉えるのにも、「コピー後のシートの」「セル範囲」という 書き方をしないと失敗の元です。 「sheetcopy」に関連付けられているボタンまたはコマンドボタン の削除方法を4通り書きました。 ボタン、コマンドボタンそれぞれ2通りずつです。 どちらでも構いませんが、普通は 「フォーム コントロール」「activex コントロール」の違いを 読む人にも判るように★2または★4のような書き方をします。 上にあげたマクロを実行すれば、削除したいコントロールの名前が 判りますから、その名前を""ダブルクオートで括った文字列値を ' .buttons("button 1").delete ' ★2/四者択一 ' .oleobjects("commandbutton1").delete ' ★4/四者択一 のどちらかの括弧の中を書き換えてください。 コメントブロックの解除は、4つの内ひとつだけにして、 動作を確認出来たら要らない記述は削除して下さい。 オブジェクトの参照の仕方ですが、 collection(index) というのが基本的な書式として説明されることが多いですが、 このインデックスの部分を数字で指定するような方法は、 避けた方がいい場合が多いです。 例えば、sheets(1)のような参照は、シートを並べ替えただけで、 期待とは違うオブジェクトを返してしまうからです。 collection(name) こういう書式で説明されることはまずありませんが、 sheets("元本").buttons("button 1").delete sheets("元本").drawingobjects("commandbutton1").delete のように書いた方が確実性が増すとともに、 見てすぐ解るようになります。 以下のサンプルでは、with フレーズを使ってオブジェクトをブロック化して、 オブジェクトの参照を無駄に繰り返さず、且確実にするような書き方をしています。 ' ' /// '1 「sheetcopy」 sub sheetcopy() ' dim newsheetname as string newsheetname = inputbox("一桁の月及び日でも二桁のmmdd形式で新しいシート名を入力してください") sheets("元本").copy after:=sheets("元本") with activesheet .name = newsheetname with .range("a1") .numberformatlocal = "0000" .value = newsheetname end with ' ' --------------------------------------------------------------------------- ' ' フォーム コントロール の ボタン の場合 ' .drawingobjects("button 1").delete ' ★1/四者択一 ' .buttons("button 1").delete ' ★2/四者択一 ' ' activex コントロール の コマンドボタン の場合 ' .drawingobjects("commandbutton1").delete ' ★3/四者択一 ' .oleobjects("commandbutton1").delete ' ★4/四者択一 ' ' --------------------------------------------------------------------------- .range("a2").select ' 必要? end with end sub ' ' ///