|
なるほど、それで概ね分かりました。ま、あなたの仕事の内容をお尋ねしたわけでは
ありませんから、それはともかくとして、各モジュールに存在するマクロのコード
さえ分かれば、設計の見直しは出来ます。
まず、日付シートのイベントマクロがコピーされていないのに、なぜか migi,hidari
のマクロが動作した。という理由ですが、結論から言うと "Right,Leftキーに
登録したマクロが解除されていないから" です。これはキーを開放するイベントに
Worksheet_Deactivate を使ったことによって "ブックを閉じる前に、一度他の
シート(イベントマクロを仕込んでいない)を開くことなくそのまま閉じた" ため、
イベントが発生しないままになっているわけです。無意識で閉じてしまえば、当然
起こり得る結果です。なのでイベントの種類の選定を、間違えていると言えます。
(回答者の方は何も説明されないままに、コードを組まれたのでしょうから、回答を
間違いと言ってるわけではありません。念のため。)
で、くどくど説明を続けるより、対処の仕方を指南します。
まず、原紙シートに Worksheet_Activate, Deactivate のマクロがあれば、それを
削除して下さい。そして標準モジュールに以下のマクロを入れて下さい。
Private Hck As Boolean 'モジュールの先頭に宣言
Sub Auto_Open()
Dim x As Integer
With Application
.OnKey "{RIGHT}", "migi"
.OnKey "{LEFT}", "hidari"
.OnDoubleClick = "R_Hidden_Change"
End With
ThisWorkbook.OnSheetActivate = "Flg_Off"
x = Day(Date) - 1
Worksheets(x).Activate
End Sub
Sub Auto_Close()
With Application
.OnKey "{RIGHT}"
.OnKey "{LEFT}"
.OnDoubleClick = ""
End With
ThisWorkbook.OnSheetActivate = ""
End Sub
Sub migi()
With ActiveCell
If .Column > 254 Then Exit Sub
If .Offset(, 1).Value = "-" Then
.Offset(, 2).Select
Else
.Offset(, 1).Select
End If
End With
End Sub
Sub hidari()
With ActiveCell
If .Column < 3 Then Exit Sub
If .Offset(, -1).Value = "-" Then
.Offset(, -2).Select
Else
.Offset(, -1).Select
End If
End With
End Sub
Sub Flg_Off()
Cells.EntireRow.Hidden = False
Range("A1").Select
Hck = False
End Sub
Sub R_Hidden_Change()
If ActiveCell.Row > 1 Then Exit Sub
On Error Resume Next
If Hck = False Then
If WorksheetFunction.CountA(Range("B:B")) = 0 Then
MsgBox "B列に値がありません", 48: Exit Sub
End If
Range("B1", Range("B65536").End(xlUp)) _
.SpecialCells(4).EntireRow.Hidden = True
Hck = True
Else
Cells.EntireRow.Hidden = False
Hck = False
End If
End Sub
標準モジュールは、上記のマクロだけあればいいです。
>Kein さんからの集計処理
は先にレスしたように、原紙シートで一定のセル範囲に対して表を作り、その最終行
に合計の数式を入れておく、という仕様にすることで不要になるばです。いちいち
最終入力行を求めて、その一行下に数式を入れて・・という形にするより合理的、
ということが理解されたと思うからです。
>シート作成(Sub ThisMonth_Make_NewBook())
これはいちおう、月毎のブック"以外"から作成することを前提にしていたので、
月毎のブックそのものに入れてしまうのは、ちょっと違和感がありますけどね・・。
ま、その方が便利と思うなら、入れておいても構いません。
とにかく今回は、ご覧のように新しいマクロも含めて提示してみましたが、簡単に
説明すると「本来シートモジュールやThisWorkbookモジュールに入れるイベント
マクロを、全て標準モジュール用に書き直し、インポートファイルが一つで済む
ようにした」ということです。
migi,hidari のマクロは、ちょっと手直ししただけです。
Auto_Open, Auto_Close は、ブックを開いたとき、閉じたときに発生するイベント
です。ここにキーへのマクロ割り当てと、その開放をする OnKey のコードを持って
きたことによって、ブックを開いてすぐに、どのシートでもキーアクションを使え、
閉じると自然に開放されるようになります。あと、空白行の表示・非表示については
どのシートでも一行目(項目があると仮定した)の任意のセルをダブルクリックする
ことで、起動するようにしました。それで使い勝手が良くなっていると思います。
あとOnSheetActivate は、任意のシートを開いたときの初期設定をしているだけです。
なお、これらのイベントについては OnKey を除いて、今どきのExcelではヘルプに
出てきません。なぜならそれは Excel95以前に使われていたものだからですが、
決して機能が劣るから使われなくなったのではありません。むしろコーディングの
柔軟性は、現在のイベントマクロより優れていると思われます。今回のように適材適所
の使い方をすれば、まだまだ活用できると考えています。
もう一度、上記の標準モジュールをエクスポートし、ブックを作り直してみて下さい。
|
|