[[20120324215647]] 『エラー』(kk) ページの最後に飛ぶ

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

 

『エラー』(kk)
 Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Address <> "$A$1" Then Exit Sub
    If Target.Value = "" Then Exit Sub
 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

 End Sub

単独のブックだとエラーは出ませんが複数コードが書かれているブックだとエラーが出ます。なぜですか?解決できますか?


 単独のブックとは? 複数コードが書かれているブックとは?

 もしかして、同じシートモジュールに、Private Sub Worksheet_Change(ByVal Target As Excel.Range)
 が、いくつも書かれている?
 もし、そうなら、それはだめだけど、そうじゃないなら、エラーメッセージを教えてくれる?

 (ぶらっと)

いくつも書かれています。どうしたらよいですか?(kk)

 どのモジュールであれ、同じ名前のプロシジャは1つしか書けない。
いくつものセルの処理を、それぞれ記述しているんだと思うけど、1つのプロシジャにまとめる必要があるね。

 書いてあるものをすべてコピペしてアップしてくれるかな?

 (ぶらっと)

 名前が違いますが前回質問しました。
 Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D1:E1")) Is Nothing Then
        If Range("D1").Value = Range("E1").Value Then
            Me.Unprotect
            Cells.Locked = False
            Range("A1:C1").Locked = True
            Me.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingCells:=True, _
                AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, _
                AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
                AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
            Me.EnableSelection = xlUnlockedCells
        Else
            Me.Unprotect
        End If
    End If
 End Sub

 に組み込みたいのですが?出来ますか?(kk)

 単純に2つをまとめると以下。

 ただし、前スレというのは
[[20120321210300]] 『セルの保護』(だいご)
かな?
そうだとすれば、最終的には、複数の行の数値を処理するために、ちょっと特殊なシート保護も含めたコード案をアップしているんだけど
みてくれているかな?

 それと、その前スレでもいわれていたけど、さらに、その前スレもあるようで、それらがすべて異なるHNだよね。
あまり、いいことじゃないということもさることながら、関連するストーリーがあるのに、回答がバラバラになってしまうよ。
これは質問する側にとって、損だと思う。

 HNを統一して、さらに、前スレのリンクを(このレスで貼ったように)貼ったほうが、スムーズにいくね。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D1:E1")) Is Nothing Then
        If Range("D1").Value = Range("E1").Value Then
            Me.Unprotect
            Cells.Locked = False
            Range("A1:C1").Locked = True
            Me.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingCells:=True, _
                AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, _
                AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
                AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
            Me.EnableSelection = xlUnlockedCells
        Else
            Me.Unprotect
        End If
    End If

    If Target.Address = "$A$1" And Target(1).Value <> vbNullString Then
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End If

 End Sub

 (ぶらっと)

すみませんでした。次回は気をつけます。
(kk)でお願いします。
入力しましたが動作しません?
このコードが私にはあっているかもしれません
このコードが永遠に54まで続き終わります。
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("F11:S11")) Is Nothing Then
        If Range("T11").Value = Range("U11").Value Then
            Me.Unprotect
            Cells.Locked = False
            Range("F11:S11").Locked = True
            Me.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingCells:=True, _
                AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, _
                AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
                AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
            Me.EnableSelection = xlUnlockedCells
        Else
            Me.Unprotect
        End If
    End If
    If Not Intersect(Target, Range("F54:S54")) Is Nothing Then
        If Range("T54").Value = Range("U54").Value Then
            Me.Unprotect
            Cells.Locked = False
            Range("F54:S54").Locked = True
            Me.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingCells:=True, _
                AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, _
                AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
                AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
            Me.EnableSelection = xlUnlockedCells
        Else
            Me.Unprotect
        End If
    End If
If Target.Address = "F11:S54" And Target(1).Value <> vbNullString Then
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End If

 End Sub

このコードに組み込むとこのコードの一連の動きになってしまうのでしょうか?

