[[20220622132119]] 『赤文字で入力してある所を確認すると黒くなるよう』(きらら) ページの最後に飛ぶ

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

 

『赤文字で入力してある所を確認すると黒くなるようにしたいです。』(きらら)

この様に必要な個所に赤色文字で記入してある欄だけクリックを押すと黒になり保存が出来るようにしたいです。
見過ごしが多い為確認出来るようにできませんでしょうか?

 ___A___   ___B___  ___C___  __D__  __E__   ___F___   ___G___   ___H___
  1  会社名   伝票     ケース  日付
  2  住所       
  3 TEL     
  4 到着日  
  5
  6  製品名     ケース     数量    重量     単価
 _____________________________________________________________________________________ 
  7  製品1      1          10      30    300
  8  製品2      1           5      50        250
  9  製品3      1           3      80        240
 10  製品4      2      1     100        100
 11 
 12_____________________________________________________________________
 13   total    ケース      個数    260       合計  
   ___A___   ___B___  ___C___  __D__ ___E___   ___F___   ___G___

< 使用 Excel:unknown、使用 OS:unknown >


追記
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Font.ColorIndex = 3 Then
'(もし、Targetの文字のカラーインデックスが3番(赤)なら)

Target.Font.ColorIndex = 1
'(Targetの文字のカラーインデックスを1番(黒)に変えなさい)

Else
'(そうでないならば)

Target.Font.ColorIndex = 3
'(Targetの文字のカラーインデックスを3番(赤)に変えなさい)

End If
'(If文の終了を意味するコード)
End Sub

このマクロで全部が黒になった時に保存できるようにしたいです。
(きらら) 2022/06/22(水) 13:32


もっと簡単でいいのですが、黒文字になった時は保存出来て、赤文字がある場合は、エラー表示が出るようにしたいです。
(きらら) 2022/06/22(水) 13:40

 回答じゃなくてアレなんですが...

 >見過ごしが多い
 ↑これを改善するのが目的なのであれば、

 >クリックを押すと黒になり保存
 という仕様は改善策としては「マズい」部類の策だと思います。
 結局「見過ごし」は減らないでしょうね。

 だって、クリックは目を瞑ってても、よそ見してても出来ちゃうし、
 そもそもクリックなんて確認行為以前に、パソコン上での一般的な「所作」でしょ?

 少なくとも自分の仕事相手が、そんな仕組みで「チェック済です!」とか言い張ってたら
 全面的に信用しませんね。
 おそらく「作ったけど使えない」仕組みになりそうな匂いがします。

 そもそも赤文字にした「理由」というか「判断基準」があるんでしょうから
 一度そこまで立ち戻って考え直した方が良いように思います。

 (碌な発言じゃなくてスマセン。気を悪くしないでね^^;)

(白茶) 2022/06/22(水) 14:40


なるほど…
確かに押して終わってしまうかもしれませんね。
対策を考えます。
(きらら) 2022/06/22(水) 15:19

■1
質問とは関係しませんが、せっかくのレイアウトが崩れているので整理のお手伝い。
     ___A___   ___B___    ___C___  __D__    __E__
  1  会社名     伝票      ケース   日付
  2  住所       
  3  TEL         
  4  到着日   
  5
  6  製品名     ケース     数量    重量     単価

  7  製品1      1          10      30        300
  8  製品2      1           5      50        250
  9  製品3      1           3      80        240
 10  製品4      2           1     100        100
 11
 12
 13   total    ケース      個数    260       合計   
     ___A___   ___B___    ___C___  __D__    __E__ 

■2
クリックを押すと〜
たぶん、クリックすると〜という意味だと思いますが、SelectionChangeイベントだとクリック以外でも反応してしまいます。
なので、BeforeRightClickやBeforeDoubleClickイベントの利用を考えると良いと思います。

■3
>〜保存が出来るようにしたい
例えば黒(自動)以外の文字色が設定されているセルがある場合には、保存をキャンセルするように考えてみてはどうですか?
すなわち、Workbook_BeforeSaveイベントを利用すると良いでしょう。
ただし、そのままだと自分(管理者?)が色を変えて保存する場合でも保存がキャンセルされてしまうので、例えばユーザー名をみて分岐するとか一工夫されたほうがよいでしょう。

■4
ColorIndexについて↓の記事を読んでみてください。

 【参考】
http://officetanaka.net/excel/vba/graph/24.htm

上記を読めばわかるとおもいますが、ColorIndexの場合必ずしも想定された色というわけではないです。

(もこな2 ) 2022/06/22(水) 18:57


お返事ありがとうございます。
クリックを押すとではなく…
Wクリックが理想ですよね。
1回だと色が簡単に染まってしまいますので。
表もキレイにしていただきありがとうございます。
他の質問にも使用します。

