[[20230730160849]] 『Changeイベントで困っております』(たけ) ページの最後に飛ぶ

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

 

『Changeイベントで困っております』(たけ)

セルに入力規則(入庫.出庫.発注.棚卸.取り消し)を持たせた状態で、
セルの値に応じて背景色を変えたり消したりするコードを作りたいのですが、
別シートのセルの値(i)を参照して処理を行うところで
(i)の値を、型式.部品情報設定シートから参照したいのですが
色々試してもここがうまく動きません。
何が悪いかご教授をよろしくお願いいたします。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lRow As Long

lRow = Cells(Rows.Count, "J").End(xlUp).Row 'J列(日付け欄)の最終行を取得

Dim j
Dim k

For j = 32 To 179 Step 3

Set Rng1 = Range(Cells(45, j), Cells(lRow, j))

Next

Set Target = Rng1

For k = 12 To 61

Set i = Sheets("型式.部品情報設定").Cells(k, 30)

Next

If Intersect(Target, Rng1) Is Nothing Then
Exit Sub

    ElseIf ActiveCell.Value = "入庫" And ActiveCell.Offset(-i,0).Value = "" Then 
    ActiveCell.Offset(-i, 0).Interior.Color = RGB(255, 230, 230) 
    ActiveCell.Resize(1, 3).Interior.Color = RGB(152, 251, 152)
    ActiveCell.Font.Color = RGB(0, 0, 0)

    ElseIf ActiveCell.Value = "取消" And ActiveCell.Offset(-i, 0).Interior.ColorIndex = xlNone Then            
  Else 
    ActiveCell.Offset(-i, 0).Interior.ColorIndex = 0 
  ActiveCell.Resize(1, 2).ClearContents
    ActiveCell.Resize(1, 3).Interior.ColorIndex = 0
    End If

    If ActiveCell.Value = "発注" Then
    ActiveCell.Resize(1, 3).Interior.ColorIndex = 0
    ActiveCell.Font.Color = RGB(255, 0, 0)
    ActiveCell.Font.Bold = True

    ElseIf ActiveCell.Value = "棚卸" Then
    ActiveCell.Resize(1, 3).Interior.Color = RGB(250, 215, 250)
    ActiveCell.Font.Color = RGB(0, 0, 0)
    End If

  End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


https://www.239-programing.com/cgi-bin/excelvba_bbs.cgi?id=1517

(変なおやじ) 2023/07/30(日) 17:07:42


 うーん、なにか難しいことされていますね。
 いろいろと確認しないとゴールできない感じです。

 まず、変数はすべて型宣言したほうがよいと思います。

 (1)
 まず(何回も言っちゃいけないが)
 For j = 32 To 179 Step 3
     Set Rng1 = Range(Cells(45, j), Cells(lRow, j))
 Next
 これは何を目的としていますか?
 いまのままですと、最後のj による結果によるものしかRng1に影響しませんよ。

 (2)
 Set Target = Rng1
 Targetというのは大事な情報です。
 どこでそのイベントが発生したかを表すものです。
 それをRng1で上書きしてしまったら、情報が消えてしまいますよね。
 そのあたりは理解されているんでしょうか?

 とりあえず、ここまで。あとはほかの方にお願いします。(出かけます)
(xyz) 2023/07/30(日) 17:17:29


[[20230716075008]] 『複数のコマンドボタンの中からキャプションが』(たけ)
↑でも思いましたが、イベントのきっかけになるシートと操作したいシートが違うんですよね。たぶん。

面倒におもっているのかもしれませんが、それぞれのシートの説明をされたほうが、回答者側で状況の把握がしやすくなりますから、その辺の説明もされたほうが良いと思います。

(もこな2) 2023/07/30(日) 19:19:02


 ああ、その発言のかたでしたか。(私の"海馬"の記憶容量が狭くなったなあ。)

 それならなおさら、されたいことをまず言葉で説明していただくのがよいと、改めて思います。
 コードだけ示されて、本来の目的の説明がなく、知らぬ間に方針が変わっていた、というのが前回でした。
 今回は、その轍は踏みたくないですね。
(xyz) 2023/07/30(日) 19:40:34

 繰り返しますが、
 ・シートのレイアウトと
 ・実行したいことを
 改めて、他人にわかるように説明してください。
(xyz) 2023/07/30(日) 19:50:43

