サンプルコードです。
必ず、該当ブックのコピーを取ってから試してください。
■シート名簿■
-----------------------------------------------------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.Count > 1 Then Exit Sub
If Target.Column <> 10 Then Exit Sub
If Target.Row < 3 Then Exit Sub
Cancel = True
If Target.Value = "" Then Exit Sub
With Sheets("印刷")
.Range("E15:E17").Value = _
Application.Transpose(Cells(Target.Row, 7).Resize(, 3).Value)
.Range("AA16").Value = Cells(Target.Row, 10).Value
.Range("AQ16").Value = Cells(Target.Row, 11).Value
.Range("AX16").Value = Cells(Target.Row, 12).Value
End With
With Sheets("施設")
.Range("C3").Value = Cells(Target.Row, 10).Value
End With
Sheets("施設").Select
End Sub
---------------------------------------------------------------
■シート施設■ シートがアクティブになったとき
---------------------------------------------------------------
Private Sub Worksheet_Activate()
Dim myRange As Range
Dim FindCell As Range
Dim LastRow As Long
Dim LastClm As Integer
Dim R As Long
If Range("C3").Value = "" Then Exit Sub
LastRow = Range("A65536").End(xlUp).Row
Range(Cells(5, "C"), Cells(LastRow, "C")) = 0
For R = 5 To LastRow
Set FindCell = Rows(R).Find(what:=Range("C3").Value, LookIn:=xlValue, LookAt:=xlWhole)
If Not FindCell Is Nothing Then
Cells(FindCell.Row, "C").Value = 1
End If
Next R
If WorksheetFunction.CountIf(Range("C5:C" & LastRow), 1) = 0 Then Exit Sub
LastClm = 3
For R = 5 To LastRow
If LastClm < Cells(R, "IV").End(xlToLeft).Column Then
LastClm = Cells(R, "IV").End(xlToLeft).Column
End If
Next R
Set myRange = Range("A5", Cells(LastRow, LastClm))
myRange.Sort Key1:=Range("C5"), Order1:=xlDescending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False
End Sub
'------------------シート右クリック------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim Msg
Dim myRange As Range
Dim LastClm As Integer
If Target.Count > 1 Then Exit Sub
If Target.Column > 2 Then Exit Sub
If Target.Row < 5 Then Exit Sub
Cancel = True
If Target.Value = "" Then Exit Sub
If Range("C3").Value = "" Then
MsgBox "会員が選択されていません", vbCritical + vbOKOnly
Sheets("名簿").Select
Exit Sub
End If
Msg = MsgBox("施設は、" & Cells(Target.Row, "B").Value & " でいいですか?", _
vbInformation + vbYesNo, "処理確認")
If Msg = vbNo Then
MsgBox "正しい施設を選択してください", vbOKOnly, "確認"
Exit Sub
End If
LastClm = Cells(Target.Row, "IV").End(xlToLeft).Column
Set myRange = Range(Cells(Target.Row, "C"), Cells(Target.Row, LastClm))
If WorksheetFunction.CountIf(myRange, Range("C3").Value) = 0 Then
Cells(Target.Row, LastClm + 1).Value = Range("C3").Value
End If
Sheets("印刷").Range("C10").Value = Cells(Target.Row, 2).Value
With Sheets("管理簿").Range("A65536").End(xlUp)
.Offset(1, 0).Value = Date
.Offset(1, 1).Value = Sheets("印刷").Range("C10").Value
.Offset(1, 2).Value = Sheets("印刷").Range("AA16").Value
.Offset(1, 3).Value = "1"
.Offset(1, 4).Value = "窓口印"
.Offset(1, 5).Value = "窓口担当"
End With
'Worksheets("印刷").PrintOut
Worksheets("印刷").PrintPreview 'テスト用印刷プレビュー
Range("C3").ClearContents
Sheets("名簿").Select
End Sub
---------------------------------------------------------
■注意事項と全体の流れ■
(1)「名簿シート」の「氏名」セルの右クリックで、「氏名」を「施設シート」のセル”C3”に代入、及び必要項目を「印刷シート」の該当セルに代入し、「施設シート」をアクティブにする
(2)「施設シート」の列A(カナ)列B(施設名)の右クリックで、「印刷シート」「管理簿シート」に必要事項を代入し印刷し、印刷が終わったら、セルC3の名前をクリアーし、「名簿シート」に戻る
●ここからが機能追加の部分●
(3)上記(2)の時点で、クリックした施設名と同じ行の、D列以降(D,E,F。。。)に、今回の利用者、セルC3の値をセットする。
(4)説明が前後しますが、今回の利用者が以前利用した施設があった場合その施設を最初の方に表示させるために並べ替えを使っています。
並べ替えのキー列をC列とし、セルC3の利用者が以前利用していた施設と同じ行のC列に、1、を立て、また利用していない場合は0になるように検索の前に全てに0をセットして、検索が終了したら、C列で降順に並べ替えしています。
そしてこれらは全て、上記(1)のあと「施設シート」がアクティブになったときの処理です。
一応、テストはしてありますので安心して試してみてください。
いや~、文字での説明は難しいっ!(^^;;;
乗りかかった船ですので完成までお付き合いしませう。
以上です。
お礼
すごいです。 もう完璧です。 大変ありがとうございました。完全に作動します。 こちらは、Win2000 で Excel2002 を使用しています。 B列(備考1)は、テキストを入力していても0か1に書き換えられるようになっていますので、列のタイトルを「ソートキー」として使用することにしました。 ここまで、懇切丁寧に教えていただき、泣けるほど嬉しいです。 いただいたコードを勉強し、せめてこの意味を他人に説明できるようにはしたいと思います。 そのときは、このサイトでonlyrom様にどれだけ親切に教えていただいたかを話したいと思います。 本当に本当にありがとうございました。大感激です。