Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


952 / 13645 ツリー ←次へ | 前へ→

【77245】パスワードでロック 翔子 15/6/25(木) 17:23 質問[未読]
【77246】Re:パスワードでロック マナ 15/6/25(木) 20:26 発言[未読]
【77247】Re:パスワードでロック 翔子 15/6/25(木) 21:01 質問[未読]
【77249】Re:パスワードでロック マナ 15/6/25(木) 22:11 発言[未読]
【77250】Re:パスワードでロック 翔子 15/6/26(金) 11:12 質問[未読]
【77257】Re:パスワードでロック マナ 15/6/26(金) 19:53 発言[未読]
【77271】Re:パスワードでロック 翔子 15/6/27(土) 23:23 質問[未読]
【77248】Re:パスワードでロック β 15/6/25(木) 21:07 発言[未読]
【77272】Re:パスワードでロック 翔子 15/6/28(日) 2:31 質問[未読]
【77273】Re:パスワードでロック β 15/6/28(日) 6:18 発言[未読]
【77299】Re:パスワードでロック 翔子 15/7/4(土) 1:35 質問[未読]
【77300】Re:パスワードでロック β 15/7/4(土) 13:58 発言[未読]
【77310】Re:パスワードでロック 翔子 15/7/4(土) 23:23 質問[未読]
【77314】Re:パスワードでロック β 15/7/5(日) 6:46 発言[未読]
【77328】Re:パスワードでロック 翔子 15/7/7(火) 9:55 質問[未読]
【77329】Re:パスワードでロック 翔子 15/7/7(火) 10:29 お礼[未読]

【77245】パスワードでロック
質問  翔子  - 15/6/25(木) 17:23 -

引用なし
パスワード
    宜しくおねがいします

パスワードでロックされているセルに、
コマンドボタン、普通のボタンでの処理は下記の書き方でいいんですよね?

Sub 保護パス()
  With Sheets("Sheet1")
    .Unprotect Password:="1111"
    ' 処理
    .Protect Password:="1111", DrawingObjects:=True, _
      Contents:=False, Scenarios:=True
  End With
End Sub

例えば

Private Sub CommandButton1_Click()
  
With Sheets("注文書") '注文書シートロック解除
    .Unprotect Password:="111" '注文書シートロック解除パス
  
  Dim lRow As Long, i As Long
  Dim ListNo As Long
  Dim TextNo As Long
    ListNo = ListBox1.ListIndex + 2
    If ListNo = 0 Then
      MsgBox "いずれかの行を選択して、数量を入力してください"
      Exit Sub
    End If
    Worksheets("注文書").Range("E2").Value = Worksheets("詳細").Cells(ListNo, 5)
    Worksheets("注文書").Range("E3").Value = Worksheets("詳細").Cells(ListNo, 6)
  Unload Me
  
.Protect Password:="111", DrawingObjects:=True, _
      Contents:=False, Scenarios:=True '注文書シートロック
  End With
End Sub
ですが、処理が終わった後、パスワードがあかからないのです。
なんででしょうか
宜しくおねがいします


【77246】Re:パスワードでロック
発言  マナ  - 15/6/25(木) 20:26 -

引用なし
パスワード
   ▼翔子 さん:

回答ではありませんが
以下は、期待通りの動作していますか?

>    ListNo = ListBox1.ListIndex + 2
>    If ListNo = 0 Then

【77247】Re:パスワードでロック
質問  翔子  - 15/6/25(木) 21:01 -

引用なし
パスワード
   マナ 様

>回答ではありませんが
>以下は、期待通りの動作していますか?
>>    ListNo = ListBox1.ListIndex + 2
>>    If ListNo = 0 Then
自分がのやりたい事が参考に
かいてましたから打ったのです。
Sheet詳細のセル内の値を
リストボックスに反映すると言う
意味ですよね?

【77248】Re:パスワードでロック
発言  β  - 15/6/25(木) 21:07 -

引用なし
パスワード
   ▼翔子 さん:

マナさんご指摘の件は、よ〜く、考えてみて下さいね。
それはさておき、アップされたとおりのコードでユーザーフォームでボタンクリック。
処理後は、ちゃんと注文書シートがパスワード付で再保護されていましたよ。

ところで、

