[[20190105234543]] 『シートの保護が勝手に解除される』(FA) ページの最後に飛ぶ

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

 

『シートの保護が勝手に解除される』(FA)

 1週間ほど悩んでいます。何卒ご教授お願い致します。

 『仕様』
 A〜M列まで入力する一覧表があります。
 B列の2行目以降に入力されるとA列に自動で連番を付けるというコードを以前ネットより拾ってきました。
 複数人で使用するのでシートを保護したいため前後にシートの保護と解除のコードを入れてあります。

 『ご質問』
 C列以降に入力されるとシートの保護が解除され困っています。

 Private Sub Worksheet_Change(ByVal Target As Range)

        Workbooks("01_POL.xlsb").Worksheets("POL").Unprotect Password:="123"

        Dim rng As Range

        If (Target.Column <> 2) + (Target.Row < 2) Then Exit Sub
        On Error Resume Next
        Set rng = Range("B2:B" & Rows.Count).SpecialCells(2)
        On Error GoTo 0

        If rng Is Nothing Then Exit Sub
        Application.EnableEvents = False
        On Error Resume Next

        Columns(1).SpecialCells(-4123).ClearContents
        On Error GoTo 0
        rng.Offset(, -1).FormulaR1C1 = "=max(r1c:r[-1]c)+1"
        Application.EnableEvents = True

        Workbooks("01_POL.xlsb").Worksheets("POL").Protect   Password:="123", AllowFiltering:=True

    End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 パスワード解除してから、保護することなく

 >If (Target.Column <> 2) + (Target.Row < 2) Then Exit Sub

 で、ぬけちゃってるからしょうがないんじゃないですか・・・。

 無視しようかと思ったけれど、
 上のコードの意味は何ですか?
(BJ) 2019/01/06(日) 00:24

 BJ様 深夜にも関わらず早速のお返事ありがとうございます。

 ネットから拾って来たのでコード意味全く分かりません。
 If (Target.Column <> 2) + (Target.Row < 2) Then Exit Sub この行消したら解決しました。

 ありがとうございます。

 FA

(FA) 2019/01/06(日) 00:44


解決したって言ってるし余計なお世話でしょうけど、

>1週間ほど悩んでいます。
>コードを以前ネットより拾ってきました。
>ネットから拾って来たのでコード意味全く分かりません。

コードの意味がまったくわからないなら、1週間どころか1年間悩んでいてもかわらないので意味を理解するところから手を付けたほうがよいのでは?

>この行消したら解決しました。
こういう書き方は私はしないですけど、それでも消してしまうと、B列の2行目以降じゃないところを変更しても、このマクロ発動するようになりますけどいいんでしょうか?

(もこな2) 2019/01/06(日) 02:03


↑の続きで。
ろくにテストしてないですけど、私なら↓みたいな感じにするかもです。

【Thisworkbook】モジュール

    Private Sub Workbook_Open()
        With Worksheets("POL")
            .Unprotect Password:="123"
            .Protect Password:="123", UserInterfaceOnly:=True, AllowFiltering:=True
        End With
    End Sub

【POL】シートモジュール

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim MyRNG As Range

        Stop '←ここで止まるから以降をステップ実行して何をしているのか研究のこと

        If Not Intersect(Target, Range("B2", Cells(Rows.Count, "B"))) Is Nothing Then
            Application.EnableEvents = False

            For Each MyRNG In Intersect(Target, Range("B2", Cells(Rows.Count, "B")))
                If MyRNG.Value = "" Then
                    MyRNG.Offset(, -1).ClearContents
                Else
                    MyRNG.Offset(, -1).Value = _
                    WorksheetFunction.Max(Range("A2", Cells(Rows.Count, "A"))) + 1
                End If
            Next MyRNG

            Application.EnableEvents = True
        End If
    End Sub

Changeイベントのほうは興味があれば研究してみてください。

Workbook_Openイベントのほうは、このようにブックを開くときの1回だけ解除して即保護する(ただし、マクロからの操作は許可するオプションを付ける)というやり方にすれば、どこか変更するたびに保護を解除して・・・処理が終わったら保護してみたいなことを考える必要は無くなりますからその紹介です。