(kk)


 今日は、ちょっと遅いので、詳細な説明が必要なら明日以降にするけど、このコードの形は「ダメ」。
 ・1行目が在庫と同じになったので、その行の該当のセルをロックしてシートロック。これで、これらセルは入力できなくなる。
 ・ところが2行目が在庫以下なので、セルは非保護のまま、かつ、シートのロックを解除。

 そうなるわけで、そうすると、1行目のセルも入力が可能になってしまう。
 なので、前スレでもお願いしたけど、シート上のセルは書式ですべて非保護にしておいてくれるという前提で
 シートに対しては、アンロックをかけず、特殊なロックをかけることにしたコードをアップしたんだよ。

 あぁ、そうそう。その「入力しましたが動作しません?」とは、
 こういう入力をした->どうなってほしかった->でも、そうならず、こうなった。
 このように説明してくれる?

 (ぶらっと)

 1.はじめのコードの動きで満足してます。そこにJPNさんの入力書式を組み合わせてOKでした。
 2.でこの動きで入力間違えをした時シート保護をマクロボタンで一度解除
 Sub ボタン47_Click()
 ActiveSheet.Unprotect
 End Sub
 この時点ではどこも保護されてない状態にします。
 3.次に間違えたF11:S54範囲のセルに修正します。正しい数字を入れた時点で又保護をする。
 そのコードが
 Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Address <> "F11:S54" Then Exit Sub
    If Target.Value = "" Then Exit Sub
 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

 End Sub
 です。
 このコードを組み込むと言うのかそれとも別物で駆動させたいのか?ですが別で駆動する方法のが
 ベストだと思います。
 別にしたいのですが・・・・・
 rivate Sub Worksheet_Change(ByVal Target As Range)
 が同じ名前のプロシジャを使うような事になってます。
 4.このコードを別物でF11:S54範囲のセル内で駆動させたいです。
 Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Address <> "F11:S54" Then Exit Sub
    If Target.Value = "" Then Exit Sub
 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
 ※今はこんな風な動きがしたいです。また夜になってしまいますが宜しくお願いします。
(kk)


 まず、最初に。
 当トピについては、まだ、その実態というか、目的が把握できない。単純に、A1になにか入力されたらシートを保護するという
 コードから把握できる要件のみ。
 実際には、このシート上で動いているほかの機能との関連で【必要性があって】このようなことを実行するんだろうね。
 そこのところを、明確に説明もらわないと、手も足も出せないよ。
 で、私が関わった前スレのシートでの動きだと言うことがわかったわかだけど、でも、そのシート上の動きがわかっただけで
 前スレのシナリオと、どう絡むのか、あるいは絡まないのか、一番重要、そこのところが全くわからない。

 そもそも、A1:C1 とか D1 とか E1 というやりとりと、F11:S54 といった、そちらのコード内の記述の相違もあるね。
 これは、話をシンプルにするためにA1等として表現して実際はF11等なのかな?であれば、今回のA1も本当は異なる?

 次に、前トピの要件は、かなりの部分、入力規則で対応できるんだろうと思う。
 だけど、あくまで、私がアップしたものは【VBAだけで制御する】という前提で、だから、そちらでアップしたコードでは
 【ダメ】だと申し上げた。
 もちろん、エクセルが持つ、豊富な機能とVBAを合わせて問題を解決するということを否定しているのではなく
 あくまで、そちらの、VBAでの解決という依頼にそって、そうしただけ。

 現在のシートのセルの保護が、どうなっているのか。
 どのセルにどんな関数が入っているのか、どのセルに、どんな入力規則が設定されているのか

 あらためて、そこをきちんと説明してくれないと、正しい解決案の提示はできない。
 これまでの関連トピのみなさんの回答の、どこを取り入れて、どこは取り入れていないか、それは、こちらではわからないので。

 (ぶらっと)


