[[20140901091608]] 『フォ−ムのチェックボックス』(小町) ページの最後に飛ぶ

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

 

『フォ−ムのチェックボックス』(小町)

2003で作成した。
ツ−ルの
フォ−ムのチェックボックスを使っています。
H列H3〜H5000 と J列 H3〜H5000 と M列 M3〜M5000
各部署で確認のため「レ点」をいれています。
サ−バ−経由なので
2003でも少し時間がかかりますが
それほど問題ではありませんでしたが
2010を使っている部署より
保存ができないとの意見が上がりました。

フォ−ムのチェックボックスを削除して使うと問題ないのですが
良い方法はないものでしょうか
宜しくお願いします。

< 使用 Excel:Excel2003、使用 OS:Windows7 >


 15000 のオブジェクトは重そうですね。保存できないというのは、別原因かもしれませんが。

 人が目視で確認するにしては、数が多すぎて用を成さないような気がしますが、集計をしているでしょうか。

 右クリックで、文字の ☐、☑ で代替する案です。
 オブジェクトを全削除して、対象シートのシートモジュールに

 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Count <> 1 Then Exit Sub
    If Intersect(Range("H3:H5000,J3:J5000,M3:M5000"), Target) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    If Target.Value = "" Then
        Target.Value = ChrW(9745)
    Else
        Target.Value = IIf(AscW(Target.Value) = 9745, ChrW(9744), ChrW(9745))
    End If
    Cancel = True
    Application.EnableEvents = True
 End Sub

  集計する場合は
 =COUNTIF(H3:H5000,"☑")
 等で集計できると思います。
(Mook) 2014/09/01(月) 09:37

 Mookさんのやり方に賛成!

 全く関係ないんですが・・・
 いつも癖ですべてのセルを選択してセルのクリックとかした時に
 Target.Count
 この部分でいつも「オーバーフロー」になっちゃうんですよね。

 そんなことするの、たぶん自分だけなんでしょうけど、RowとColumnで分けた方がいいのか
 いつも迷います。
    If (Target.Rows.Count <> 1) Or (Target.Columns.Count <> 1) Then Exit Sub

 コーディングするとき、状況によるでしょうが「こう書けば間違いない!」というようなセルイベント
 のエラー処理ありますか?

(稲葉) 2014/09/01(月) 09:51


 2007 以降のファイルだと、確かに全セル選択で Target.Count でエラーでますね。
 対象を単一セルにするなら、ActiveCell で処理してしまうのも手かもしれません。

 >「こう書けば間違いない!」
 というのがあればいいのですけれど、やはり状況によってなのでしょうね。

 私の場合はエラーを出さないためには、どうしても制限を多くしてしまいます。
 データの入力規則で制限したり、編集対象以外はロックをかけてシート保護するなどです。

(Mook) 2014/09/01(月) 10:25


Mook様
>人が目視で確認するにしては、数が多すぎて用を成さないような気がしますが
一年分なので多くなりました。
上司が各部署の確認をしましたとゆう証拠を残したいとの意見から
以前作ったのでが
2010導入により、各部署からの重たい、保存ができない、保存するのに時間がかかる等の
意見が上がり、教えを お願いいたしました。

めちゃくちゃ軽いです。また、集計の計算式まで追加していただき
ありがとうございました。

稲葉様

If Target.Count <> 1 Then Exit Sub
から
If (Target.Rows.Count <> 1) Or (Target.Columns.Count <> 1) Then Exit Sub
に変えてみたのですが
何にも変わりません。

マクロはど素人な私なので
意図が分からないのですが
よければ教えていただければ
嬉しいのですが

(小町) 2014/09/01(月) 10:40


 Mookさん
 >私の場合はエラーを出さないためには、どうしても制限を多くしてしまいます。
 >データの入力規則で制限したり、編集対象以外はロックをかけてシート保護するなどです。
 やっぱり制限多くするしかないですよね・・・。

 あいつら切り取り大好きで、
 条件付き書式で「○○さんだけ、土曜日が白で月曜日がグレーだよ」とか
 入力規則のリストも「リストで選択出来なくなっちゃった!」とか
 VLOOKUPでリストの値検索させてるのに「123-456出てこないから(ハイフンがダッシュのコードを貼り
 付け)保護解除して品名手でいれちゃった」とか

 勉強しないくせに制限増やすと文句は増えるんですよね。

 愚痴になっちゃいましたが、御回答ありがとうございました。

 小町さん
 2003でしたら何の問題もないですよ。
 Mookさんが先に説明されているとおり、
 2007以降では、     1,048,576×16,384=17,179,869,184セルというとんでもない数値になっちゃいます。
 VBAで扱える値は、Long型(長整数型)で、2,147,483,647までの値を入れることが出来ます。
              2003以前では65,536×256=    16,777,216

 桁を揃えましたが、2007以降は到底入りません。 約8倍の値です。
 対して2003以前は、余裕で入ります。      約1/128の値です。
 ですので、すべてのセルを選択した状態でイベントを発生(右クリック)すると、
 2007では「オーバーフロー」エラーが発生
 2003以前では何の問題もなく処理出来ます。

 ですので「2003形式のブック」を使っているなら問題ないと思います。

 2003もサポートが終わっていますので、いずれ切り替わると思いますが、その時にオーバーフロー
 エラーが出たら思い出してみてください。