(もこな2) 2019/01/06(日) 06:15


マクロを使わなくても

A列の必要な行まで(少し多めに)
こんな数式を入れておけばよいのでは?
=IF(B2<>"",COUNTA($B$1:B1),"")

(マナ) 2019/01/06(日) 09:03


 もこな2様

 >コードの意味がまったくわからないなら、1週間どころか1年間悩んでいてもかわらないので意味を理解するところから手を付けたほうがよいのでは? 
 ご指摘ごもっともでございます。

 ご丁寧にコードまでご教授頂きありがとうございます。
 ご教授頂いたコード確認したところ理想通り動きました。
 とても感謝しております。
 早速今から参考書やネットを見ながらご教授頂いたコードを1行づつ勉強してみます。
 最近は歳のせいか参考書の文字が小さくなかなか読めませんが。

 しかしシートの保護解除ひとつ取っても色々なやり方があるのですね。
 もこな2様の知慮深さに敬服致します。
 ありがとうございます。

 FA
(FA) 2019/01/06(日) 10:36

 マナ様

 お返事ありがとうございます。
 ご説明不足でした。申し訳ございません。
 以前は関数を使用していたのですが一覧表が膨大になってきているのと
 関数ですとコピー&ペーストを忘れてしまう子たちがいるのでマクロに挑戦しております。
 今回もこな2様のお陰で解決致しましたが、また何か問題があったら教えて下さい。

 FA

(FA) 2019/01/06(日) 10:51


>関数ですとコピー&ペーストを忘れてしまう子たちがいるので

意味不明です。関数なら何もしなくても自動で結果が反映すると思いますが…

>何か問題があったら教えて下さい。

本当に解決したのですか。
そうであれば、関数では無理です。

(マナ) 2019/01/06(日) 11:01


 マナ様

 重ねて説明致します。
 先にも書きましたがこの問題マクロにて解決済みです。ご心配ありがとうございます。
 ここからは長文になりますので読まなくても結構です。

 まず私の会社は日本ではなくタイになります。
 当初A列に関数で=A1+1と入力させてコピーするよう指示していたのですが、
 タイ人は関数自体を理解できずエクセルも入力のみのワープロ状態が現状です。
 B列はタイ語が多いのでA列は必須。
 マナ様の仰る通り2000行ほど関数をコピーした物を渡しておいたのですが超えてしてまい、同様に様々なファイルのメンテナンスを行わなければならないと考えるとマクロがベストと考えに至りました。
 タイ人にフォーマットを作らせるとポビットテーブルも使えないような表を作るので私が作って渡して入力させています。

 タイ人はエクセルの機能(表計算が前提)も理解しておらず、フィルハンドルも使えない、中にはエクセル自体初めてという子もいます。
 一応大卒なのですが能力は日本人中学生以下がほとんどで、ルールは守らない理解力に乏しく忘れっぽく感情的で責任感もなく隙や暇があれば遊んでいます。

 ここからはタイの実態ですが、半年ほど日系企業で働くという実績を作って他社へ転職し給料アップするのがタイ人の常識となっております。大卒初任給で45,000円/月。できる子ほど転職していきます。
 タイ人は隣の会社が1500円給料が高いで辞めて行くのが日常茶飯事です。
 長くても1年半、早ければ昼休み、出社せずそのまま退社など様々な状況の中で業務をこなすとなるとタイ人の能力をあてにせず、データの入力さえすれば業務が終わるようにするのが理想と考えております。
 入力されたデータが間違っているのは別問題ですが。
 タイ人がタイ人に業務を教えても教えなければいけないことを忘れ、教育手順リストを作らせてもリストを失くしたとよく言います。結局教えて貰った方も教えられたこと翌日には忘れるですがね。
 タイのド田舎で、日本人私一人で300人近くのタイ人の業務を管理するのにてんてこ舞いです。
 日本人と仕事したいです。早く帰国し年金生活したいです。

 FA
(FA) 2019/01/06(日) 12:54

コメント返信:

[ 一覧(最新更新順) ]


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