(きらら) 2022/06/22(水) 20:12


 >表もキレイにしていただきありがとうございます。
 会社名をいれる場所がないですよ。

    ___A___   ___B___    ___C___  __D__    __E__
  1 会社名     伝票      ケース   日付
  2 住所
 ↓
    ___A___   ___B___    ___C___  __D__    __E__
  1 会社名          伝票    ケース    日付
  2 住所
 だと思いますけど。
 赤色文字で記入してある欄とは項目名を指しているのですか。
(???) 2022/06/22(水) 21:02

>会社名をいれる場所がないですよ。
おっと失礼。ご指摘ありがとうございます。

>1回だと色が簡単に染まってしまいますので。
いや、そういう意味ではないです。
「SelectionChange」イベントは、選択範囲が変わるたびに発動するんです。
クリックかどうかは関係ありません。矢印キーで移動したって発生するんですよ。

 (残念ながらワークシートのclickイベントというのは無いんです。)

なので、ワークシートイベントで何とかするなら、BeforeRightClickやBeforeDoubleClickイベントの利用を検討するとよいと思うというお話でした。

>他の質問にも使用します。
余計なお世話かもしれませんが、複数の質問を同時進行にすると混乱しませんか?
落ち着いて一つずつ解決していかれてはどうですか?

(もこな2) 2022/06/22(水) 21:30


はい。
こちらは一度完結と言う事で、削除はしないことにしました。
(きらら) 2022/06/23(木) 04:51

>削除はしないことにしました。
削除って何の話ですか?

>こちらは一度完結と言う事で
こちらが解決してからと思ったんですが…
BeforeRightClickやBeforeDoubleClickイベントを利用したコードは書けたということですか?
また、BeforeSaveイベントを使ったコードも書けたということですか?

(もこな2 ) 2022/06/23(木) 07:22


おはようございます。
何も進んではいません。
Workbooks.Open
Worksheets("invoice").Range("K10", "N10", "K20:K23", "C37", "D37", "L32:L35", "L37:M37").Interior.Color = 3

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

     With Target.Interior
          If .ColorIndex = xlNone Then
               .Color = vbRed
          Else
               .Color = xlNone
          End If
     End With
     Cancel = True
End Sub
やってみたのですが、上手く出来ませんでした。
(きらら) 2022/06/23(木) 07:58

Sub a()

   'ThisWorkbook :標準モジュールを設置したEXCELが対象
   'Worksheets("任意のシート名"):対象EXCELシートを選択
   'Interior.Color :セルの色のプロパティ
   ' = RGB(数値,数値,数値)  :色を指定
   'Cell(縦、横)
     ThisWorkbook.Worksheets("invoice").Cells(10, 11).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(10, 14).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(22, 2).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(22, 6).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(22, 11).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(20, 11).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(21, 11).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(23, 11).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(26, 11).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(37, 3).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色
     ThisWorkbook.Worksheets("invoice").Cells(37, 12).Interior.Color = RGB(255, 0, 0) 'RGB(255,0,0)は赤色

End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

     With Target.Interior
          If .ColorIndex = xlNone Then
               .Color = vbRed
          Else
               .Color = xlNone
          End If
     End With
     Cancel = True
End Sub
これで出来たのですが、開いた時にマクロを実行させないと動きません。
どうすればいいのでしょうか?
(きらら) 2022/06/23(木) 08:27

編集が被ってしまいましたので話が前後しますが。

■5
↓の狙いはなんですか?

 Workbooks.Open

やはり、別トピックの話とごちゃ混ぜになっていませんか?

■6
↓の狙いはなんですか?
Color = 3

ColorIndexとColorは別物ですよ。(■4参照)

■7
↓は何で処理分岐するんですか?

 If .ColorIndex = xlNone Then

ダブルクリックしたセルの元の色が何であれ、(自動)にすればよいという話ではないのですか?

(もこな2 ) 2022/06/23(木) 08:40


■8
>開いた時にマクロを実行させないと動きません。
>どうすればいいのでしょうか?
「■5」で述べたように[[20220622151941]]の話と混ざっていると思いますが、ワークブックのOpenイベントならば、シートモジュールに書いてはダメですよ。

(もこな2 ) 2022/06/23(木) 08:56


お悩みの「見過ごし問題」の解決になるかどうかは別の話として、
標準モジュールでもシートモジュールでもなくThisworkbookモジュールに

 Private Sub Workbook_Open()
    a
 End Sub

これを書き加えれば、ブックを開いたときに上記のaマクロが発動します。
(作業員) 2022/06/23(木) 10:03


もう一つの方を見て、少しだけわかったような気がするのでもう一度書き込みます。
・セルの値をチェックしたい
・要確認セルに色付け、確認済みの押印代わりにセルの色付けを解除したい
・要確認セルがすべてチェック済み(色付け解除)になったらそのブックを保存(閉じる)できるようになる
こういうことだと理解しました。