(稲葉) 2014/09/01(月) 11:04

 追記
 2010のエラーはこれ??
http://support.microsoft.com/kb/980528/ja

(稲葉) 2014/09/01(月) 11:09


稲葉様
説明ありがとうございました。
参考になりました。
If Target.Count <> 1 Then Exit Sub

If (Target.Rows.Count <> 1) Or (Target.Columns.Count <> 1) Then Exit Sub
どちらも
2010で検証したところ
問題はありませんでした。

(小町) 2014/09/01(月) 11:20


 問題の検証をするのであれば、2007 以降の EXCEL で xlsm 拡張子になるよう保存し、
 全セル選択(Ctl+A)してからクリックすると、Target.Count のほうではエラー表示が
 確認できると思います。

 >上司が各部署の確認をしましたとゆう証拠を残したいとの意見から 
 という目的であれば、誰がいつチェックしたという履歴は必要ないでしょうか。
 改ざんや証拠の保全性という観点からは、定期的なバックアップもしたほうがよいと
 思いますが、マクロで履歴を残すような対策もあります。

 コードを下記に変更し、LOG という名前のシートを追加します(非表示にしてもかまいません)。
 こうすることで、LOGシートを見れば、誰(PCのユーザ名とホスト名)がいつどういう
 操作をしたかが確認できます。

 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Intersect(Range("H3:H5000,J3:J5000,M3:M5000"), ActiveCell) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    If ActiveCell.Value = "" Then
        ActiveCell.Value = ChrW(9745)
    ElseIf AscW(ActiveCell.Value) = 9745 Then
        ActiveCell.Value = ChrW(9744)
    Else
        ActiveCell.Value = ChrW(9745)
    End If
    チェック記録 ActiveCell.Value
    Cancel = True
    Application.EnableEvents = True
 End Sub

 Sub チェック記録(更新値 As String)
    Dim objNW
    Set objNW = CreateObject("WScript.Network")
    With Worksheets("LOG")
        For c = 1 To Columns.Count Step 5
            If .Cells(.Rows.Count, c).Value = "" Then Exit For
        Next
        If .Cells(1, c).Value = "" Then r = 1 Else r = .Cells(Rows.Count, c).End(xlUp).Row + 1

        .Cells(r, c).Value = Now  '// 現在の時間
        .Cells(r, c + 1).Value = 更新値  '// 変更した値
        .Cells(r, c + 2).Value = objNW.UserName  '// ログオンユーザ名
        .Cells(r, c + 3).Value = objNW.ComputerName  '// PCのホスト名
    End With
    Set objNW = Nothing
 End Sub

(Mook) 2014/09/01(月) 13:02


Mook様
LOGシートの件
ありがとうございます。

xlsm 拡張子になるよう保存し、閉じました。
立ち上げて
全セル選択(必要なセル)してからクリックしましたが選んだセルが白くなるたけで
よくわからないのですが
また
>Target.Count のほうではエラー表示が
確認できると思います。
これもわからないです。

勉強不足で申し訳ありません。

(小町) 2014/09/02(火) 11:32


 > 全セル選択(必要なセル)
Mookさんの言う「全セル選択」とは、「A1:XFD1048576」のセル範囲のことです。

 気になって色々調べていたら以下の様なページにたどり着きました。

 Range.CountLarge プロパティ (Excel)
http://msdn.microsoft.com/ja-jp/library/office/ff196838%28v=office.15%29.aspx

CountLarge プロパティは、機能的に Count プロパティと同じです。ただし、Count プロパティでは、指定された範囲に 2,147,483,647 を超えるセル (2048 列未満) が存在するとオーバーフロー エラーが発生します。CountLarge プロパティでは、ワークシートの最大サイズ (17,179,869,184 セル) までの範囲を処理できます。

参考まで

(ご近所PG) 2014/09/02(火) 16:48


 ほぉ、そんなのができたんですね。
 互換性が気になりますが(2013以降だけかな)、覚えておくと良さそうです。

 参考になりました。
(Mook) 2014/09/02(火) 17:13

 上記ページによれば
 > 追加バージョン: Excel 2007
とあるので、行列が拡張されたときからあったようです。
私も今日まで知りませんでした。
(ご近所PG) 2014/09/02(火) 17:45

 ご近所PGさん
 そんなプロパティあったんですね!
 ご参考にさせてもらいます。
 別スレで私が犯したミスで、コンパイル時にエラーにならない用気を付けて使います・・・

 ありがとうございました。
(稲葉) 2014/09/02(火) 18:23

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.