シートをコピーする際に二つのコマンドボタンを一つにする方法

このQ&Aのポイント
  • シートをコピーする際に二つのコマンドボタンを一つにする方法について教えてください。
  • コピーしようとするシートには2つのコマンドボタンがあります。コピーされたシートのコマンドボタン(SheetCopy)は不要ですが、もう一つのコマンドボタン(クリアー)は残したいです。どのように記述すれば良いでしょうか。
  • 参考になるコードとして、コマンドボタン「SheetCopy」に関するマクロの例を掲示します。もう一つのコマンドボタン「クリアー」に関するマクロもあります。コマンドボタン「SheetCopy」をコピーしたシートに残し、「クリアー」ボタンだけを残したい場合、どのように記述すれば良いですか。
回答を見る
  • ベストアンサー

シートをコピーの時二つのコマンドボタン一つのみに

いつもお世話になります。 WINDOWS7 EXCELL2010 です。 コピーしようとするシートには2ヶのコマンドボタンがあります。 2つのコマンドボタンとは下記の 「1 と 2」です。 コピーされたシートのコマンドボタン(SheetCopy)は不必要になり、 下記の 1 に↓の記述を追加したのですが二つのコマンドボタンが削除されました。 ActiveSheet.DrawingObjects.Delete 「2 クリアー」ボタンだけを残すには ↑ どういう具合に記述すればいいかを御指導いただけませんでしょうか。 宜しくお願いいたします。 参考に 1 コマンドボタン名「SheetCopy」 Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする ' 2014/10/12 dorasuke ' Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName ActiveSheet.DrawingObjects.Delete Range("A2").Select End Sub 2 コマンドボタン名「クリアー」 Sub ClearCell() Range("K3:S32").ClearContents End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

No.1です。 >その結果、コピーしたシートには コマンドボタンは削除されました。 >がしかし もとになるシート「元本」にあったコマンドボタン「SheetCopy」まで削除されます。 シート「元本」にあるボタンを削除して、それをコピーした結果ですね コピーしたシートのボタンを削除しましょう Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName Range("A2").Select   Dim myBut As Object   For Each myBut In ActiveSheet.Buttons     If myBut.Caption = "SheetCopy" Then myBut.Delete   Next End Sub

dorasuke
質問者

お礼

早速のご回答をありがとうございました。 試させていただいた結果ものの見事にできました。 今後ともよろしくお願いします。

その他の回答 (2)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。 「フォーム コントロール の ボタン」 と 「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 ' ' ///

dorasuke
質問者

お礼

御回答いただきありがとうございます。 また詳細なご説明には感謝しています。 昨夜遅くまでこのご指導を勉強しました。 これからの参考にさせてい頂きます。 重ね重ねありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

>ActiveSheet.DrawingObjects.Delete ActiveXコントロールのコマンドボタンの Captionが"SheetCopy"のボタンのみ削除 Dim myOLE As OLEObject For Each myOLE In ActiveSheet.OLEObjects   If myOLE.Object.Caption = "SheetCopy" Then myOLE.Delete Next もしフォームコントロールのボタンなら Dim myBut As Object For Each myBut In ActiveSheet.Buttons   If myBut.Caption = "SheetCopy" Then myBut.Delete Next

dorasuke
質問者

補足

早速のご回答ありがとうございます。 「SheetCopy」のコマンドボタンを テキストボックスからフォームコントロールのボタン に作り替え下記のようにマクロを記述しました。 その結果、コピーしたシートには コマンドボタンは削除されました。 がしかし もとになるシート「元本」にあったコマンドボタン「SheetCopy」まで削除されます。 このコマンドボタンはそのままにして残したいのですが 再度ご指導いただけないでしょうか。 Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする ' Dim myBut As Object For Each myBut In ActiveSheet.Buttons If myBut.Caption = "SheetCopy" Then myBut.Delete Next ' Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName Range("A2").Select End Sub

