[[20100504160837]] 『年月で質問した者ですが』(大) ページの最後に飛ぶ

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

 

『年月で質問した者ですが』(大)

このような他のシートから参照しているマクロでシート内で自動で処理するようなマクロだと該当のシートが保護されているとエラーになるとおもいますがここで見た過去の質問のコードだとどうにしたら保護を解除しこの作業が終わりで保護を又かけられますか?
このコード内で組むとどうに書けば組めるのですか?

  
Sheet1のモジュール  
Private Sub Worksheet_Calculate()
   Dim c1 As Range, c As Range
   Dim x
    Set c1 = Me.Range("C6:AG164")
    For Each c In c1
        Select Case c.Value
            Case 1
                x = 25
            Case 2
                x = 3
            Case 3
                x = 7
            Case 4
                x = 15
            Case 5
                x = 22
            Case 6
                x = 10
            Case Else
                x = xlNone
        End Select
        c.Interior.ColorIndex = x
    Next c
End Sub


 こちらでは解決しませんでしたか?
 
[[20100503065520]] 『年月』(大)
 
Private Sub Worksheet_Calculate()
   Dim c1 As Range, c As Range
   Dim x
    Set c1 = Me.Range("C6:AG164")
  Me.Unprotect
    For Each c In c1
        Select Case c.Value
            Case 1
                x = 25
            Case 2
                x = 3
            Case 3
                x = 7
            Case 4
                x = 15
            Case 5
                x = 22
            Case 6
                x = 10
            Case Else
                x = xlNone
        End Select
        c.Interior.ColorIndex = x
    Next c
  Me.Protect
End Sub
 
引数は省略しましたが、シートを編集するステートメントまでに
プロテクト解除、編集が終わったらプロテクト、という順番です。
ご提示のコードでは c.Interior.ColorIndex = x がシート(セル)
を変更しているコード。
(みやほりん)(-_∂)b

先程のは自動記録のコードを組み込んだだけでこのようなコードの時は?でしたので質問しました。(大)

 「うそ」ついちゃいけませんね。
マクロの記録では [[20100503065520]] のコードは作れませんよ。
(みやほりん)(-_∂)b

嘘言ってませんよ〜 マクロの記録で記録したコードから拾い出してコピーして貼り付けて作成します。なので限界があります。(大)

Sheets("集計").Select
    ActiveSheet.Unprotect
    Sheets("TOP").Select
Dim buf As String
     buf = InputBox("年を入力してください。" & vbNewLine & "閲覧の方はキャンセルを押してください ")
     If buf = "" Then Exit Sub
     Range("集計!B1") = buf
     buf = InputBox("月を入力してください。" & vbNewLine & "閲覧の方はキャンセルを押してください ")
     If buf = "" Then Exit Sub
     Range("集計!E1") = buf
      MsgBox "入力された年は" & Range("集計!B1").Value & "年です。 "
      MsgBox "入力された月は" & Range("集計!E1").Value & "月です。 "
      Range("集計!F1").Value = "'" & Range("集計!B1").Value & "年" & Range("集計!E1").Value & "月"
      MsgBox "あなたの設定したシフト表は・・・" & Range("集計!F1").Value & "度分です。 "
      Range("a40").Value = Range("集計!B1").Value & "年" & Range("集計!E1").Value & "月"
      MsgBox "これより指定された年/月に変更! " & Range("集計!F1").Value & "度に変更しました。 "
Sheets("集計").Select
    ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
        False
    Sheets("TOP").Select
End Sub
このように追加しましたがみやほりんさんならどう書きますか?(大)
Sheets("集計").Select
    ActiveSheet.Unprotect
    Sheets("TOP").Select

Sheets("集計").Select

    ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
        False
    Sheets("TOP").Select
お追加しました。

 Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2010/5/4  ユーザー名 : あけ'
'
    ActiveSheet.Unprotect                                             '1)選択しているシートの  保護を解除
    Range("A1").Select                                                '2)A1セルをセレクト
    ActiveCell.FormulaR1C1 = "321                                     '3)選択しているセルを 321
    ActiveSheet.Protect 'DrawingObjects:=True, Contents:=True, Scenarios:=True '4)選択しているシートの  保護
