[[20171120141150]] 『Worksheet_Changeを2つ以上登録する場合について』(RYU) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Worksheet_Changeを2つ以上登録する場合について[初めてのマクロです]』(RYU)

[挨拶文]
はじめまして。
務めている会社よりエクセルで仮伝票の管理を省略化したいと言われ何とかマクロを組めないかと、試行錯誤を繰り返しております。
初めてのマクロで基礎も分かっておらず、数日間悩んでおります。
マクロもWEBから参考し数値変更したものばかりです。
どなたかご教授頂けますと助かります。
この機会にマクロも始めてみたいので完全な初心者が最初に見るべきページも教えてください。


[シートとデータ]
Sheet1登録用シート/Sheet2ログ用シート/Sheet3商品マスタ登録の3シートがあります。
・登録用シート
A商品コード/B仮伝入力日付/C品名・型式/D数量/E金額/F/G備考/H/I/J確認者番号/K/Lログ用日付

・ログ用シート

・商品マスタ登録(入力済みデータ)
A商品コード(0〜99999998の数字のみ)/B/C品名・型式/D/E金額


[したいこと]
仮伝の管理をマクロで省略化
・シート1でA品名コードを入力するとシート3から検索してC品名・型式/E金額を自動入力
 ※但し99999999が入力された時は何もしない
・シート1でC品名・型式がマクロまたは手動で入力されるとB仮伝入力日付に日付を自動入力
・シート1でJ確認者番号が手動で入力されるとLログ用日付に日付を自動入力
・シート1でC品名・型式が手動で入力されるとA商品コードが空白のときのみ99999999を自動入力
・シート1でマクロボタンを押すとJ確認者番号が入力されている行のみをシート2ログ用シートの空白行の最初に転記の上、シート1から削除&空白行を詰める

[今までしてみたこと]
★★★★★シート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の件大変参考になりました。


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 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.