説明は上で説明くらいしか難しすぎて・・・・
単純に
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D1:E1")) Is Nothing Then
        If Range("D1").Value = Range("E1").Value Then
            Me.Unprotect
            Cells.Locked = False
            Range("A1:C1").Locked = True
            Me.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingCells:=True, _
                AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, _
                AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
                AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
            Me.EnableSelection = xlUnlockedCells
        Else
            Me.Unprotect
        End If
    End If
 End Sub


Private Sub Worksheet_Change(ByVal Target As Excel.Range)

    If Target.Address <> "F11:S54" Then Exit Sub
    If Target.Value = "" Then Exit Sub
 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

 End Sub
は組めないのですか?マクロはあまり知らないので意味不明な答え方ですがすみません(kk)

 う〜ん・・
 上の方でも言ったとおり、別々には書けないけど、一緒にしたら書けるよ。

 ただし、質問で説明されたコードは
If Target.Address <> "$A$1" Then Exit Sub
If Target.Value = "" Then Exit Sub
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

 で、↑のレスのコードは
If Target.Address <> "F11:S54" Then Exit Sub
If Target.Value = "" Then Exit Sub
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

 全く違うよね。
しかも、後者は複数セル相手という部分も含めて、コード自体が間違っている。

 聞きたいのは、実際のコードはどうなっているのということと、セルの保護の状態はどうなのということと
シートの保護の状態はどうなの、合計を算出する計算式が、どこに、どんな式で入っているのか、
入力規則はどこにしかけてあって、その設定した条件は、どんなものなのと、
それだけの単純なことなんだけど。

 別の表現をすると、在庫数量になるまでは入力ができる、在庫数量を超えるような入力はできないようにしている、
ちょうど、在庫数量になったら、その行の入力は不可。
このそれぞれが、マクロで制御でされているのか、入力規則で制御されているのか、
そのあたりの、現在の仕掛けはどうなっているのかを聞いているだけだよ。

 いずれにしても、一緒にしたい↑の2つの部分を一緒にするコードをアップするために
複数セル関連で間違った記述になっているので、それも直さなきゃいけない。
この加えたい3行のコードの、それぞれの意図を言葉で教えてくれる?
 

 それがわかれば、Range("F11:S11") から Range("F54:S54") まで、ずら〜っと配置した現在の構えは「ダメ」という理由を
具体的にせつめいできるので。

 (ぶらっと)


 ↑のコメントを理解してくれて、整理して情報をくれればうれしいけど、もしかしたら
今、うまくいっているので、この3行を、既存のChangeイベントプロシジャに、どうやって組み込むかだけを
教えて欲しい、他のことはいい。

 ということであれば、↑のコメントとは、全くトーンが変わるけど以下。
(別トピで、こちらが、あれやこれやで意見を言っている内に、質問者さんが「キレて」しまったケースがあったので)

 まず、一緒にするコード案を最初にアップした。
で、それに対して、「入力しましたが動作しません?」との返事をもらった。
こちらから、
 >あぁ、そうそう。その「入力しましたが動作しません?」とは、
 >こういう入力をした->どうなってほしかった->でも、そうならず、こうなった。
 >このように説明してくれる?
このように質問した。(それに対する返事は結局もらえていないんだけど)

 で、想像。

 こちらがアップしたコードは
If Target.Address = "$A$1" And Target(1).Value <> vbNullString Then
   ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End If

 それに対して、実際にそちらで組み込んだコードは以下?
If Target.Address = "F11:S54" And Target(1).Value <> vbNullString Then
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End If

 もし、そうなら、この2つはにているけど、全く異なる。 
Target.Address = "F11:S54" ないことはないけど、まず、この状態は発生しない。
Targetは入力「された」領域。F11:S54の大きな範囲に一度に入力したときのみTargetは"F11:S54"になる。
(しかも、Target.Address="$F$11:$S$54")
いずれにしても、記述が間違っているので、ここで = になることはありえない。
If Not Intersect(Target,Range("F11:S54")) Is Nothing And Target(1).Value <> vbNullString Then なのかな?

 実際には何を判定しようとしているのかな?

 私が再三いっている、このコードの構えでは「ダメ」ということについては、いずれ、困ったことが発生した時に、質問をくれたら
