[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.