皆様、質問が分かり辛く大変申し訳ありません。

VBA初心者です。コードも意味不明なところがあると思います。
私の仕事の生産現場で使える部品在庫のシミュレーションアプリの
ような感じのものを作りたいと思っています。
最初のコードは「在庫管理シート」に対して処理を行うもので、
縦軸(J列K列)に日付と曜日があり、生産型式が20品目20列
(生産実績入力)、部品品目が50品目(1項目3列使用で150列)、
部品項目は(入庫、出庫、棚卸、発注、取り消しの入力規則列)
(入出庫数列)(在庫数列)の3列で1品目となってます。
「型式.部品情報設定」シートには日付データの始終点、生産型式、部品品目
の表示切替用チェックボックスなどがあり、
リードタイム(発注〜納品までの日数)があります。
「在庫管理シート」で部品の"入庫"日を指定すれば、リードタイムの値を
オフセットして色付けされれば発注日の目安になると思いまして
このようにしました。
"取消"もリードタイムの値で色付けされた部分を消したくて
コードを入れました。

リードタイムの値は「型式.部品情報設定」シートのAD12〜AD61で
For k = 12 To 61
Set i = Sheets("型式.部品情報設定").Cells(k, 30)
というコードを作ってみました。

For j = 32 To 179 Step 3
Set Rng1 = Range(Cells(45, j), Cells(lRow, j))
Next
日付列の最初から最終行の範囲で、部品50品目分
(1品目3列のうち、左の入力規則列に対して)繰り返し処理したいと
思っています。処理内容は、もし入力規則列が"入庫"で Offset(-i,0)
iは「型式.部品情報設定」シートのリードタイム列の値に値が無ければ
Interior.Color = RGB(255, 230, 230) に変更する

       ActiveCell.Resize(1, 3).Interior.Color = RGB(152, 251, 152)
        ActiveCell.Font.Color = RGB(0, 0, 0)

もし入力規則列が"取消"で Offset(-i,0)  iは「型式.部品情報設定」シートのリードタイム列の値
に背景色があればInterior.ColorIndex = 0
       ActiveCell.Resize(1, 2).ClearContents
       ActiveCell.Resize(1, 3).Interior.ColorIndex = 0

以下はリードタイムは考慮せづ

 If ActiveCell.Value = "発注" Then
    ActiveCell.Resize(1, 3).Interior.ColorIndex = 0
    ActiveCell.Font.Color = RGB(255, 0, 0)
    ActiveCell.Font.Bold = True
    ElseIf ActiveCell.Value = "棚卸" Then
    ActiveCell.Resize(1, 3).Interior.Color = RGB(250, 215, 250)
    ActiveCell.Font.Color = RGB(0, 0, 0)
    End If

説明が下手ですがアドバイスをよろしくお願いいたします。

 
(たけ) 2023/07/30(日) 20:57:20


皆様申し訳ありません。
別の掲示板で同じ質問をしており、回答をもらったまま
そちらへの返信が本日午後より出来なくなってしまって
いたため、こちらで新たに質問を立てさせていただいたのですが、
先ほど最初の質問掲示板に返信したところ
送信されましたので、いったんそちらでやり取りを再開しようと思います。
本当に説明不足と理解不足で皆様への失礼をお許しください。

(たけ) 2023/07/30(日) 22:02:38


 レイアウトは、行番号、列番号が明確に分かる表形式で説明するとよいと思います。
 実行内容も正直申し上げて分かりにくかったです。

 > 日付列の最初から最終行の範囲で、部品50品目分
 > (1品目3列のうち、左の入力規則列に対して)繰り返し処理したいと
 > 思っています。
 という内容なら、別にイベントプロシージャで実行する必要はないと思います。
 通常の一括処理のほうが話が明確になるでしょう。

 (ちなみに、Changeイベントプロシージャの基本的な話として下記の点をメモしておきます。
  Enterキーを押したときに自動的に下ないし右に移動する設定で使うことが多いと思います。
  その場合は、TargetとActiveCellは別のセルになることに注意したほうがよいでしょう。)

 いずれにせよ、他のサイトで議論を続けるようなので、私はこれで失礼します。
(xyz) 2023/07/31(月) 08:13:52

(xyz) 様
色々と親切にアドバイスを下さり有難うございます!
参考になります。
(たけ) 2023/07/31(月) 22:20:48

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.