かつ、それを私が目にしたら、そのときに説明しよう。今、いくら言っても、理解してもらえそうにないので。

 (ぶらっと)

勘違いなのですか??このコードの意味は
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Address <> "F11:S54" Then Exit Sub
    If Target.Value = "" Then Exit Sub
 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

F11:S54この中のどれかのセルに数字が入力された時点でセルを保護すると思ってました。全て埋まらないと駄目と言う事ですか?(kk)


 ぱらぱら入力して全部うまった時、ではなくて、
 コピペなどで一気に入力された時、です。
 さらに、きっちりその範囲に、です。大きくてもだめです。
 (semm)

 (semm)さん、フォロー深謝です。

 To (kk)さん

 semmさんのコメントどおり。

 >この加えたい3行のコードの、それぞれの意図を言葉で教えてくれる?

 こうコメントしたのを覚えてくれていると思うけど、コードだけで、さぁどうだといわれると
 そのコードが行うことしか、回答者には見えない。
 「F11:S54この中のどれかのセルに数字が入力された時点でセルを保護する」
 こう書いてくれて、はじめて、あぁ、勘違いしてるな、コードが正しくないなということがわかるわけ。
 だから、やりたいことを「言葉」で表現するということは大事なことだね。

 範囲に入力があれば ということなら、回答したとおり、Intersect で調べる。

 ただ、なんというかなぁ・・・

 きっとコードは

 If 11行目の状態で条件にあえば
   シート保護解除
   11行目のしかるべきセル書式でセルをロック
   シート保護
 Else 
  シート保護解除
 End If

 If 12行目の状態で条件にあえば
   シート保護解除
   12行目のしかるべきセル書式でセルをロック
   シート保護
 Else 
  シート保護解除
 End If

 '以降、54行目まで、この構文が続いて

 If F11からS54までの領域内で入力があり、それが空白じゃなかったらシート保護

 こんな形になっているような気がする。
 よ〜く見て欲しいんだけど、この形って、意味が無いと思うよ。(というか、やりたいことを実現できないよ。きっと)

 (ぶらっと)

  


 11行目のしかるべきセル書式でセルをロック
   シート保護
 Else 

 ここからで入力間違えをしました。11行目はもうロックされてしまっています。
 ※F11:S54範囲が数字を入力するセルです。
 マクロ記録ボタンで一度保護を解除
 保護を解除されているので11行目に入力可能なので数字を打ち直す。
 F11:S54範囲のどれかのセルに入力があった時点でシート保護
 こんな風です。お騒がせしております。
(kk)

 で、当面の(kkさんが思う)課題はOKになったということでいいの?
(つまり、既存のコードと、"F11:S54"をInterSectして入力有無を判定して処理するコードの同居というテーマ)

 それとも、まだ、課題があるのかな?
 もし、あるなら、ここを、こうしたいのに、こうならないということをいってね。

 (ぶらっと)

 シート上の入力できる全てのセルのセル書式で保護チェックがはずされており、シートに保護がかかっている。
(つまり、入力できるところには入力できるけど、合計値に達した行の関連セルは入力ができなくなっている)
 また、入力の結果、合計値を超過するような場合は、別途、入力規則でエラーになるようになっている。

 この前提でいうと、Worksheet_Change ルーティンは以下でいいはずなんだけどね。
 つまり、今回、追加しようとしている部分は不要。
