Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8.1 Pro : Excel 2007)
コマンドボタンを削除したい
投稿日時: 21/07/12 17:21:55
投稿者: FILETUBE

こんばんは。
一つ教えて下さい。
 
下記はワークシートを別のブックにコピーする処理のコードですが
コマンドボタンがある為、コマンドボタンもコピーされてしまいます。
 
 Dim thisws As Worksheet
 Set thisws = ThisWorkbook.Worksheets(1)
 
 Dim bkname As String
 thisws.Copy
 bkname = "C:\test\check" & Format(Now(), "yyyy-mm-dd-hh-mm") & ".xlsx"
 ActiveWorkbook.SaveAs Filename:=bkname
 
コマンドボタンはコピーしても削除したいのですが
どのようにするとよいのでしょうか?
 
分かる方おられましたら、宜しくお願いします。

回答
投稿日時: 21/07/12 17:43:09
投稿者: WinArrow
投稿者のウェブサイトに移動

コマンドボタンは、
フォームコントロールのボタンと
ActiveXのコマンドボタンの
2つあります。
 
各々のを区別して、削除する方法と
区別せずに削除する方法があります。
 
シートに図形(含む、コマンドボタン)が、1つの場合
(1)
    ActiveSheet.Shapes(1).Delete
フォームコントロールのボタンの場合
(2)
    ActiveSheet.Buttons(1).Delete
 
複数存在する場合は、ユニークな名前をつければよいでしょう。
 
 

回答
投稿日時: 21/07/12 18:51:12
投稿者: simple

別の方法を紹介しておきます。
 
コピーする前に、それらを一時的に非表示にしておくと、コピーの対象にならないようです。
元に戻すのですから、すべてのShapeを一時的に非表示にすればよいでしょう。
非表示とその後の表示への復旧には、
「検索と選択」ー「オブジェクトの選択と表示」にある、「すべて非表示」「すべて表示」を
使うと良いでしょう。
 
余談:
その動作をマクロ記録して驚いたが、For .. Next構文を使って記録されるんですね。
珍しいものを見た気がします。残念ながら、ループカウンタ変数 i の変数宣言がされませんが。

投稿日時: 21/07/12 20:16:29
投稿者: FILETUBE

 回答ありがとうございます。
 
ActiveSheet.Buttons(1).Delete
ActiveSheet.Shapes(1).Delete
 
両方ボタンは消えますが、アクティブが新しく保存する方に移ってしまうので
新しく保存するブックは何も表示せず、同名があれば上書き保存したいのですが
可能でしょうか?

投稿日時: 21/07/12 20:27:01
投稿者: FILETUBE

 説明不足ですいません。
 
画面上は新しく保存する画面を表示させるのではなく
元のボタンのある画面に戻して表示させたいのです。
 

回答
投稿日時: 21/07/12 21:02:46
投稿者: WinArrow
投稿者のウェブサイトに移動

削除する命令を
>ActiveWorkbook.SaveAs Filename:=bkname
の前に記述すればよいと思います。

投稿日時: 21/07/12 21:28:12
投稿者: FILETUBE

回答ありがとうございます。
 
  Dim thisws As Worksheet
    Set thisws = ThisWorkbook.Worksheets(1)
 
    Dim bkname As String
    thisws.Copy
    bkname = "C:\test\check" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".xlsx"
    ActiveSheet.Buttons(1).Delete
    ActiveWorkbook.SaveAs Filename:=bkname
 
としましたが、表示は新しく保存するBookになります。
新しく保存するBookは確認なしで保存し
元のBookを表示するようにしたいのです。
 

回答
投稿日時: 21/07/12 22:03:46
投稿者: WinArrow
投稿者のウェブサイトに移動

> ActiveSheet.Buttons(1).Delete
 

 
Activeworkbook.Sheets(1).Buttons(1).Delete
 
に修正してみてください。

投稿日時: 21/07/12 22:50:36
投稿者: FILETUBE

 何度も回答ありがとうございます。
 
   Dim thisws As Worksheet
    Set thisws = ThisWorkbook.Worksheets(1)
 
    Dim bkname As String
    thisws.Copy
    bkname = "C:\test\check" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".xlsx"
    ActiveWorkbook.Sheets(1).Buttons(1).Delete
    ActiveWorkbook.SaveAs Filename:=bkname
 
と修正しましたが、アクティブなシートはcheck****.xlsxになってしまいます。
 
何回もすいません。

回答
投稿日時: 21/07/13 07:51:30
投稿者: WinArrow
投稿者のウェブサイトに移動

状況がよく理解できません。
  
説明上
マクロが記述されているブックを「自ブック」といいます。
ジブックのシート(1)を複写して新しく作成するブックを「新ブック」といいます。
  
まず
> thisws.Copy
このコードは、自ブックの指定したシートをクリップボードを経由して、
新しいブック(Book2のような名前)が生成する命令です。
新しいブックのシート名は、元シートと同じになります。
このコード実行後の「Activeworkbook」は「新ブック」となり、
「Activesheet」も新ブックの1番目のシートとなります。
  
以上のことから
>アクティブなシートはcheck****.xlsxになってしまいます。
になることは考えにくいです。
掲示コードの中にもシート名を変更しているところはありませんので
若しかしたら、元シート名でしょうか?
 
具体的な状況説明をお願いしたいですね・・・

投稿日時: 21/07/13 09:26:01
投稿者: FILETUBE

説明が分かりにくくて申し訳ありません。
 
自ブックのコマンドボタンをクリックすると
自ブックの内容(シート)を新しいブック(check+日付)にコピーして
保存する処理になります。
 
自ブックをクリックすると、コマンドボタンが消えた新しいブックが表示されてしまい
×で閉じると元の自ブックが表示します。
 
処理自体はOKなのですが、新しいブックを表示させなくて保存したいのです。
 
 

投稿日時: 21/07/13 09:40:13
投稿者: FILETUBE

 皆さま回答ありがとうございました。
 おかげさまで何とか ActiveWorkbook.Closeを追加して
 完成しました。
 
 
   Dim thisws As Worksheet
   Set thisws = ThisWorkbook.Worksheets(1)
 
   Dim bkname As String
     thisws.Copy
     bkname = "C:\test\check" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".xlsx"
     ActiveWorkbook.Sheets(1).Buttons(1).Delete
     ActiveWorkbook.SaveAs Filename:=bkname
     ActiveWorkbook.Close
 
また宜しくお願いします。