- ベストアンサー
Excel 2000です。VBAを改造していただきたいのですが
入荷品のチェックシートです。B列に受領数を入力するとA列に年月日が記録されるVBAを作っていただき必要なブックのシートごとにコピーして使っていました。全品入荷完了後 別のロットにシートタブの名目を書き換えて再利用します。 ('複数セルが選択された場合、動作をキャンセル がなぜ必要かも理解できないVBAの勉強を挫折の高齢者です) B列のセル一個づつ選択削除でないとB列が空白になるだけでA列には日付が残ります。複数のセル選択で一気に日付を削除したいのです。 お助けください。 Private Sub Worksheet_Change(ByVal Target As Range) '複数セルが選択された場合、動作をキャンセル If Target.Count <> 1 Then Exit Sub If Intersect(Target, Range("B5:B1000")) Is Nothing Then Exit Sub 'B5:B1000"の範囲外は除外 Application.EnableEvents = False If Target.Value <> "" Then If IsDate(Target.Offset(, -1).Value) Then GoTo EXIT_LABEL '日付が記入済の場合は実行しない Target.Offset(, -1).Value = Format$(Now, "mm/dd hh:mm") Else 'セルを空白にした場合、日付を削除 Target.Offset(, -1).Value = "" End If EXIT_LABEL: Application.EnableEvents = True End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 元のコードを全然生かしてませんし、既に日付が入力されている等のチェック もしてませが、複数セル対応のコードです。余談ですが、 > Target.Offset(, -1).Value = Format$(Now, "mm/dd hh:mm") だと予めセルに表示形式が設定されていない場合、自動的にシステム規定の 日付時刻の表示形式が適用されるため、期待どおり表示されません。つまり、 VBA で書式化した値を代入する意味がありません。 Private Sub Worksheet_Change(ByVal Target As Range) ' マクロを動作させるセルを定義しておきます Const PERMIT_RANGE = "B5:B65536" Dim rngT As Range On Error GoTo ERROR_HANDLER Set rngT = Intersect(Target, Me.Range(PERMIT_RANGE)) If Not rngT Is Nothing Then With rngT Application.EnableEvents = False With .Offset(0, -1) If Application.CountA(rngT) > 0 Then .NumberFormat = "yy/mm/dd hh:mm" .Value = Now() Else .NumberFormat = "General" .ClearContents End If End With Application.EnableEvents = True End With Set rngT = Nothing End If Exit Sub ERROR_HANDLER: Application.EnableEvents = True MsgBox "Error(" & CStr(Err.Number) & ")" & vbLf _ & Err.Description, vbCritical End Sub
その他の回答 (3)
- taocat
- ベストアンサー率61% (191/310)
こんにちは。 VBAに挫折したけれども頑張っておられる、それも高齢者の方が、、、、 これは何が何でも手助けせねばなりませんねぇ。 既に、Wendy02さんから的を射た回答が寄せられていますが、 「VBAに挫折した高齢者」との文言もありますので も少し噛み砕いて言うと以下のようなことです。 ●提示のコードは弄らなくても、セル選択の方法を変えるだけで纏めて削除はできる ●B列(受領数)だけではなく、A列(日付)も同時に範囲選択して、Deleteキーを押して消す ●2度手間になるが A列(日付 )を範囲選択して、Deleteキー B列(受領数)を範囲選択して、Deleteキー と別々に消すこともできる ●「複数セルが選択された場合、動作をキャンセル」とは 今回のように纏めてデータを消したりするときのためである 要するに、「提示のコード」を使う限り、纏めてデータを消すときは、 消したい範囲を選択して「手動」で消さなければならないということです。 今回の場合は、A列(日付)も範囲選択して「手動」で消さなければいけないということです。 以上です。
お礼
1セル削除だと日付が消えるので、日付のセルを選択削除するなんて思ってもいませんでした。分かりやすいご説明 ありがとうございます。 ご親切な皆様にネット上でいろいろ手助けいただき、わたしのExcelは複雑ですが使いやすくエラーも無く果報者です。以前あった『PC相談』での回答に「そろそろご自分で」と誘われVBAの参考書を数冊購入しましたが吸収能力が衰えているのを実感しただけでした。数学強かった遠い昔はもう彼方ですがその代わりEcelが皆やってくれますから便利なものです。教えてくださる皆様に助けられて日々感謝で使用しております。taocatさま本当にありがとうございました。心より感謝申し上げます。
- Wendy02
- ベストアンサー率57% (3570/6232)
最初に、 >複数セルが選択された場合、動作をキャンセルがなぜ必要か それは、複数のセルが選択された時は、概ね、削除する操作なので、それは、手動でしてください、ということです。通常、イベント・ドリブン型マクロは、そのような作り方をします。 ただし、A列に、文字列とマクロで入力された日時とが混在して、文字列を残して、他は、削除したい、という場合は、またマクロを考えなくてはなりません。
お礼
ありがとうございました 分かりやすいご説明 感謝申し上げます。
- NCU
- ベストアンサー率10% (32/318)
「作っていただき必」とは誰に? 本人に依頼すべきでは? 高齢かどうかはネットでは無関係です。 もし本当に高齢者で何もわからないなら、そういう依頼をしては絶対にいけないという事をご認識下さい。 結論としては For Each...Next でループするだけですが。 誰もヒント以外書き込まないで下さい。
お礼
過去の回答者に再質問が出来ませんので。 最近初心者ですという質問が多いので、自分も分かりやすい回答を求めたく甘えてしまいました。 ご指摘ありがとうございました。 出来る限り心してまいります。お許しください。
お礼
出来ました! ありがとうございます。 VBAの世界は作り手のセンスが物凄く重要ではないかと、薄々感じて 挫折というよりは始めから断念でしが、奥の深さは魅力的です。 作っていただいた構文をコピーして、望みどおりに実行できたとき、羨望入りの強い感動を覚えます。"ヤッホー”と叫んでしまいます。 本当にありがとうございました。心より感謝申し上げます。