(自分が書くなら、前すれで提案したような形で、さらに、11〜54まで書かずに1つにまとめるけどね)

 Private Sub Worksheet_Change(ByVal Target As Range)

    Me.Unprotect

    If Not Intersect(Target, Range("F11:S11")) Is Nothing Then
        If Range("T11").Value = Range("U11").Value Then
        Range("F11:S11").Locked = True
    Else
        Range("F11:S11").Locked = False
    End If

    If Not Intersect(Target, Range("F12:S12")) Is Nothing Then
        If Range("T12").Value = Range("U12").Value Then
        Range("F12:S12").Locked = True
    Else
        Range("F12:S12").Locked = False
    End If

    '同じ構成で 13〜53行目までのコード

    If Not Intersect(Target, Range("F54:S54")) Is Nothing Then
        If Range("T54").Value = Range("U54").Value Then
        Range("F54:S54").Locked = True
    Else
        Range("F54:S54").Locked = False
    End If

    Me.Protect   '引数は適切なものを

 End Sub

 (ぶらっと)

回答すにませんです。
11〜54まで書かずに1つにまとめるけどね
まとめられるんですか?まとまるならまとまるほうのがいいですよね
引数は適切なものを
とありますがどうしたらいいのでしょうか?(kk)

 >まとめられるんですか?
前スレ
[[20120321210300]] 『セルの保護』(だいご)
この最後に提示したような構成。ただし、その後、合計オーバーは入力規則で対応しているようなので
コードは少し変更が必要だけど。

 上でアップしたコードで(Protectの引数はとりあえず DrawingObjects:=True, Contents:=True, Scenarios:=True あたりで)
(kk)さんのイメージと、実際の動きが、おおむね合っているかどうかを確認してくれたら、まとめたこーど案をアップしてみる。

 ところで、
 >シート上の入力できる全てのセルのセル書式で保護チェックがはずされており、シートに保護がかかっている。
 >(つまり、入力できるところには入力できるけど、合計値に達した行の関連セルは入力ができなくなっている)
 >また、入力の結果、合計値を超過するような場合は、別途、入力規則でエラーになるようになっている。

 この私の理解は、間違っている?いない?返事が欲しいね。

 それと、アップしたコード、あまりにも、無駄な処理が発生する形になっているので、プロシジャの先頭に
If Intersect(Target,Range("F11:S54")) Is Nothing Then Exit Sub をいれてくれたら、ありがたい。

 (ぶらっと)

エラーになってしまい試せないのですが?
どうに組み合わせればいいのですか?(kk)

 え? エラーになってしまうというのは、このレスの4つ前にアップしたコードでエラー?
組み合わせるのではなく、今までのコードは、どこかに待避して、↑でアップしたコードだけにして実行してくれている?
であれば、どのコードで、どんなエラーメッセージがでたか教えてくれる?

 (ぶらっと)

Ifブロックに対応するEnd Ifがありません。
それかれ数字を入力する前からロックがかかっている感じです。
 Private Sub Worksheet_Change(ByVal Target As Range)

    Me.Unprotect

    If Not Intersect(Target, Range("F11:S11")) Is Nothing Then
        If Range("T11").Value = Range("U11").Value Then
        Range("F11:S11").Locked = True
    Else
        Range("F11:S11").Locked = False
    End If

    If Not Intersect(Target, Range("F12:S12")) Is Nothing Then
        If Range("T12").Value = Range("U12").Value Then
        Range("F12:S12").Locked = True
    Else
        Range("F12:S12").Locked = False
    End If

    '同じ構成で 13〜53行目までのコード

    If Not Intersect(Target, Range("F54:S54")) Is Nothing Then
        If Range("T54").Value = Range("U54").Value Then
        Range("F54:S54").Locked = True
    Else
        Range("F54:S54").Locked = False
    End If

    Me.Protect   '引数は適切なものを

 End Sub
このまま入れました。(kk)

今気がつきました。
F11:S11がロックして
F12:S12がロックされるとF11:S11が入力可能になつてしまうことが発覚しました。
(kk)

 まず、ごめん。
