[[20100309114415]] 『シートに配置されたチェックBOXの削除について』(まき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シートに配置されたチェック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

Jaka 様

敏速なご連絡有り難うございました。過去の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)

Jaka様、 sasa様

レス頂き有り難うございました。両名様の方法で削除確認が出来ました。

 現時点で数千程のチェック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.