[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Worksheet_Changeを2つ以上登録する場合について[初めてのマクロです]』(RYU)
[挨拶文]
はじめまして。
務めている会社よりエクセルで仮伝票の管理を省略化したいと言われ何とかマクロを組めないかと、試行錯誤を繰り返しております。
初めてのマクロで基礎も分かっておらず、数日間悩んでおります。
マクロもWEBから参考し数値変更したものばかりです。
どなたかご教授頂けますと助かります。
この機会にマクロも始めてみたいので完全な初心者が最初に見るべきページも教えてください。
・ログ用シート
・商品マスタ登録(入力済みデータ)
A商品コード(0〜99999998の数字のみ)/B/C品名・型式/D/E金額
[今までしてみたこと]
★★★★★シート1マクロに入力★★★★★
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 10 Then '←の10はJ列のこと Cells(Target.Row, 12).Value = Date '←の12はL列に日付 End If If Target.Column = 3 Then '←の3はC列のこと Cells(Target.Row, 2).Value = Date '←の2はB列に日付 If Target.Column = 3 Then '←の3はC列のこと Cells(Target.Row, 1).Value = 99999999 '←の1はA列に99999999を入力 End If End If End Sub
★★★★★シート1マクロに追記したいこと★★★★★
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s As Worksheet, r As Range
If Target.Count <> 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
Set s = Sheets("ログ用シート")
Set r = s.Columns(1).Find(what:=Target, lookat:=1)
If Not r Is Nothing Then
Rows(Target.Row).Value = s.Rows(r.Row).Value
Else
MsgBox "該当する番号は登録されていません。番号を確認してください。"
End If
End Sub
★★★★★シート1マクロボタンに入力★★★★★
Sub kesikomizumi()
Dim i, LastRow As Long LastRow = Cells(Rows.Count, 10).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = "4" Or Cells(i, 10) = "7" Or Cells(i, 10) = "8" Or Cells(i, 10) = "3" Or Cells(i, 10) = "5" Then '←の4,7,8,3,5の番号の時のみ Rows(i).Cut Sheets("ログ用シート").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) '貼り付けしたいシート名 Rows(i).Select Selection.Delete Shift:=xlUp
End If
Next i End Sub
★★★★★"シート1マクロに入力"と"シート1マクロに追記したいこと"をまとめたが後半が動作せずうまく行かず★★★★★
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s As Worksheet, r As Range
If Target.Count <> 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
Set s = Sheets("商品マスタ登録")
Set r = s.Columns(1).Find(what:=Target, lookat:=1)
If Not r Is Nothing Then
Rows(Target.Row).Value = s.Rows(r.Row).Value
Else
MsgBox "該当する番号は登録されていません。番号を確認してください。"
End If
If Target.Column = 10 Then '←の10はJ列のこと Cells(Target.Row, 12).Value = Date '←の12はL列に日付 End If If Target.Column = 3 Then '←の3はC列のこと Cells(Target.Row, 2).Value = Date '←の2はB列に日付 If Target.Column = 3 Then '←の3はC列のこと Cells(Target.Row, 1).Value = 99999999 '←の1はA列に99999999を入力 End If End If End Sub ※20100517190949を見ましたが理解できず ※99999999入力済み時の「なにもしない」指定方法がわからず ※上記動作する前でお手上げ状態ですのでわかりませんが99999999自動入力時にマクロが繰り返す又は前半マクロが動作してしまうと思います。
※文章力がなく、きっちり説明が出来ていない場合は申し訳ございません。
< 使用 Excel:Excel2013、使用 OS:Windows10 >
Worksheet_Changeを2つ以上登録する場合について
同じイベントプロシージャは複数作れない(複数あってもどれをどのとき実行するか不明)ので、
マクロが起動された後、変数「Target」に渡されたRangeオブジェクトの列番号によって、
処理を条件分岐します。
つまり、
1列目が変更された場合はこうする。
10列目ならこうする。
3列目ならこうする。
ということを書けばいいわけです。
条件分岐と言えばIF文ですが、
ルールに対して真と偽の2通りしか書けません。
こういう時は、Select Case文を使うのが解りやすいと思います。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s As Worksheet, r As Range If Target.CountLarge <> 1 Then Exit Sub
Select Case Target.Column Case 1 '一列目が変更された場合 If WorksheetFunction.CountIf(Sheets("商品マスタ登録").Columns(1), Target.Value) = 0 Then MsgBox "該当する番号は登録されていません。番号を確認してください。" Application.EnableEvents = False Target.Value = Empty Application.EnableEvents = True End If
Case 10 '10列目の場合 Cells(Target.Row, 12).Value = Date '←の12はL列に日付
Case 3 '←の3はC列のこと Cells(Target.Row, 2).Value = Date '←の2はB列に日付 If IsEmpty(Cells(Target.Row, 1).Value) = True Then Cells(Target.Row, 1).Value = 99999999 '←の1はA列に99999999を入力 End If End Select End Sub
それから、
>この機会にマクロも始めてみたいので完全な初心者が最初に見るべきページも教えてください。
僕がいつもおすすめしているのは、
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/index.html
http://www.asahi-net.or.jp/~ef2o-inue/top01.html
http://home.att.ne.jp/zeta/gen/excel/
この辺りです。
あと、VBAも含めたエクセル全般で押さえておきたいのは、
http://officetanaka.net/
http://www.relief.jp/
↑の2つは、皆さん大変お世話になっていると思います。
他にも、必要に応じて検索したら、エクセルVBAの情報は豊富にあります^^
(まっつわん) 2017/11/20(月) 16:18
上記のコードで試してみましたが
・商品マスタより探し登録用シートへ1行コピペの部分が動かない
・99999999入力が消える
といった状態になったので以下の通り修正してみました。
これで動いてはいるようなのですがおかしな所など御座いますでしょうか?
Select Caseの件大変参考になりました。
Dim s As Worksheet, r As Range If Target.CountLarge <> 1 Then Exit Sub
Select Case Target.Column Case 1 '一列目が変更された場合 If Target.Count <> 1 Then Exit Sub If Target.Column <> 1 Then Exit Sub Set s = Sheets("商品マスタ登録") Set r = s.Columns(1).Find(what:=Target, lookat:=1) If Not r Is Nothing Then Rows(Target.Row).Value = s.Rows(r.Row).Value Else MsgBox "該当する番号は登録されていません。番号を確認してください。" End If
Case 10 '10列目の場合 Cells(Target.Row, 12).Value = Date '←の12はL列に日付
Case 3 '←の3はC列のこと Cells(Target.Row, 2).Value = Date '←の2はB列に日付 If IsEmpty(Cells(Target.Row, 1).Value) = True Then Cells(Target.Row, 1).Value = 99999999 '←の1はA列に99999999を入力 End If End Select End Sub
(RYU) 2017/11/20(月) 18:21
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.