If Range("T12").Value = Range("U12").Value Then
これらを
If Range("T12").Value = Range("U12").Value Then _
にしてください。

 くわえて、Me.Protect の引数としては、連絡したように
DrawingObjects:=True, Contents:=True, Scenarios:=True  ぐらいは指定して。

 それと、「数字を入力する前からロックがかかっている感じです」 
これで、なんとなく、何度も確認しているシートのセルの保護状況がわかってきたみたいだけど
動きを確認するためなので、いったん シート保護を外して、さらに、全セルを選んでの書式設定の保護でロックを外して。
その上で合計と同じになるような入力をしたり合計未満の入力をしたりしてくれる?

 ただ、入力する前にロックがかかっていて、入力できないということは、今までのコードでも、そうなんじゃない?
入力前は、このコードは動かないわけだから。

 それと
今気がつきました。 F11:S11がロックして F12:S12がロックされるとF11:S11が入力可能になつてしまうことが発覚しました

 これは、今までの、そちらのコードの構成で ということだよね。
 それとも、こちらがアップしたコードを読んで、そう思ったと言うこと?

 (ぶらっと)


DrawingObjects:=True, Contents:=True, Scenarios:=True  ぐらいは指定して
意味が???(kk)

 >Me.Protect   '引数は適切なものを
 >このまま入れました。(kk)

 このようにレスがあったので、せめて
Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ぐらいにしてねということ。
このコードって、もともと、(kk)さんのコードにそう書いてあったんだよ。だから、すぐにわかると思ったんだけど。

 それと、疑問をどんどんぶつけてくれるのはウェルカムだけど、こちらが、聞いていることに対しても
タイムリーに答えて欲しいねぇ。(今まで、ずいぶんこちらから質問して、答えてもらっていないものがあるよ)

 (ぶらっと)

 上でお願いしたようなアプローチで、解決に向かって進んでいこうと思ってもいるけど
こちらは、「このようにしたらいいはずだ」という思いで、勝手にそのためのシートの設定条件を前提に
コメントしているし、そちらは、実際には、違う方法で対処しようとしていて、そこが「かみあわない」
ので、なかなか前に進まないかもしれない。

 で、「一か八かのばくち」だけど、何も考えないで、以下にしてみてくれる?
たぶん、(kk)さんの思っていることが実現できると思う。

 なお、こちらの想定は、
1.F11:S54 が数字の入力欄
2.このF11:S54には入力規則で、数式の =$T11<=$U11 または =SUM($F11:$S11)<=$U11 等が規定されている。
3.T11:T54 が合計欄で、そこには =SUM(F11:S11) 等の式が入っている。
4.合計(T列)が在庫(U列)を超過する入力は、マクロではなく入力規則で制限されている。
5.マクロで対応するのは、合計が在庫以下であれば、引き続き、その行の入力が可能。
 合計が在庫と同じになれば、その行の入力を不可能にする。
6.そのほかに、間違い入力で、入力不可能になった行を、再入力できるようにロックをはずす。

 この想定が間違っていないとすれば以下。

 【準備作業】
1.まず、このシートが今、保護されている状態であれば、保護をはずす。
2.シートの一番左上をクリックしてシートの全てのセルを選ぶ。
3.書式->セルの保護タブのロック(L)のチェックをはずす。
4.シート保護。ロックされていないセル範囲の選択のところだけにチェックをいれる。
  もし、ロックされているセル範囲の選択にもチェックが入っていれば、それをはずす。

 【コード】

 (ThisWorkbookモジュール)

 Private Sub Workbook_Open()
    With Sheets("Sheet1")       '対象のシート名 実際のものに変更
        .Protect DrawingObjects:=False, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
        .EnableSelection = xlUnlockedCells
    End With
 End Sub

 (シートモジュール)

 Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("F11:S54")) Is Nothing Then

        If Target.Count > 1 Then
            MsgBox "複数セルへの同時入力はサポートしていません" & vbLf & "入力を取り消します"
            Application.EnableEvents = False
            Application.Undo
            Application.EnableEvents = True
        Else
            With Target.EntireRow
                .Range("F1:S1").Locked = .Range("T1").Value = .Range("U1").Value
            End With
        End If

    End If

 End Sub

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Rows("11:54")) Is Nothing Then
        Cancel = True
        With Target.EntireRow
            .Range("F1:S1").Locked = False
        End With
    End If
 End Sub

 これで、いったん保存してた上で、このブックを開いて、いろいろと入力してみてくれる?
 なお、現在は、間違い入力の訂正のため、ボタンをおして、おそらく標準モジュールに書かれている
 シート保護をはずす処理をしていると思うけど、それだと、間違いの行以外のところもさわれる。
 それでもいいかもしれないけど、上でアップした案は、訂正したい行の任意のセルをダブルクリック
 することで、その行のF〜Sのみを再入力可能にしている。

 (ぶらっと)