保護解除
マクロでセルに書き込み
再保護

って面倒じゃないですか?

ThisWorkbookモジュールに

Private Sub Workbook_Open()
  '注文書シートロック UserInterfeceOnly付
  Sheets("注文書").Protect Password:="111", DrawingObjects:=True, _
      Contents:=False, Scenarios:=True, UserInterfaceOnly:=True
End Sub

こう書いておくと、操作者からはプロテクト、マクロは自由自在で
いちいち、解除/再保護する必要がなくなりますよ。

【77249】Re:パスワードでロック
発言  マナ  - 15/6/25(木) 22:11 -

引用なし
パスワード
   ▼翔子 さん:

私が気になったのは、そこではありません。

>MsgBox "いずれかの行を選択して、数量を入力してください"

が実行されるような操作をしてみてください。
たぶんMsgboxが表示されないと思います。

ListBoxで選択されたかどうかの判定はこんな感じです。
If ListBox1.ListIndex=-1 then

ListIndexについて、ヘルプやネット検索で調べてみてください。

【77250】Re:パスワードでロック
質問  翔子  - 15/6/26(金) 11:12 -

引用なし
パスワード
   マナ 様

If ListNo = 0 Then
テキストBOXが入ってない時、texttNo = 0 Then
リストBOXが選択がない時、ListIndex=-1 then
でした。
ご指摘ありがとうございます。

【77257】Re:パスワードでロック
発言  マナ  - 15/6/26(金) 19:53 -

引用なし
パスワード
   ▼翔子 さん:

本題のシート保護の件については、
βさんも仰っていますが、ちゃんと再保護されると思います。

ところで、

>Contents:=False

なので、保護されていても、
セルの書き込みはできて当然なのですが
そこは誤解ありませんよね?

ご提示の詳細から注文書へ転記するマクロについては、
シート保護を解除しなくても実行可能なのになぜ?
という疑問もありましたので、念のため確認です。

【77271】Re:パスワードでロック
質問  翔子  - 15/6/27(土) 23:23 -

引用なし
パスワード
   マナ 様

Contents:=True
でした。

>ご提示の詳細から注文書へ転記するマクロについては、
>シート保護を解除しなくても実行可能なのになぜ?
>という疑問もありましたので、念のため確認です。

保護、解除は後からつけたのです。
最初に、詳細から注文書へ転記するマクロっを書いて

詳細シートを一般機能で保護。
注文書へ転記するのに、何故か保護解除しなくても転記できてしまいまして

【77272】Re:パスワードでロック
質問  翔子  - 15/6/28(日) 2:31 -

引用なし
パスワード
   β 様

ThisWorkbookモジュールに

Private Sub Workbook_Open()
  '注文書シートロック UserInterfeceOnly付
  Sheets("注文書").Protect Password:="111", DrawingObjects:=True, _
      Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
End Sub
確かに楽ですね。勉強になりました。

質問1
注文書E2,E4,G4は入力出来るようにしたいのです。

質問2

標準モジュールに以下のモジュール
Sub auto_open()
  Sheets("注文書").Select
    Range("A1").Value = Date
End Sub
を書いたら、ちゃんと日付がでました。

auto_openは、Sheetモジュール、標準モジュール、ThisWorkbookモジュール
何処に書いても良いのですか?

【77273】Re:パスワードでロック
発言  β  - 15/6/28(日) 6:18 -

引用なし
パスワード
   ▼翔子 さん:

>auto_openは、Sheetモジュール、標準モジュール、ThisWorkbookモジュール
>何処に書いても良いのですか?

ThisWorkbookモジュールのWorkbook_Open、標準モジュールの Auto_Open いずれも
ブックが開かれたときに自動実行されます。
これらのプロシジャは、それ以外のモジュールに書いても機能しません。

なお、Auto_Open は、別ブックのマクロから、このマクロブックが開かれた場合は機能しません。(自動実行されません)
Workbook_Openのほうは、その場合にも自動実行されますので、こちらを使うのが一般的ですね。
Auto_Open は、やや、古い手法。いずれにしても、どちらか一方にしたほうがいいですよ。

>質問1

>注文書E2,E4,G4は入力出来るようにしたいのです。

質問の意味がよくわかりませんので、ペつのポイントでメモします。(少し長くなりますが)

