プロが教えるわが家の防犯対策術!

マクロで使用済みのボタンを削除したいと考えています。

毎回ボタンの数が同じ場合は作れたのですが、
ボタンの数が場合によって異なります。

具体的にはD5セルより下にあるボタンを削除したいと考えています。

ボタンを作る時のマクロは
Set ws1 = Workbooks("ブックA").Worksheets("Sheet1")
Set ws2 = Workbooks("ブックB").Worksheets("Sheet1")
i = 2
j = 5
Do Until ws1.Range("B" & i) = ""
ws2.Range("D" & j).Value = ws1.Range("B" & i).Value
With ActiveSheet.Buttons.Add(Cells(j, 4).Left + 1, Cells(j, 4).Top + 1, _
Cells(j, 4).Width - 1, Cells(j, 4).Height - 1)
.Name = "いの" & i - 1
.OnAction = "Select"
.Characters.Text = Range("D" & j)
End With
i = i + 1
j = j + 1
Loop
といった感じで、ブックAのB列のデータ数だけ、
ブックBのD5から下に値をコピーし、
その上にセルサイズに合わせてボタンを作り、
Nameを上から順に「いの1」「いの2」・・・、表示はボタンの裏に隠れている値をつけ、
ボタンにマクロ「あいうえお」を登録します。


次にボタンをクリックしたときに、
上の工程で作られたボタンを削除したいと考えています。
a = 1
Do Until ActiveSheet.Shapes("Order" & a) = ""
ActiveSheet.Shapes("Order" & a).Delete
a = a + 1
Loop
b = 5
Do Until Range("D" & b) = ""
Range("D" & b).ClearContents
b = b + 1
Loop
Call あいうえお
End Sub

ボタン裏のセルは削除できたのですが、
肝心のボタンの削除は出来ませんでした。

どなたかご教授していただければ大変助かります。
宜しくお願いします。

A 回答 (5件)

いのXX番を総じて削り落としてしまって良いなら



 dim s as shape
 for each s in activesheet.shapes
  if s.name like "いの*" then
   s.delete
  end if
 next

と言った具合です。


#そのためにわざわざボタン追加時に名前を付けるようにしておいたのですから。
    • good
    • 0
この回答へのお礼

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

仰るとおり削除するために連番で名前を付けました。

タッチの差で完成してしまいましたが、
そちらの方が汎用性があってよさそうです。

Eachは使った事も無く発想出来ませんでした。
ありがとうございました!

お礼日時:2011/04/20 21:42

セルの数にあわせてボタンを動的に作成する数を決めたいのか。


であればフォームのInicializeイベント(この場合はブックのオープンイベント?)にボタンをADDする回数を
d=sh1.Range("A64436").End(xlUp).Rowのようにとって必要ボタンの数を計算する。使うセルが1行おきなら、それなりに数の計算をする。
その数だけFor NextでAddを繰り返せば良いのでは?
質問の表現がくどくて、誤って解しているかもしれない。
質問者は、文章ですっきり内容を表現する訓練、セルとコントロールの状態を図示する勉強もしてください。
====
話は関連して
ワークシートにコマンドボタンを複数貼り付けてあるとして、貼り付けたCommndButton1(最初に貼り付けた場合)だけを
削除するのは
Sub test01()
'Worksheets("Sheet1").CommandButton1.Visible = True
Worksheets("Sheet1").Shapes.Item(1).Delete
End Sub
で削除できるようだ。
別に、削除せず、Visible=Falseにしておく手もあろうかと思う。
    • good
    • 0
この回答へのお礼

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

すっきりさせ過ぎると情報が足りないし。。。と思いくどくなってしまったようです。

表示/非表示に関しましてはNo2さんのお礼に書いたとおりで、
ボタンがいくつ必要になるか分かりません。

後に下に関連情報をコピーする工程になりますので
邪魔になってしまいます。

ありがとうございました。

お礼日時:2011/04/20 21:21

「コマンドボタン 削除」で検索したら、出てきました。


アクティブ・シートにある複数のコマンドボタンを見付けて、削除してくます。

Dim obj As OLEObject
For Each obj In ActiveSheet.OLEObjects
If TypeOf obj.Object Is MSForms.CommandButton Then
obj.Delete
End If
Next

参考URL:http://www.excel.studio-kazu.jp/kw/2009031810485 …
    • good
    • 0
この回答へのお礼

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

そのページは以前見ましたが、
アクティブシート上にあるコマンドボタンを全て一気に削除するようです。

同じシートには削除したくないボタンもありますので今回は使えませんでした。
ですが、編集中は今も使っています。

ありがとうございました。

お礼日時:2011/04/20 21:23

>次にボタンをクリックしたときに、


>上の工程で作られたボタンを削除したい

ここで言ってる「ボタンをクリックしたときに」とは,
1)「ボタン全部削除ボタン」が別にあるのをクリックすると,ボタンを一斉に削除したい,なのか
2)最初のマクロでずらり並べたボタンからどれか1個クリックすると,そのクリックしたボタンを消していく,なのか
どういう状況ですか。

ご相談分後半で掲示されたマクロの動作を追ってみると,どうやら1)のようにも思えますが,それならばactivesheet.shapes("いの"xx番)を順番にdeleteしていけばOKです。

この回答への補足

お蔭様で無事に解決しました!

ポカミスばかりでてこずりましたが、
以下のコードがで問題なさそうです。

Dim a As Long
For a = 1 To Range("D" & Rows.Count).End(xlUp).row - 4 ActiveSheet.Shapes("Order" & a).Cut
Next

回答いただいた皆様ありがとうございました!

補足日時:2011/04/20 21:30
    • good
    • 0
この回答へのお礼

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

イメージ的には1)と2)を合せたものです。
クリックするとマクロでD列の5行目から下に並んだボタンを一斉に削除する感じです。

ですが、何かヒントをもらった気がします。
ありがとうございました。

お礼日時:2011/04/20 20:35

通常ボタンは、「削除するのではなく、表示しないようにする」「作るのではなく、非表示のものを表示させるようにする」というやり方で動作させる・・・と思うんですが。

ちなみに非表示のボタンは押せなかった筈です。

で、表示/非表示ですが、.Visible = True / False というだけの話だった筈です。

動作チェックして無いので、その辺はお許しを。

この回答への補足

質問欄に間違いがありました。
この場をお借りして訂正いたします。

質問欄の上のコードでは、
「.OnAction = "Select"」
と、書いていますが、中盤に
「ボタンにマクロ「あいうえお」を登録します。」
とあります。
正確には
「ボタンにマクロ「Select」を登録します。」
です。

宜しくお願いいたします。

補足日時:2011/04/20 17:08
    • good
    • 0
この回答へのお礼

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

今回の場合は、ボタンが何個必要になるか解らないため、
作るようにしています。
2個の場合もあれば、10個、20個必要な場合も考えられます。
今試しているものは12個必要です。


しかし、他の場所では使えるかもしれません。
ありがとうございました。

お礼日時:2011/04/20 17:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!