Excelでは、_ExcelTips ._の他の問題で学習したように、個々のワークシートを保護できます([ツール]、[保護]、[シートの保護]の順に選択します)。このアプローチを使用すると、さまざまなhttp:// username-passwordを使用して、個々のワークシートを個別に保護できます。 .com / 14 / what-makes-a-good-password [passwords]。

つまり、1人のユーザーが1つのパスワードを使用して1つのワークシートに変更を加え、別のユーザーが別のパスワードを使用して他のワークシートに変更を加えることができます。

ただし、ワークシートへのアクセスを完全に制限したい場合はどうなりますか?

権限のないユーザーに他のワークシートを見せたくない場合はどうなりますか?この必要性に対応するのは少し難しいですが、それは可能です。基本的なアプローチは次のとおりです。

。 3つのワークシートを持つワークブックを設定します。1つは常に開いており、1つはユーザー1用、3つ目はユーザー2用です。

。ユーザー1とユーザー2のワークシートを非表示にします。

。ブックを開くたびに表示されるフォームを作成し、ユーザー名とパスワードを要求します。

。ユーザー名とパスワードに基づいて適切なワークシートのロックを解除して表示するマクロコードを作成します。

。ブック全体を保護します([ツール]、[保護]、[ブックの保護])。

手順1、2、および5は簡単に実行でき、_ExcelTips_の他の問題で取り上げられています。ただし、このアプローチの要点はステップ3と4です。次のステップに従ってユーザーフォームを作成できます。

。 Alt + F11を押して、VBAエディターを表示します。

。 VBAエディターで、[挿入]メニューから[ユーザーフォーム]を選択します。新しい空白のユーザーフォームが、フォームツールボックスとともに表示されます。

。フォームツールボックスのコントロールを使用して、ユーザーがユーザー名を入力するTextBoxコントロールを追加します。

。名前がtxtUserになるように、TextBoxコントロールのプロパティを変更します。

。フォームツールボックスのコントロールを使用して、ユーザーがパスワードを入力するTextBoxコントロールを追加します。

。名前がtxtPassになるように、TextBoxコントロールのプロパティを変更します。

。 TextBoxコントロールのすぐ下に、CommandButtonコントロールを追加します。

。 CommandButtonコントロールのプロパティを変更して、名前がbtnOK、キャプションがOKになるようにします。

ユーザーフォームを作成すると、マクロコードを配置したばかりのコントロールに関連付ける準備が整います。ユーザーフォームが選択されていることを確認し、F7キーを押してフォームのコードウィンドウを表示します。ウィンドウには、自動生成されたコードが1行か2行含まれている場合があります。これを次のコードに置き換えます:

Dim bOK2Use As Boolean

Private Sub btnOK_Click()

Dim bError As Boolean     Dim sSName As String     Dim p As DocumentProperty     Dim bSetIt As Boolean

bOK2Use = False     bError = True     If Len(txtUser.Text) > 0 And Len(txtPass.Text) > 0 Then         bError = False         Select Case txtUser.Text             Case "user1"

sSName = "u1sheet"

If txtPass.Text <> "u1pass" Then bError = True             Case "user2"

sSName = "u2sheet"

If txtPass.Text <> "u2pass" Then bError = True             Case Else                 bError = True         End Select     End If     If bError Then         MsgBox "Invalid User Name or Password"

Else         'Set document property         bSetIt = False         For Each p In ActiveWorkbook.CustomDocumentProperties             If p.Name = "auth" Then                 p.Value = sSName                 bSetIt = True                 Exit For             End If         Next p         If Not bSetIt Then             ActiveWorkbook.CustomDocumentProperties.Add _               Name:="auth", LinkToContent:=False, _               Type:=msoPropertyTypeString, Value:=sSName         End If

Sheets(sSName).Visible = True         Sheets(sSName).Unprotect (txtPass.Text)

Sheets(sSName).Activate

bOK2Use = True         Unload UserForm1     End If End Sub

Private Sub UserForm_Terminate()

If Not bOK2Use Then         ActiveWorkbook.Close (False)

End If End Sub

上記のコードはいくつかのことを行います。 2つの手順があることに注意してください。ユーザーがフォームの[OK]ボタンをクリックしたときに実行される長い手順と、フォームが終了したときに実行される手順です。ユーザーが[OK]ボタンをクリックすると、プロシージャはユーザー名とパスワードの組み合わせが正しいことを確認します。そうでない場合は、ユーザーに通知されます。そうである場合、許可されたシート名がドキュメント変数に格納され、適切なシートが表示され、保護されません。

受け入れ可能なユーザー名、シート名、およびパスワードを変更する場合は、このマクロコードの上部にある[ケースの選択]構造に必要な変更を加えることで変更できます。

このコードの2番目のマクロ(UserForm_Terminate)は、ユーザーがユーザー名とパスワードを入力せずにフォームを単純に閉じようとした場合に機能します。この場合、承認プロセスが以前に完了していなかった場合、ワークブックは単に閉じられます。

上記のコードに加えて、次のマクロをブック自体に追加する必要もあります。これらは、ブックを開いたときにユーザーフォームを開き、ブックを閉じたときにワークシートを保護します。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim w As Worksheet     Dim bSaveIt As Boolean

bSaveIt = False     For Each w In Worksheets         If w.Visible Then             Select Case w.Name                 Case "u1sheet"

w.Protect ("u1pass")

w.Visible = False                     bSaveIt = True                 Case "u2sheet"

w.Protect ("u2pass")

w.Visible = False                     bSaveIt = True             End Select         End If     Next w     If bSaveIt Then         ActiveWorkbook.CustomDocumentProperties("auth").Delete         ActiveWorkbook.Save     End If End Sub

Private Sub Workbook_Open()

UserForm1.Show End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

If Sh.Name <> "Main" Then         If Sh.Name <> ActiveWorkbook.CustomDocumentProperties("auth").Value Then             Sh.Visible = False             MsgBox "You don't have authorization to view that sheet!"

End If     End If End Sub

ユーザーがワークブックを閉じることを選択すると(作業は完了します)、該当するワークシートは再び保護され、非表示になります。 (ユーザーシートの名前とパスワードを変更する場合は、ここの[ケースの選択]構造でも変更する必要があります。)次に、マクロは適切なドキュメントプロパティを削除し、ブックを保存します。

ここでのもう1つの興味深いマクロは、Workbook_SheetActivateプロシージャです。

これは、1人のユーザーがフォーマット|を使用しようとした場合に含まれます。シート|再表示して、別のユーザーのワークシートを再表示します。この場合、ユーザーの承認済みシート名(ユーザーが最初に承認されたときにドキュメント変数に格納されている)が、表示されているシートと比較されます。一致しない場合、ユーザーはワークシートを表示できません。また、この手順は「メイン」と呼ばれるワークシートを参照していることに注意してください。このワークシートは、このヒントの冒頭で述べた3番目のワークシートです。

このワークシートは、ブックを開いたときに最初に表示されるワークシートでもあります。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

link:/ excelribbon-ExcelTipsMacros [ここをクリックして、新しいブラウザタブでその特別なページを開きます]

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(1952)は、Microsoft Excel 97、2000、2002、および2003に適用されます。