[[20180627134618]] 『入札表の作成』(初心者) ページの最後に飛ぶ

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

 

『入札表の作成』(初心者)

お世話になります。
数十点の商品の入札会を行っており、それらの入札から落札される販売店を決めるのに現在、条件付き書式の「上位または下位に入る値だけを書式設定」のルールを上位1位にして1位の値に塗りつぶしを行うように設定して確認をしています。
ただこの条件で行うと上位1位が複数あるとそれら全てに条件が適用されてしまうので、これらの動作をマクロで行えればと思っています。

マクロに出す条件は、
・集計する範囲は列FTからID
・3行目から最終行までの各行をそれぞれ処理
・FTからIDで上位1位の値に塗りつぶし(可能であればR177 G160 B199)
・FTからIDの上位1位が複数ある場合上記の塗りつぶしとは別の色で上位1位を全て塗りつぶす(カラーインデックス45)
・行数は毎月変わるので指定範囲は3行目から最終行まで

という5つを一括で行えるマクロを教えて頂けると助かります。それとマクロの取り消しコードもあるとありがたいです。

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


 一応条件付き書式でも可能な方法。
 この場合はFR1セルに何か入力すると色を付けてFR1セルを空白にすると色を消す。

(ねむねむ) 2018/06/27(水) 15:05


 FT列からID列を選択して条件付き書式の数式を使用して〜、で
 =AND(ROW()>2,MAX($FT1:$ID1)=FT1,COUNTIF($FT1:$ID1,FT1)>1,$FR$1<>"") 複数時の色
 =AND(ROW()>2,MAX($FT1:$ID1)=FT1,FT1<>"",$FR$1<>"")                   単一時の色
 とこの並びで設定s手見てくれ。
(ねむねむ) 2018/06/27(水) 15:05

申し訳ありません。
上記の2つのルールを入れて操作を行ってみたところ変化がありません。
(初心者) 2018/06/28(木) 09:38

 FR1セルに何か入力は行ったか?
 >この場合はFR1セルに何か入力すると色を付けてFR1セルを空白にすると色を消す。

(ねむねむ) 2018/06/28(木) 09:39


FRにはすでにデータが入っていて幅を0にしてあるので操作ができません。
(初心者) 2018/06/28(木) 09:56

 ではFR1セルをのセルに変更して式でFR1セルを参照しているところを変更したセルにかえてみてくれ。
 あるいは条件付き書式はあきらめてマクロでの回答がつくのを待つか。

(ねむねむ) 2018/06/28(木) 10:00


質問を考え直したので新たにご依頼します。
入札の最高値が幾つか?或いは何処と何処か?、というのが分かれば良いので新しく作った列にダブりがあるとマークが入るようにできないでしょうか。
現状列IOに最高値が関数の最大値で表示がされるように設定されているのでその隣の列IPの2行目にタイトルを「同額」と入れ、3行目以降に同額の最高入札があると〇などで通知するように作れないでしょうか。

書いていても分かりにくいので簡潔に説明すると、
「列FTからIDの最大値が複数ある場合その個数をIPに返す」という事になると思われます。

この方法で新たにお願いいたします。
(初心者) 2018/06/28(木) 17:07


回答じゃなくて1意見として。

・質問じゃなくて丸投げなのであんまり回答する気がわきません。

・質問文をよくよく読むと「R177 G160 B199」、「3行目から最終行」、
 「カラーインデックス45」なんて感じのキーワードがちりばめられているので、
 もしかして自分でたたき台となるものくらいは作っているんじゃ無いかと思われます。

コレを踏まえて、とりあえずやってみてどこが解らないのか、その部分を聞くか、コードを提示して皆さんに添削をお願いした方が回答つきそうな気がします。

次に
>「列FTからIDの最大値が複数ある場合その個数をIPに返す」という事になると思われます。

それならとりあえず3行目”だけ”で考えてみたらどうですか?

ヒント
(1)範囲内の最大値はMAX関数が使えそうです。
(2)特定の数値が範囲内にいくつあるか数えるにはCOUNTIF関数が使えそうです
(3)もし、(2)が1を超えてるということは・・

そして数式で答えが出せるなら、条件付き書式の”数式を使用して、書式設定するセルを決定”が使えるということになるのではと思います。

(もこな2) 2018/06/28(木) 18:36


