[[20090924114736]] 『保護』(BOSS) ページの最後に飛ぶ

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

 

『保護』(BOSS)
 ある特定のセルだけに管理者は上書きを行います。
 毎月仕入れた数量等を上書きして報告してもらうのですが・・・
 管理者A、B、Cの仲が悪く人の入力したものを嫌がらせで書き換えたりします。

 そこで!
 本人しか、そこのセルを書き変える事ができないようにする為に
 セル個別にパスワードのようなものは付与出来ないものかと思っています。

 どなたか、悩めるBOSSにお力添えよろしくお願いいたします。

 《例》
      A           B          C          D
 1  商品名    管理者A   管理者B   管理者C
 2 SDカード      1個      3個          1個 
 3 キュウリ        3本           0本          6本
 4  投資額        3,000円       10万円        0円
 5  :            :             :            :


 色々方法はあると思いますが私見で有力な方法順で書きますと

 1.管理者として幼稚な人間を再教育する。
 2.管理者ごとにファイルを別にする。
 3.最初からシートを操作させずにユーザーフォームでパスワード付きの入力を求める。
 4.シートの保護を活用して個人別パスワードが一致していたら共通パスワードで解除する。
 5.セルの選択時にSelectionChangeイベントを使ってパスワード入力させて
   一致していなければ他のセルをActivateする。

 などがありますかね?

 私なら仕事を仕事と思っていない管理者をどうにかすべきと思うので
 1番にするか、上司に相談しますが・・・
 (momo)

 momoさま

 すいません・・・例では管理者3人しかいてませんが、実際は管理者100人以上いてます。
 また、誰が書き換えたか特定出来ないので1番は無理なんです。
 2番は社長&役員命令で1シートに纏めるように言われていますので、これもダメ。
 3番、5番はVBAは難しくて解りません。
 4番を詳しく教えていただけませんでしょうか?
 よろしくお願いいたします。

 (BOSS)

 管理者用シート+纏め用1シート
 管理者用シートはシートの保護
 纏め用1シートはそれぞれのシートを参照
 (B2=管理者A!B2,C2=管理者B!C2)
 (たるむ)

 端末の利用規則を厳密にして、各自別個のログインユーザーとする。
カキコミする為にはパスワード付きのユーザーとしてログインしなければ
ならないようにしてしまう。
該当ブックは変更履歴が残る設定(共有ブック化)とする。
(事前にどういう使い勝手か、研究するように!)
「書き込みの時間と内容が記録されるようにしたから、今後こういうことのないように」
とハッタリをかましてみる。
 
が、やはり、人間関係をなんとかしないと、エクセルの問題で済まないと思われます。
(他の嫌がらせをするだけじゃないかな?)
 