1.まず、シートの保護で、セルの入力を禁止するためには、その前に「セル書式のロック」を
 設定しなければいけません。別の言い方をすれば
 ・セル組織でセル保護(ロック)をしてもシート保護をしなければ有効にはなりません。
 ・また、セル保護(ロック)をはずすと、シート保護をかけても、そのセル入力が可能になります。
 まお、初期値、シート上の全セルの保護はロックに設定されています。

2.シート保護のダイアログ
 ・シートとロックされたセルの内容を保護する(C)
  ここにチェックをいれなければシート保護操作そのものができません。
  マクロコードとしては、Contents:=True ですが、逆にいえば、操作で設定すれば Contents:=False にはなりません。
  Contents:=False は、セルロックがかかっていてもかかっていなくても、入力が可能というシート保護。
  ですからマナさん指摘のとおり「意味がないですね。」ということになります。
 ・操作者に許可する、ロックされたセル、されていないセルの範囲の選択可否は以下の組み合わせのみ
  ロックされたセル範囲の選択     チェック  チェックなし  チェックなし
  ロックされていないセル範囲の選択  チェック  チェックなし  チェック
  初期値として表示されるのは両方にチェックがついた形ですね。 で、ここでの選択結果は Protectメソッドコードには
  あらわれません。
  その組み合わせに従って、シート.EnableSelection = 選択された組み合わせ条件 というコードになります。
  (両方チェックすれば、デフォルトの NoRistriction になりますが、マクロ記録では生成されません)

3.マクロ内でのProtectメソッドの留意点
  シート保護のダイアログには操作者に許可する様々な操作の選択ができます。
  で、UserInterface付保護であろうが、保護解除後の再保護であろうが、マクロでのProtectメソッドは
  【それぞれの条件を、引数としてコード内で指定】することが必要です。
  別の言い方をすれば【指定しない条件】については、【エクセルが定めたデフォルト】になってしまうということです。
  エクセルが定めたデフォルトは、まっさらなシートでシート保護ダイアログを表示した時の状態、つまり
  【すべての操作を許可しない】ということになります。
  かりに、並び替えOKという設定がされていたとしても、マクロで AllowSorting:=True と明記しなければ
  そのあと、操作者が並び替えをしようとしてもできなくなります。【要注意】です。
  以下のいずれかにする必要があります。
 ・操作で保護した時の条件を、その通りにすべて記述
 ・あるいは、すべての条件に対して、操作で設定されている値を引き継ぐ

【77299】Re:パスワードでロック
質問  翔子  - 15/7/4(土) 1:35 -

引用なし
パスワード
   β様

お返事大変遅くなりすみません。

詳しい説明ありがとうございます。
理解するのに時間がかかりそうです。

>注文書E2,E4,G4は入力出来るようにしたいのです。
注文書には、(氏名1、氏名2、TEL)をお客に入力してもらうからです。

【77300】Re:パスワードでロック
発言  β  - 15/7/4(土) 13:58 -

引用なし
パスワード
   ▼翔子 さん:

うんちくをタラタラ述べた理由は、コメントしましたように「質問の意図」というか
なぜ、この質問を出されたのかがわからなかったので、まとはずれかもしれませんけど
いくつかメモしたものの中に、翔子さんが、あぁ、これか! と発見いただけるかなと。

>>注文書E2,E4,G4は入力出来るようにしたいのです。
>注文書には、(氏名1、氏名2、TEL)をお客に入力してもらうからです。

入力すればいいと思いますが、入力できなくなっているということでしょうね?
メモの中にもありますが、シート保護をすると、セル書式の保護でロックされているセルの入力はできなくなります。
セル書式の保護は、初期値は全セル、保護、つまり、シート保護を掛けると入力できなくなります。

逆にいえば、シート保護をかけても、このセルとこのセルは操作者の入力をさせたいということなら
それらセルを選び、セル書式の保護タブのロックのチェックをはずせばいいんですが?

【77310】Re:パスワードでロック
質問  翔子  - 15/7/4(土) 23:23 -

引用なし
パスワード
   β様


>この質問を出されたのかがわからなかったので
すみません。説明が下手で。

最初は、注文書Sheet[E2,E4,G4] 外を一般機能を使い
保護解除→マクロでセルに書き込み→再保護と考えていました。