(もこな2)さんに注意を頂きその通りだと思い、反省いたしました。
おおよその形を作りましたので改めてお伺いします。3行目に限定はしていますが取り敢えずやりたい事はできました。
関数のCOUNTIFと条件付き書式の上位1位に指定を行い塗りつぶしを行ったところエラー表示がされずに動きました。
後はこの処理を毎月行数が変化するので入力のある行まで同様の処理を行うという所で止まってしまいました。1つ1つ関数と条件付き書式を入れていくと時間がすごく掛かり、ミスも出てしまう可能性があるので関数と条件付き書式の2つの処理を繰り返せないでしょうか?
上記の動作を記録したマクロは
Sub Macro1()
    Range("IP3").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(RC[-74]:RC[-12],MAX(RC[-74]:RC[-12]))"
    Range("FT3:ID3").Select
    Range("ID3").Activate
    Selection.FormatConditions.AddTop10
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1)
        .TopBottom = xlTop10Top
        .Rank = 1
        .Percent = False
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent5
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Range("IP1").Select
End Sub
となります。
(初心者) 2018/06/30(土) 11:36

 ねむねむさんのアイデアでいいと思うんですけどねぇ・・

 FR1セルが使えなかっただけでしょ?

 IP2セル「同額」なんて云うセルが作れるなら、そこをFR1の代わりにすればいいですよ。

 > FT列からID列を選択して条件付き書式の数式を使用して〜、で
 > =AND(ROW()>2,MAX($FT1:$ID1)=FT1,COUNTIF($FT1:$ID1,FT1)>1,$FR$1<>"") 複数時の色
 > =AND(ROW()>2,MAX($FT1:$ID1)=FT1,FT1<>"",$FR$1<>"")                   単一時の色
   ↓
   FT列からID列を選択して条件付き書式の数式を使用して〜、で
   =AND(ROW()>2,MAX($FT1:$ID1)=FT1,COUNTIF($FT1:$ID1,FT1)>1,$IP$2=1) 複数時の色
   =AND(ROW()>2,MAX($FT1:$ID1)=FT1,FT1<>"",$IP$2=1)                   単一時の色

 として、色を付けたい時は、IP2セルに「1」を入れる。
     色を消したい時は、IP2セルに「0」でも入れる。(1以外なら何でもいい)

(半平太) 2018/06/30(土) 14:45


う〜ん私の言い方がわるかったんでしょうか?おそらくされたいことを実現するには

・条件付き書式の「数式を使用して、書式設定するセルを決定」を設定する
 付随して条件を満たしていてもTrueにならない工夫をする

・マクロでセルの値を取得して、書式設定を変更するセルを判定して、書式設定(塗りつぶし)する
 付随して全体を塗りつぶしなしにするマクロを作成する

このどっちかではないでしょうか
なので、元々の質問を拝見して、2番目のプランのマクロをある程度作成していたんじゃないかとおもって、先日のようなコメントをつけたのですが・・・

本当に最初からマクロで条件付き書式を操作するようなプランを考えていたのであれば、マクロで条件付き書式を設定する必要性が私にはわからないので、皆さんが提示されているような数式を使って、手動で条件付き書式の「数式を使用して、書式設定するセルを決定」の設定をされることをオススメします。

また、あえて勉強がてらマクロで処理したいというなら、いろんなやり方あるとおもいますけど、こんなやり方もあるとおもいますので、研究されてみてはいかがでしょうか。

   Sub サンプル()
      Dim i As Long
      Dim tRNG As Range, MyRNG As Range
      Dim WF As Object: Set WF = Application.WorksheetFunction
      Dim MyColor As Long
   '
      With ActiveSheet
         For i = 3 To .Cells(.Rows.Count, "FT").End(xlUp).Row
            Set tRNG = .Range(.Cells(i, "FT"), .Cells(i, "ID"))
   '
            Select Case WF.CountIf(tRNG, WF.Max(tRNG))
               Case Is = 1: MyColor = RGB(255, 0, 0)
               Case Is > 1: MyColor = RGB(255, 255, 0)
               Case Else: Stop
            End Select
   '
            tRNG.Interior.Color = xlNone
   '
            For Each MyRNG In tRNG
               If MyRNG.Value = WF.Max(tRNG) Then MyRNG.Interior.Color = MyColor
            Next MyRNG
         Next i
      End With
   End Sub
(もこな2) 2018/07/01(日) 14:49

バタバタしていて閲覧が今になってしまいました。
(ねむねむ)さん、(もこな2)さん、(半平太)さんから色々とアドバイスというか方法を教えていただきありがとうございます。
質問をしてから考え方を単純化してやり直してみたらマクロを使わずにやりたい事が出来ました。
条件付き書式の上位1位と、関数のCOUNTIFをMAX値で指定して重複する値をカウントする方式に変更しました。
やりたい事は最大値を導き出す事と最大値がそれぞれ幾つあるかという事だったのでややこしく考えなければ普通にできました。
皆様には妙な質問をしてしまい申し訳ありませんでした。
事前に目的を明確化して自力でやれるかどうかを判断したうえで詰まってしまった場合はまた相談させていただきます。
(初心者) 2018/07/04(水) 17:29

コメント返信:

[ 一覧(最新更新順) ]


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