(みやほりん)(-_∂)b

 たるむ様/みやほりん様

 御指導おそれいります。

 たるむ様
 現状のやり方を変えるには役員達から許可をもらわなければいけません。
 なので、現状1シートで収めている状態のままでお願いします。

 みやほりん様
 大企業と称される会社の人間関係ほど、えげつないのが多いので
 お察しのとおりこの程度の次元の低い嫌がらせはカワイイもんです。
 でもカワイイ程度の嫌がらせ程なかなか直らないもので、強制的に出来ないように
 するのが一番良いのでハッタリとかは無しでお願いします。

 したい事を言いますと・・・
  「1シートで作成された管理表のセル単位でPASSを付与する。」
 です。

 1シートで、シート内容の状態を変更せずに済むならPASSとは違う方法でも構いません。
 何か方法があれば教えてください。
 お手数ですが、宜しくお願いいたします。

 (BOSS)


 セル単位というか列単位でサンプルコードを作ってみました。
 結果的に4番もVBAなのです。
 というか標準機能だけでは厳しいでしょうし・・・
 また、今回のコードも完璧ではありません。
 (シートの保護を強制的に解除する方法を使用されたら意味がありません)
 ThisWorkbookモジュールに貼り付けてみてください。

  Private Sub Workbook_Open()
  Const kPass As String = "1234" '共通のパスワード
  Dim kName As String, myPass As String, chkPass As String
  Dim r As Range
  With Worksheets("Sheet1")
    .Unprotect Password:=kPass
    .Cells.Locked = True
    .Protect Password:=kPass
    Do
      kName = InputBox("管理者名を入力してください。")
      Set r = .Rows(1).Find(What:=kName, After:=.Cells(1), LookIn:=xlFormulas, _
                            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                            MatchCase:=False, MatchByte:=False, SearchFormat:=False)
    Loop While kName = "" Or r Is Nothing
    myPass = InputBox("パスワードを入力してください。")
    Select Case kName
      Case "管理者A": chkPass = "abcd"
      Case "管理者B": chkPass = "cdef"
      Case "管理者C": chkPass = "efgh"
    End Select
    If myPass = chkPass Then
      .Unprotect Password:=kPass
      r.EntireColumn.Locked = False
      .Protect Password:=kPass
      MsgBox kName & "さんの列の変更を許可します。"
    Else
      MsgBox "パスワードが違います。" & vbCrLf & _
             "入力する場合はブックを再起動してください。"
      .Unprotect Password:=kPass
      .Cells.Locked = True
      .Protect Password:=kPass
    End If
  End With
  End Sub

 (momo)

 momo様

 ThisWorkbookモジュール←タグを右クリックしてコードの表示のところですか?

 ド素人なもんでスイマセン。

 (BOSS)

 Alt+F11 でVBエディターが起動します。
 プロジェクトウインドウにThisworkbookというのがあるのでWクリックします。
 コードウインドウに貼り付けます。
 あとは保存してブックを再起動。
 で、出来るかと思います。
 (momo)

 momoさま

 管理者の名前を尋ねられました・・・
 今現在なんと名前いれたら次に進めますか?

 (BOSS)


 私は、最初のご質問のシートレイアウトどおりに作っていますので
 (というか、その内容しか存じませんので)
 最初のレイアウトのシートで、1行目にかかれている管理者名です。
 (管理者A、管理者B、管理者C)

 レイアウトや内容が違うなら、とりあえず1行目にある名前でも入れて
 パスワードを適当にすれば抜けられます。

 先に、SelectCase内の名前とパスワードを確認してくださいね。

 (momo)

 momo様

 それが「管理者A」って入れても先に進めないんですよ。
 アルファベットのAを半角にしたり全角にしたりしてもダメなんです。
 キャンセルしても管理者名を聞いてくる為、Bookを閉じる事もできない状態です。
 なぜだろう?

 (BOSS)

 最初の質問どおりのシートレイアウトですか?
 とりあえず、閉じたいのであればCtrl+Alt+Delでタスクマネージャから強制終了で。

 (momo)

 終了したら、スタートボタンからエクセルを起動
 Alt+F11でVBEを出したまま、ブックを起動。
 管理者名を聞いてきたらESCを押しっぱなし。
 でストップがかかるので、コードを確認してください。
 (momo)

 momo様

 できました。
 ありがとうございます。
 レイアウトが《例》とは若干違うので質問どうりの《例》のBookを作って試したところできました。
 実際ので試してみたいのですが、レイアウトから管理者名を探し出しているコードは下記の部分ですか?

 Set r = .Rows(1).Find(What:=kName, After:=.Cells(1), LookIn:=xlFormulas, _
                            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                            MatchCase:=False, MatchByte:=False, SearchFormat:=False)

 あと、管理者名とPassは下記コードのようですが、Caseを人数分記述したらいいですか?
  Select Case kName
      Case "管理者A": chkPass = "abcd"
      Case "管理者B": chkPass = "cdef"
      Case "管理者C": chkPass = "efgh"

 (BOSS)


 >レイアウトから管理者名を探し出しているコードは下記の部分ですか?
 そのとおりです。
 ワークシートの検索の機能を使っています。
 Rows(1)が1行目ですので、管理者名が書かれている行数にしてください。

 >Caseを人数分記述したらいいですか?
 これもそのとおりです。
 管理者名とそれに対応するパスワードを""の中を書き換えてください。

 あと、最初の"1234"も解除されにくいパスワードでBOSSさんのみが解除できる
 パスワードにしてください。
 (momo)


 momo様

 ありがとうございます。
 大変勉強になりました。
 もう少し勉強の為、教えてください。
 コードまったく読めないのですが、興味が沸いてきました。
 Rows(1)が1行目という事ですと単純に列にする場合はRowsの部分が他の何かに変わるだけですか?

 あと、管理者人数が現在116名いまして・・・
 Caseの数に限界は無いのですかね?

 (BOSS)

 Rowsが行で、列はColumnsです。
 コードウインドウにでもColumnsと書いてカーソルを文字にあわせてF1を押すと
 ヘルプが出ますので色々調べてみてください。

 SelectCaseの限界については正直知りませんが(あるのかな?)
 限界になった事はありません。
 まぁ、もし無理でしたら別の方法もあるのでその時はまた質問してください。
 (momo)

 momo様

 ありがとうございます。
 ホント勉強になりました。
 VBAの世界、なんだか面白そうですね。
 知ればハマッてしまいそうなBOSSです(笑)
 momo様最後まで丁寧に教えていただきありがとうございました。
 もし近所に住んでたら焼肉でもご馳走するくらい感謝です。
 ではまたいつか、ご縁がありましたら教えてくださいませ。

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

 (解決して満面の笑みのBOSS)

コメント返信:

[ 一覧(最新更新順) ]


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