そこで要確認セルを
・確認済みにするにはダブルクリック
・未確認にするには右クリック
・色付きセルがあるうちは保存することも閉じることもできない
こんな風にします。

以下コード
(雑な部分が多いですがご容赦ください)

Thisworkbookモジュール

 Private Sub Workbook_BeforeClose(Cancel As Boolean)
     Cancel = Not ColorCheck
 End Sub

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     Cancel = Not ColorCheck
 End Sub

 Private Sub Workbook_Open()
     WorksheetInitial
 End Sub

シートモジュール

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     Cancel = encolor(Target, False)
 End Sub

 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
     Cancel = encolor(Target, True)
 End Sub

標準モジュール

 Dim CheckRange As Range
 Dim unCheckedColor As Long
 Dim CheckedColor As Long

 Sub WorksheetInitial()
    Dim r As Range
    Dim v

    unCheckedColor = 3
    CheckedColor = xlNone

    For Each v In Array("K10", "N10", "K20:K23", "C37", "D37", "L32:L35", "L37:M37")
        If r Is Nothing Then
            Set r = Range(v)
        Else
            Set r = Union(r, Range(v))
        End If
    Next
    Set CheckRange = r

    CheckRange.Interior.ColorIndex = unCheckedColor

 End Sub

 Function encolor(TargetRng As Range, IsColor As Boolean) As Boolean
    Dim cIndex As Long
    If Not Intersect(TargetRng, CheckRange) Is Nothing Then
        If IsColor Then
            cIndex = unCheckedColor
        Else
            cIndex = CheckedColor
        End If
        With TargetRng.Interior
            If .ColorIndex <> cIndex Then
                .ColorIndex = cIndex
                encolor = True
            End If
        End With
    End If
 End Function

 Function ColorCheck() As Boolean
    Dim r
    Dim errMessage As String

    If Not CheckRange Is Nothing Then
        For Each r In CheckRange
            If r.Interior.ColorIndex <> CheckedColor Then
                errMessage = errMessage & r.Address(0, 0) & Chr(10)
            End If
        Next
    End If

    If errMessage = "" Then
        ColorCheck = True
    Else
        MsgBox errMessage & "上記セル未確認", vbInformation
    End If
 End Function

(作業員) 2022/06/23(木) 12:07


既にアドバイスを受けているようなのでおなか一杯かもしれませんが、追加で何点か。

■9
「a」が見づらいので整理するとこういうことですね

    Sub a()
        ThisWorkbook.Worksheets("invoice").Range("K10,N10,B22,F22,K20:K23,K26,C37,L37").Interior.Color = RGB(255, 0, 0)
    End Sub

■10
すでにコード例の提示がありますが、私ならこんな感じですかね。
【Thisworkbook】モジュール

    Option Explicit
    Const tmp As String = "K10,N10,B22,F22,K20:K23,K26,C37,L37"
    '--------------------------------------------------------------------------------
    Private Sub Workbook_Open()
        ThisWorkbook.Worksheets("invoice").Range(tmp).Interior.Color = RGB(255, 0, 0)
    End Sub
    '--------------------------------------------------------------------------------
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        Dim buf As Range
        For Each buf In ThisWorkbook.Worksheets("invoice").Range(tmp)
            If buf.Interior.Color = RGB(255, 0, 0) Then
                MsgBox "未チェックセルがあります" & vbLf & "保存をキャンセルします"
                Cancel = True
                Exit For
            End If
        Next buf
    End Sub

【invoice】シートモジュール

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        If Target.Interior.Color = RGB(255, 0, 0) Then
            Target.Interior.ColorIndex = xlColorIndexNone
            Cancel = True
        End If
    End Sub

■余談
まとめて書いてしまったので、[[20220622151941]]のほうはご自身で始末をつけてください。
(でないと、投げ出されたようにも見えますので)

なお、「Interior.Color」なのか「Font.Color」なのかはっきりさせておいたほうが良いです。
(途中からすり替わってますよ)

(もこな2 ) 2022/06/23(木) 13:17


おはようございます。
昨日上手く出来ました。
ありがとうございました。
(きらら) 2022/06/24(金) 07:51

>昨日上手く出来ました。
結局どのようなアプローチで解決したのですか?

もしも、私の提示したものを参考にしたのであれば、完成品のプレゼントではなく研究用の資料として提示したつもりですから、ただ丸パクリして終了ではなく、きちんと理解して御自身のモノにされてから運用してください。

(もこな2 ) 2022/06/24(金) 09:02


 >おっと失礼。ご指摘ありがとうございます。
 質問者に対しての発言でした。
 失礼しました。
(???) 2022/06/24(金) 11:35

コメント返信:

[ 一覧(最新更新順) ]


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