[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Worksheet_Change連結について』(satosi)
マクロ初心者です。
プロシージャが2つあり、つなぎ方だと思いますが
======から下が動作してくれません?
アドバイスお願いします。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim セル代入 As Range
With Target If .Count > 1 Then Exit Sub If .Value = "" Then Exit Sub If Intersect(Target, Range("C20:C500")) Is Nothing Then Exit Sub
If .Value < Range("C20").Value Then MsgBox "日付が起算日(C20セル)以前です?確認してください。" _ & vbCrLf & vbCrLf & "C28セル以前は集計対象外になるため入力不可です。" Application.EnableEvents = False .Value = "" Application.EnableEvents = True End If End With ====================
If Intersect(Target, Range("H20:H500")) Is Nothing Then Exit Sub End If Application.EnableEvents = False For Each セル代入 In Target If IsEmpty(セル代入.Value) Then セル代入.Offset(, -5).ClearContents Else If セル代入.Offset(, -5).Value = "" Then If Day(Date) >= 8 Then セル代入.Offset(, -5).Value = Format(DateSerial(Year(Date), Month(Date) + 1, 5), "gee.mm.dd") Else セル代入.Offset(, -5).Value = Format(DateSerial(Year(Date), Month(Date), 5), "gee.mm.dd") End If End If End If Next Application.EnableEvents = True End Sub よろしくお願いします。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
↓の条件に合致したからExit Subしているのでは?
If Intersect(Target, Range("H28:H500")) Is Nothing Then Exit Sub End If
動作していない、というのはどのように確認されましたか? (カリーニン) 2017/04/10(月) 16:26
参考になると思います。
http://kabu-macro.com/vba_apply/vba_ifthen.html
(カリーニン) 2017/04/10(月) 16:29
そもそも >If Intersect(Target, Range("C20:C500")) Is Nothing Then Exit Sub この条件でRange("H20:H500")の範囲は最初のうちに終了になってしまうが。 (ねむねむ) 2017/04/10(月) 16:31
>動作していない、というのはどのように確認されましたか? H列に実際に、入力をすれば C列に自動で日付が入ります。 以下のように上部分を消去し、実行すると動作します。 この説明でわかりますか?どっちも単独では動作します。 よろしくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range)
Dim セル代入 As Range
If Intersect(Target, Range("H20:H500")) Is Nothing Then Exit Sub End If Application.EnableEvents = False For Each セル代入 In Target If IsEmpty(セル代入.Value) Then セル代入.Offset(, -5).ClearContents Else If セル代入.Offset(, -5).Value = "" Then If Day(Date) >= 8 Then セル代入.Offset(, -5).Value = Format(DateSerial(Year(Date), Month(Date) + 1, 5), "gee.mm.dd") Else セル代入.Offset(, -5).Value = Format(DateSerial(Year(Date), Month(Date), 5), "gee.mm.dd") End If End If End If Next Application.EnableEvents = True End Sub
以下も単独なら動きます。
Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Count > 1 Then Exit Sub If .Value = "" Then Exit Sub If Intersect(Target, Range("C20:C500")) Is Nothing Then Exit Sub
If .Value < Range("C20").Value Then MsgBox "日付が起算日(C20セル)以前です?確認してください。" _ & vbCrLf & vbCrLf & "C20セル以前は集計対象外になるため入力不可です。" Application.EnableEvents = False .Value = "" Application.EnableEvents = True End If End With End Sub
(satosi) 2017/04/10(月) 16:40
’こんな風につなげてみたらどうですか?
Private Sub Worksheet_Change(ByVal Target As Range) Dim セル代入 As Range
With Target If .Count > 1 Then Exit Sub If .Value = "" Then Exit Sub End With
If Intersect(Target, Range("C20:C500"), Range("H20:H500")) Is Nothing Then Exit Sub
If Not Intersect(Target, Range("C20:C500")) Is Nothing Then With Target If .Value < Range("C20").Value Then MsgBox "日付が起算日(C20セル)以前です?確認してください。" _ & vbCrLf & vbCrLf & "C28セル以前は集計対象外になるため入力不可です。" Application.EnableEvents = False .Value = "" Application.EnableEvents = True End If End With
Else Application.EnableEvents = False
For Each セル代入 In Target If IsEmpty(セル代入.Value) Then セル代入.Offset(, -5).ClearContents Else If セル代入.Offset(, -5).Value = "" Then If Day(Date) >= 8 Then セル代入.Offset(, -5).Value = Format(DateSerial(Year(Date), Month(Date) + 1, 5), "gee.mm.dd") Else セル代入.Offset(, -5).Value = Format(DateSerial(Year(Date), Month(Date), 5), "gee.mm.dd") End If End If End If Next
Application.EnableEvents = True End If End Sub
(半平太) 2017/04/10(月) 16:42
(satosi) 2017/04/10(月) 16:51
↑このコード、セルにロックかけて触れなくしたら要らなくないですか?
もっとちゃんと作業の手順をコードにして書かないとだめかも?
まずは日本語でちゃんと説明してみましょう。
VBA語に翻訳は皆さんが手伝ってくれると思うので。
(まっつわん) 2017/04/10(月) 17:00
C D E F G H 日付 コード 金額 20 H29.4.5 12 12000 21 15 2000←ここへ入力時C列へ日付 D列にコード E列:コードから会社名呼びだし自動挿入 F.Gも同様です H列に数値(金額)を入力した時点でC列に日付を代入するマクロです。 また最初のプロシージャはC列途中に修正等で日付を変更する場合があり C20より以前の日付を入れた場合注意をうながすマクロです。 以上簡単ですが動作説明です。 (まっつわん) さん解りますか? (satosi) 2017/04/10(月) 17:17
なるほど、了解です。
でも、メッセージボックスで注意を促したところで、
何となくOK押したらそれっきりですよね?
条件付き書式設定で、セルの塗りつぶしの色を変える方が個人的には好きです。
(まっつわん) 2017/04/10(月) 22:42
ごめんなさい。 簡単な事と思って、動作確認しないでアップしちゃいました。
上案の以下のステートメントを変更してください。
> If Intersect(Target, Range("C20:C500"), Range("H20:H500")) Is Nothing Then Exit Sub
↓ へ変更
If Intersect(Target, Range("C20:C500,H20:H500")) Is Nothing Then Exit Sub
(半平太) 2017/04/10(月) 23:09
入力されてOK押してもクリアしますので問題ないかと・・・
(半平太)さん
えっ くくらないと駄目なんですか
ずっ〜と色々解らないながら悩んでいたのに一瞬で解決しました。
ありがとうございました。
(satosi) 2017/04/11(火) 00:02
条件を追加するならElseIfで追加したらいいと思います。
Private Sub Worksheet_Change(ByVal Target As Range) Dim セル代入 As Range Dim c As Range Dim m As Long Dim v As Variant
If Target.CountLarge > 1 Then Exit Sub
If Intersect(Target, Range("C20:C500")) Is Nothing Then If Target.Value < Range("C20").Value Then MsgBox "日付が起算日(C20セル)以前です?確認してください。" _ & vbCrLf & vbCrLf & "C28セル以前は集計対象外になるため入力不可です。" Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If
'==================== ElseIf Intersect(Target, Range("H20:H500")) Is Nothing Then Application.EnableEvents = False For Each セル代入 In Intersect(Target, Range("H20:H500")).Cells Set c = セル代入.Offset(, -5) If IsEmpty(セル代入.Value) Then v = Empty Else If IsEmpty(c.Value) Then If Day(Date) >= 8 Then m = Month(Date) + 1 Else m = Month(Date) End If v = Format(DateSerial(Year(Date), m, 5), "gee.mm.dd") End If End If c.Value = v Next End If Application.EnableEvents = True End Sub (まっつわん) 2017/04/11(火) 09:05
尚、作成いただきましたマクロですが
D.F.Hどこに入力してもWorksheet_Changeチェンジイベントが発生してしまいます。
また日付も挿入出来ませんでした。
自分なりに変更はしてみたのですが変化ありません。?
(satosi) 2017/04/11(火) 12:52
>If Intersect(Target, Range("C20:C500")) Is Nothing Then と >ElseIf Intersect(Target, Range("H20:H500")) Is Nothing Then の部分は半平太さんのVBAにあるように >If Not Intersect(Target, Range("C20:C500")) Is Nothing Then
>ElseIf Not Intersect(Target, Range("H20:H500")) Is Nothing Then ではないのか?
(ねむねむ) 2017/04/11(火) 13:08
Application.EnableEvents = False Application.Undo★ Application.EnableEvents = True 無理矢理以前の日付を入力するとUndoメゾットは失敗しました。とでて Excelが動作しなくなります、また同様に日付(C列)をdeleteしても出来なくなります。? マクロは難しいですぅ。 (satosi) 2017/04/11(火) 13:20
>Excelが動作しなくなります これだけ。 >Application.EnableEvents = False はこれ以降EnableEventsにTrueが設定されるかExcel本体が終了するまでイベントの発生を抑制する。
なのでイミディエイトウィンドウで Application.EnableEvents = True と入力してEnterを押すかいったんExcelを終了させてみてくれ。 (ねむねむ) 2017/04/11(火) 13:26
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.