関連するQ&A

  • VBAでコピーした時コピー元のシートをアクティブ等

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記で御指導いただいたばかりです。 http://okwave.jp/qa/q8787962.html 二つ質問があります。 1 「元本」のシートをコピーした時、コピー先がアクティブになります。 これを「元本」シートがいつもアクティブになるようにしたいのですが。 2 添付図のように最初にコピーの作業をした時は上手くゆくのですが二回目以降でこのボタンをクリックすると図のようになります。 もう一度クリックすると作動します。 同作業を繰り返すと同現象が発生します。 誠に恐れ入りますが 「1 と 2」の解決方法を御指導いただけないでしょうか。 参考に Sub SheetCopy() ' ' SheetCopy Macro ' 元本のシートをコピーする Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください") Sheets("元本").Copy After:=Sheets(1) Sheets("元本 (2)").Select Sheets("元本 (2)").Name = NewSheetName Range("A1").Select ActiveCell.FormulaR1C1 = NewSheetName Range("A2").Select Dim myBut As Object For Each myBut In ActiveSheet.Buttons If myBut.Caption = "SheetCopy" Then myBut.Delete Next End Sub

  • VBA シートをコピーした時、同名の場合は注意喚起

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記のマクロで例えば、 「1018」というシートが既に存在していて新たに「1018」を作成しようとした時に重複の注意喚起メッセ―ジを出すには下記のマクロにどうすればいいか御指導いただけませんでしょうか。 注意喚起メッセージは  「既に、同名のシートがあり再度入力して下さい。」 ※If MsgBox("既に、同名の シートがあり再度入力して下さい。") 参考に Private Sub CommandButton1_Click() Dim NewSheetName As String NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で新しいシート名を入力してください。例 0101") Sheets("元本").Copy After:=Sheets("元本") With ActiveSheet .Name = NewSheetName With .Range("A1") .NumberFormatLocal = "0000" .Value = NewSheetName End With .OLEObjects("CommandButton1").Delete .Range("A2").Select End With Sheets("元本").Activate Application.ScreenUpdating = True End Sub

  • コマンドボタンをクリックしても作動せず

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記のマクロで  1 シート「元本」のコピーをコマンドボタンをクリックしても作動しません。    ボタンの所にポメイントを当てても十字に変化して固まった状態なります。  2  K3:S32の範囲で○や△がWクリックしても値を返しません。 このブックの他にはいくつかマクロがありそれらは作動しこの「元本」の下記のマクロ のみ作動しません。 今までは作動していたのですがなぜなんでしょうか。 この不具合をどうすればいいか御指導いただけませんでしょまうか。 参考に Private Sub CommandButton1_Click() Dim NewSheetName As String Dim c As Object Dim MatchFLG As Boolean Do MatchFLG = False NewSheetName = InputBox("一桁の月及び日でも二桁のMMDD形式で4桁の新しいシート名を入力してください。例:1月1日を0101のように") If StrPtr(NewSheetName) = 0 Then MsgBox "キャンセルします", vbInformation Exit Sub ElseIf NewSheetName = "" Then MsgBox "未入力です", vbExclamation Exit Sub End If For Each c In Worksheets If c.Name = NewSheetName Then MatchFLG = True MsgBox ("既に、同名のシートがあり再度入力し直して下さい。"), vbExclamation Exit For End If Next Loop Until MatchFLG = False Sheets("元本").Copy After:=Sheets("元本") With ActiveSheet .Name = NewSheetName With .Range("A1") .NumberFormatLocal = "0000" .Value = NewSheetName End With .OLEObjects("CommandButton1").Delete .Range("A2").Select End With Sheets("元本").Activate Application.ScreenUpdating = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myRange As Range Set myRange = Intersect(Target, Range("K3:S32")) If Not myRange Is Nothing Then Select Case Target.Value Case "" Target.Value = "○" Case "○" Target.Value = "△" Case Else Target.ClearContents End Select Cancel = True End If End Sub

  • VBAでコマンドボタン操作で他のシートにコピーする方法を教えてください。

    エクセルのVBAでコマンドボタン操作でセルの値を他のシートのセルへコピーしたいのですが、やり方がわかりません。 自分なりに作ってみたのですが何が悪いのか教えてください。 Private Sub CommandButton1_Click() ' Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub Private Sub が怪しいのですが対処もわかりません。 ちなみにsheets2のA1には値がはいっています。 よろしくおねがいします。

  • エクセル2007マクロ シート間のセルコピー

    [Sheet1]にあるデータを[Sheet2]にコピーするマクロボタンを[Sheet2]に作りたいのですが、マクロがよく分からないので、「マクロの記録」で作成してみました。 Sub siken() ' ' siken Macro ' ' Sheets("Sheet1").Select Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B3").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B6:D6").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B6").Select ActiveSheet.Paste End Sub (実際はもっと多くのセルをコピーします) マクロを実行すると、ちゃんとコピーできるのですが、セルをコピーする都度[Sheet1]と[Sheet2]が交互に表示されます。 コピー元の[Sheet1]を表示させずにマクロを実行させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • ExcelVBA:ワークシートに付けたコマンドボタンから、セル全体をコピーするコード

    ExcelVBAでワークシートに付けたコマンドボタンを押すと、ワークシートを指定し、コピーするプログラムを作りたいのですが、「実行時エラー'1004':RangeクラスのSelectメソッドが失敗しました。」というようなエラーが出て動きません。 プログラムは以下の通りです。 Private Sub CommandButton1_Click() Sheets("Sheet1").Select Cells.Select Selection.Copy End Sub どのようにすればよいでしょうか? 回答よろしくお願いします。

  • セルをコピーしてシート名を取得 【VBA】

    こんばんわ。 エクセルのVBAについて、どうしてもわからなくなったので質問させて下さい。 マクロの内容は 1.一番前のシート(名前はSheet1ではありません。)のボタン35をクリック 2.シートをコピーして3番目に置く。 3.値にする。 4.シート名をセルの"DE16"に入っている値にする。 5.ボタンを消す。 以下の内容になりましたが、名前のところでデバックがおこります。 Sub ボタン35_Click() Worksheets(1).Select Worksheets(1).Copy After:=Sheets(3) Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Worksheets(3).Select Worksheets(3).Name = Range("DE16").Value ActiveSheet.Shapes("Button 11").Select Selection.Delete Application.CutCopyMode = False End Sub どなたかお知恵を貸して下さい。

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • 違うシートにコピー&ペースト

    EXCEL2000を使っているのですが、以下のような問題で悩んでいます。 sheet1のF7セルにある値をsheet2のC1セルにコピーしたくて、先ずマクロの記録で行ったところ以下のようなコードが出来ました Range("F7").Select Selection.Copy Sheets("Sheet2").Select Range("C1").Select ActiveSheet.Paste 実際出来たマクロの実行をすると問題なく動くのですが、shee1にコマンドボタンを配置してそれに上記のコードを記入すると「Range("C1").Select」の個所で止まってしまいます。 上の問題だけを解決するのでしたら代入式を使って解決できるのですが、実際には上の形を応用したものになるので、コピーしたものを貼り付けるという形式はどうしても取りたいのです。 何か解決方法はあるのでしょうか?宜しくお願いします

  • エクセル マクロ コマンドボタンで行をコピーエラー

    教えてください。 sheet2にコマンドボタンを作成し、コードを下記の通りに入力しました。 ボタンを押すと「RangeクラスのSelectメソッドが失敗しました。」とエラー表示され デバックを見るとRows("1:1").Selectが原因みたいですが、どのように手直ししたら いいか教えて頂けないでしょうか。 Private Sub CommandButton1_Click() Sheets("Sheet1").Select Rows("1:1").Select Selection.Copy Sheets("Sheet2").Select Rows("20:20").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

専門家に質問してみよう