ぶらっとさんコードありがとうございます。
ちょっとわからない事が?
シート保護。ロックされていないセル範囲の選択のところだけにチェックをいれる。
  もし、ロックされているセル範囲の選択にもチェックが入っていれば、それをはずす。
ここの意味がわからないのですが・・・
(kk)

ん?

エクセルでシート保護を選ぶと、シート保護ダイアログがでてくるよね。
で、ユーザーに許可する操作(O)という□付きのリストボックスがあるとおもうけど、
そこに、保護したあと、どんな操作を可能にするのかという、その操作がずら〜っとでてきているね。
初期値としては、リストの上の2つの機能、
ロックされたセル範囲の選択
ロックされていないセル範囲の選択
これにチェックがはいっている。
なので、ロックされたセル範囲の選択のチェックをはずしてねという意味なんだけど
もしかして、すでに、なんらかの許可する操作がいくつかセットされているかもしれない。
その場合、それらにもすでにチェックがついている。
だから、表現としては、
ロックされていないセル範囲の選択のところ「以外」のチェックをはずす。
このほうが適切だったかな?

(ぶらっと)


早速コード入力しましたが※訂正したい行の任意のセルをダブルクリック
 することで、その行のF〜Sのみを再入力可能にしている。
ダブルクリックが出来たり出来なかったりなんかおかしいのですが・・・
あとは理想道理になってます。よろしくおねがいします(kk)


 >ダブルクリックが出来たり出来なかったりなんかおかしいのですが・

 その意味は、あるときは、機能してロックがはずれるけど、あるときはダブルクリックしてもロックがかかったままということ?
 それとも、セルを選択してダウぶるクリックしようとしても、セルの選択ができないということ?

 後者であれば、ロックがかかった、その行のF〜S列は選択できないので、その上でのダブルクリックもできない。
 F〜S以外の、ロックされていないセルを選んでダブルクリックして。

 もし前者なら、今のところ原因がわからないなぁ。

 (ぶらっと)

あるときは、機能してロックがはずれるけど、あるときはダブルクリックしてもロックがかかったままということ?
みたいです。(kk)

 う・・・・・ん・・・・?
 (kk)さん、ちょっと勘違いしてない?
 解決に向かって努力しなきゃいけないのは私じゃなく(kk)さんだよ。
 こちらの質問に対して、(kk)さん自身のコメントは「みたいです。」の、句読点いれて6文字?
 であれば、こちらの回答は、上でもレスした通り、「今のところ原因がわからないなぁ」

 たとえば、やってみて、どんなときに発生するのか、何か規則性はないのか?
 最低でも、「100回やって、○回目と□回目と△回目と、・・・に発生しました」ぐらいは欲しいな。

 何か、こちらで、いろんなケースを試してみて、調査して、それを、見つけなきゃいけないの?
 もちろん、できることはするけど、(kk)さんも、ただ待っているだけじゃなく、努力必要だよ。

 (ぶらっと)

コメント返信:

[ 一覧(最新更新順) ]


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