[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シートに配置されたチェックBOXの削除について』(まき)
Excel2003、Vista
いつも色々参考にさせて頂いております。
過去の質問にありました https://www.excel.studio-kazu.jp/kw/20040204171945.html を参考に、
シートに配置したチェックBOX(数は最大で1万個)を、シートを開く度に一度削除した
いと思います。チェックBOXの名前はbox数字(1〜対象数まで)で配置しております。しか
し、期の替わりだと必ずしもこのシートに有ると限りません。現在下記の通り試しました
が、うまく出来ませんでしたので、修正方法をご伝授願います。
case1 '配置しているボタンまで削除されてしまう ActiveSheet.Shapes.SelectAll
case2 '配置されている数が分からないので、数以上になるとエラー、checkboxが無いとエラー i = 1 Do Until i = 65536 ActiveSheet.Shapes("box" & i).Select i = i + 1 Loop
case3 '削除されない ActiveSheet.Shapes("box*").SelectAll
case4 '削除されない For Each sh In ActiveSheet.Shapes If TypeName(sh) = "box" Then sh.Delete Next
お忙しい所申し訳ございませんが、ご指導の程お願い申し上げます。
1万個ですか....。 シートが重くなりませんか?? 数が多いのは、ichinoseさんが得意そうですけど.....。 なんせ数百万だっけか作らせたことがあるみたいですから。 自動連番のリミット調べるのに。 因みに一括で削除すると、フリーズするとか昔聞いたことがあるので、 やっぱり、ループ? とりあえず、こんな感じのことでしょうか? (Jaka)
MsgBox ActiveSheet.CheckBoxes.Count
For Each Shp In ActiveSheet.CheckBoxes
Next
敏速なご連絡有り難うございました。過去のlogの中でチェックBOXが多いと重いとの事が有りました
が、この3月で9000行になっているので。。。デバッグは10行位なので全然問題有りません。
(重くなる様だったら、4半期毎にbackupを取り数を減らします。)
さてJaka様のVBAで行った所、数は出てくるのを確認出来ました。そこでこれをベースに、次の通り記述
した所、目的の数のcheckboxを削除する事が出来ました。
'チェックBOXの削除 Dim box数 As Long box数 = ActiveSheet.CheckBoxes.Count If box数 > 0 Then i = 1 Do Until i = box数 + 1 ActiveSheet.Shapes("box" & i).Select Selection.Delete i = i + 1 Loop End If
PS : ActiveSheet.CheckBoxes.SelctionAll --> Selection.Delete で駄目だったのか? 記述し忘れましたが。
一応描画を止めているので、数が増えてきたら遅くなるのかもしれませんが、またその時考えます。
有り難うございました。
(まき)
直接消せます。
Do Until i = box数 + 1 ActiveSheet.Shapes("box" & i).Delete i = i + 1 Loop
もしくは、 Dim Shp As Shape ←この型とエラーになった。 15:02
Dim Shp As Object For Each Shp In ActiveSheet.CheckBoxes Shp.Delete Nex (Jaka)
要するに全てのチェックボックスを消すのなら ↓だけでいいのでは。 ActiveSheet.CheckBoxes.Delete (sasa)
最近のは知らないけど、 因みに一括で削除すると、フリーズするとか昔聞いたことがあるので、 (補足すると、数が多い場合)と書き忘れたけど。 (Jaka)
レス頂き有り難うございました。両名様の方法で削除確認が出来ました。
現時点で数千程のチェックBOXを配置して行っていませんので、一括削除の安定性については?です。 ちなみに消した後、何点かのVBA後に次の様に再度checkboxを配置し直しています。
'セルA欄にチェックBOXを配置する チェック = 3 'row3からチェックBOXをおく Do Until チェック = 最終行 + 2 TT = Range("A" & チェック).Top With ActiveSheet.CheckBoxes.Add(2.75, TT, 24, 16.5) .Characters.Text = "" .Value = xlOff .LinkedCell = "$Z$" & チェック .Display3DShading = False .PrintObject = False .Name = "box" & チェック - 2 End With チェック = チェック + 1 Loop
何か有って(前に作ったVBAで有ったが気が付きにくい)同じ所にCheckBoxを重ね書きしてしまった場合を 考えると(同じ名前のcheckboxが存在してしまうと、loopで消しきれない)、一括消去の方が良いのか? それとも過去に有る事を参考にして、一括消去でない方が良いのか? 悩んでしまいます。
参考になるご意見を聞かせて頂ければ幸いです。
(まき)
>同じ名前のcheckboxが存在してしまうと、loopで消しきれない これで大丈夫だと思います。 Dim Shp As Object For Each Shp In ActiveSheet.CheckBoxes Shp.Delete Nex
>過去に有る事を参考にして、一括消去でない方が良いのか? 検証好きのichinoseさんなら、調べてくれるかもしれないし、 御自分で試しても良いかな?って思います。 一括削除時のエラーは、97全盛、2000の時代に聞いただけなので、自分では試してません。 (Jaka)
2003-SP3にて、検証してみました。
下記コードで、9999個?チェックボックスを作り。 ブック保存後に (作成と削除を3回繰り返してみようと思いましたが、 1回も終わらずに途中でエクセルが落ちたので。)
ActiveSheet.CheckBoxes.Delete を実行。
ブックを閉じて、開いてDelete実行を5回やってみましたが、 すんなり消せました。
と、言うよりチェックボックス作成に時間がかかり過ぎて.....。 図形画像の類の作成に時間がかかることは承知していたけど。 (特に作りっぱなしの場合。) どこかで、何回目かおきでDoeventsかませばよかったのかも?
百万個作ったichinoseさんは、何日かけたのだろう? 作っては、消しの繰り返しだろうけど。 作成中、CPU使用率がひたすら100%でした。(Celeron/2G)
作成だけで、 11:49:08に始めて、12:47:33に終わりました。
因みにブックサイズが、2.69Mになりました。
Sub aチェックatete() Dim チェック As Long, 最終行 As Long
Cells.RowHeight = 15 Cells(1).Value = Now() Application.Calculation = xlManual
最終行 = 10000
チェック = 3 'row3からチェックBOXをおく Do Until チェック = 最終行 + 2 TT = Range("A" & チェック).Top With ActiveSheet.CheckBoxes.Add(2.75, TT, 24, 16.5) .Characters.Text = "" .Value = xlOff .LinkedCell = "$Z$" & チェック .Display3DShading = False .PrintObject = False .Name = "box" & チェック - 2 End With チェック = チェック + 1 Loop
Application.Calculation = xlAutomatic Cells(2).Value = Now() End Sub
発見。
Sub チェックatete() Dim チェック As Long とやったら、エラーになった。 (Jaka)
> 数が多いのは、ichinoseさんが得意そうですけど.....。 >なんせ数百万だっけか作らせたことがあるみたいですから。 >自動連番のリミット調べるのに。
何のこと言ってるのか わからなかった。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=5693;id=excel
これね!!
>検証好きのichinoseさんなら、調べてくれるかもしれないし、 ふ〜ん、検証好きねえ・・・、
>百万個作ったichinoseさんは、何日かけたのだろう? >作っては、消しの繰り返しだろうけど。
これは、そうです。だって、名前に付けられる番号ですから、作成・削除の繰り返しでも 番号は、増加しますから・・・・。
直接この質問とは、関係ないですが、検証した図形もLineですし・・・。
Sub test() Dim g0 As Long With activesheet For g0 = 1 To 1000000 With .Lines.Add(0, 0, 0, 0) Debug.Print .Name .Delete End With Next End With End Sub
こんなコードでしたよ 時間は、約1時間程度ですよ!!
一万件のチェックボックスの作成・・・、私なら、この数のチェックボックスの作成が本当に必要なのか 再度、仕様の見直しをしますけどねえ・・・。
ichinose@おじゃましました
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.