β様が
保護解除→マクロでセルに書き込み→再保護
>って面倒じゃないですか?
>ThisWorkbookモジュールに
>Private Sub Workbook_Open()
>  '注文書シートロック UserInterfeceOnly付
>   Sheets("注文書").Protect Password:="111", DrawingObjects:=True, _
>      Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
> End Sub
>こう書いておくと、操作者からはプロテクト、マクロは自由自在で
>いちいち、解除/再保護する必要がなくなりますよ。
と教えてくれました。
私は、VBAは勉強中なので「こんなやり方があったんだ」と思い
β様のやり方で、注文書Sheet[E2,E4,G4]だけをContents:=Falseに
すれえば良い思って。
  '注文書シートロック UserInterfeceOnly付
  Sheets("注文書").Protect Password:="111", DrawingObjects:=True, _
      Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
   Sheets("注文書").Range("E2.E4,G4").Contents:=False
End Sub
としたんですがダメでした。

注文書シート保護をかけても("E2.E4,G4")セルは操作者の入力をさせたい
のです。

宜しくおねがいします

【77314】Re:パスワードでロック
発言  β  - 15/7/5(日) 6:46 -

引用なし
パスワード
   ▼翔子 さん:

マクロ処理をしなくても、手作業で、注文書シートの該当セルの書式を変更しておけばいいのでは?
と思ったんですが、マクロでやるなら。

Sub TestProtect()

'注文書シートロック UserInterfeceOnly付
  With Sheets("注文書")
    .Protect Password:="111", DrawingObjects:=True, _
      Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
    .Range("E2,E4,G4").Locked = False
  End With
End Sub

【77328】Re:パスワードでロック
質問  翔子  - 15/7/7(火) 9:55 -

引用なし
パスワード
   ▼β様

>マクロ処理をしなくても、手作業で、注文書シートの該当セルの書式を変更して>おけばいいのでは?

手作業でロックしたら、注文書Sheetに

'1 Sheet注文書(E2)コードを入力enterで
'2 Sheet詳細(E列コード),(F列品名)から
' Sheet注文書(E3)に品名を持ってくる
'Sheet注文書での処理
'3 D6に値が入ったら、C6にE3の品名が入るように。
'4 D7に値が入ったら、C7にE3の品名が入るように。
'5 D8に値が入ったら、C8にE3の品名が入るように。
'6 D9に値が入ったら、C9にE3の品名が入るように。
'7 D10に値が入ったら、C10にE3の品名が入るように。

'入力のあったセルが [E2]のときは (1) を実行し、
'[D6:D10]のときは (2)を実行するように If〜 Else〜 End If構文で分岐処理

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range
Dim c As Range
'(1) -----------------------------------------------------------
If Target.Address(0, 0) = "E2" Then
  Dim m As Variant
  With Worksheets("詳細") '別シートのコード照合セル範囲
     Set Rg = .Range("E2", .Cells(.Rows.Count, "E").End(xlUp))
  End With
  Application.EnableEvents = False
  If IsEmpty(Target) Then
    Target.Offset(1).ClearContents
  Else
    m = Application.Match(Target, Rg, 0) 'Match関数で検索
     If IsNumeric(m) Then
      Target.Offset(1).Value = Rg.Item(m, 2).Value
    Else
      Target.Offset(1).ClearContents
      MsgBox "入力されたコードはありません"
    End If
  End If
  Application.EnableEvents = True
 
'(2) -----------------------------------------------------------
Else
  Set Rg = Intersect(Target, Range("D6:D10"))
  If Rg Is Nothing Then Exit Sub

   Application.EnableEvents = False
  For Each c In Rg
    If Not IsEmpty(c.Value) Then
      c.Offset(, -1).Value = Range("E3").Value
    End If
  Next
  Application.EnableEvents = True
End If
End Sub
が、作動しないのです。

Sheets("注文書")E2,E4,G4以外ロック。

Sheets"詳細")A1:F893にロック。

Private Sub Workbook_Open()
Sheets("注文書").Select
      Range("A1").Value = Date

【77329】Re:パスワードでロック
お礼  翔子  - 15/7/7(火) 10:29 -

引用なし
パスワード
   β様

思うようにできました
本当にありがとうございます。

952 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free