End Sub
2)〜3)のコードを 実行したいことに変更してみて下さい。
マクロの記録とコメント化したものです。上記のマクロを実行したら 参考になりますでしょうか?

(あけ)


意味が?(大)

 コードの書き方も力量も違いますから・・ (mitsu)

 大さんが試行錯誤した結果
希望する動作をしていれば、それでよいのでは?

 コードを追加した位置も間違っていないと思います。

 「うそ云々」の部分は私の早とちりだったようです。
不快な思いをさせてしまったようで、ごめんなさい。
 
さて、
Unprotect のあとにProtect しないで Exit Subするところが2箇所あります。
つまり、保護を解除したままマクロが終了してしまうことがあるということです。
これが都合が悪い、と推測した上で書かせてもらいます。対策は、
 
(1)Exit Sub する前に Protectを実行する
(2)Unprotectを 2箇所のExit Subのあとに実行する
のどちらかです。
 
(1)の場合
    Dim buf As String
    Sheets("集計").Unprotect
    Sheets("TOP").Select
    buf = InputBox("年を入力してください。" & vbNewLine & "閲覧の方はキャンセルを押してください ")
     If buf = "" Then 
         Sheets("集計").Protect DrawingObjects:=False, Contents:=True, Scenarios:= False
         Exit Sub
     End If     
     Range("集計!B1") = buf
     buf = InputBox("月を入力してください。" & vbNewLine & "閲覧の方はキャンセルを押してください ")
     If buf = "" Then 
         Sheets("集計").Protect DrawingObjects:=False, Contents:=True, Scenarios:= False
         Exit Sub
     End If     
     Range("集計!E1") = buf
     MsgBox "入力された年は" & Range("集計!B1").Value & "年です。 "
     MsgBox "入力された月は" & Range("集計!E1").Value & "月です。 "
     Range("集計!F1").Value = "'" & Range("集計!B1").Value & "年" & Range("集計!E1").Value & "月"
     MsgBox "あなたの設定したシフト表は・・・" & Range("集計!F1").Value & "度分です。 "
     Range("a40").Value = Range("集計!B1").Value & "年" & Range("集計!E1").Value & "月"
     MsgBox "これより指定された年/月に変更! " & Range("集計!F1").Value & "度に変更しました。 "
     Sheets("集計").Protect DrawingObjects:=False, Contents:=True, Scenarios:= False
 
おおむねこのようなコードになります。
 
(2)の場合は、変数bufを使いまわしているので、やりづらい。変数を二つにしてみます。
    Dim buf1 As String , buf2 As String
    Sheets("TOP").Select
    buf1 = InputBox("年を入力してください。" & vbNewLine & "閲覧の方はキャンセルを押してください ")
     If buf1 = "" Then Exit Sub
     buf2 = InputBox("月を入力してください。" & vbNewLine & "閲覧の方はキャンセルを押してください ")
     If buf2 = "" Then Exit Sub
     Sheets("集計").Unprotect
     Range("集計!B1") = buf1
     Range("集計!E1") = buf2
     MsgBox "入力された年は" & Range("集計!B1").Value & "年です。 "
     MsgBox "入力された月は" & Range("集計!E1").Value & "月です。 "
     Range("集計!F1").Value = "'" & Range("集計!B1").Value & "年" & Range("集計!E1").Value & "月"
     MsgBox "あなたの設定したシフト表は・・・" & Range("集計!F1").Value & "度分です。 "
     Range("a40").Value = Range("集計!B1").Value & "年" & Range("集計!E1").Value & "月"
     MsgBox "これより指定された年/月に変更! " & Range("集計!F1").Value & "度に変更しました。 "
     Sheets("集計").Protect DrawingObjects:=False, Contents:=True, Scenarios:= False
 
ちなみに、Range("集計!B1") という書き方を私自身はしないので
その書き方の部分はできるだけ手はつけていません。
 
(みやほりん)(-_∂)b

コメント返信:

[ 一覧(最新更新順) ]


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