Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5709 / 13645 ツリー ←次へ | 前へ→

【49300】上位5位まで書式設定 やま 07/5/30(水) 19:43 質問[未読]
【49301】Re:上位5位まで書式設定 ぱっせんじゃー 07/5/30(水) 20:16 発言[未読]
【49302】Re:上位5位まで書式設定 ぱっせんじゃー 07/5/30(水) 20:20 発言[未読]
【49307】Re:上位5位まで書式設定 やま 07/5/31(木) 0:04 発言[未読]
【49310】Re:上位5位まで書式設定 やま 07/5/31(木) 1:44 質問[未読]
【49311】Re:上位5位まで書式設定 ichinose 07/5/31(木) 7:51 発言[未読]
【49318】Re:上位5位まで書式設定 やま 07/5/31(木) 10:15 質問[未読]
【49330】Re:上位5位まで書式設定 ウッシ 07/5/31(木) 13:27 発言[未読]
【49335】Re:上位5位まで書式設定 やま 07/5/31(木) 13:56 質問[未読]
【49336】Re:上位5位まで書式設定 ウッシ 07/5/31(木) 14:17 発言[未読]
【49338】Re:上位5位まで書式設定 やま 07/5/31(木) 14:26 発言[未読]
【49339】Re:上位5位まで書式設定 ウッシ 07/5/31(木) 14:42 発言[未読]
【49347】Re:上位5位まで書式設定 やま 07/5/31(木) 15:30 お礼[未読]

【49300】上位5位まで書式設定
質問  やま  - 07/5/30(水) 19:43 -

引用なし
パスワード
   過去データいろいろ調べてみたのですが
Private Sub Worksheet_Change(ByVal Target As Range)と
caseを利用するのかなと
いうことぐらいは解ったのですが他よく解らないvba初心者です。
条件付書式では3個までなのでできません
教えていただければ幸いです。

条件はD10:D110までの範囲です
ココに数値が入力されており数値の値の大きい順[0〜100,000]位の範囲です
これに1位に・・・赤
   2位に・・・緑
   3位に・・・青
   4位に・・・ピンク
   5位に・・・オレンジ
となるようコードを組みたいのですがよろしくお願いします。
ちなみにD行は可変が予想されます。

【49301】Re:上位5位まで書式設定
発言  ぱっせんじゃー  - 07/5/30(水) 20:16 -

引用なし
パスワード
   ワークシート関数を使ってみてはいかがでしょう?

WorksheetFunction.Rank

【49302】Re:上位5位まで書式設定
発言  ぱっせんじゃー  - 07/5/30(水) 20:20 -

引用なし
パスワード
   ↓が参考になると思います。

http://www.sanynet.ne.jp/~awa/excelvba/kouza.html
http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_02/001.html
http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_03/016.html

【49307】Re:上位5位まで書式設定
発言  やま  - 07/5/31(木) 0:04 -

引用なし
パスワード
   ▼ぱっせんじゃー さん:
>↓が参考になると思います。
>
>http://www.sanynet.ne.jp/~awa/excelvba/kouza.html
>http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_02/001.html
>http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_03/016.html
ちょっと見てみましたが難しいです。
もう少し具体例でも結構です。
よろしくお願いします。

【49310】Re:上位5位まで書式設定
質問  やま  - 07/5/31(木) 1:44 -

引用なし
パスワード
   やっとここまで出来ました
これに範囲D4からデータのあるD列最終行と
色設定を教えて下さい。よろしくお願いします。
色は 1位に・・・赤
   2位に・・・緑
   3位に・・・青
   4位に・・・ピンク
   5位に・・・オレンジ です
追加ですが下記MsgBoxも不要です。

Sub 番号順()
  Dim i As Long
With Selection

  For i = 1 To 5
    MsgBox i & "番目の大きい数:" & Application.Large(.Cells, i)
  Next
End With

End Sub

【49311】Re:上位5位まで書式設定
発言  ichinose  - 07/5/31(木) 7:51 -

引用なし
パスワード
   ▼やま さん:
おはようございます。

>やっとここまで出来ました
>これに範囲D4からデータのあるD列最終行と
>色設定を教えて下さい。よろしくお願いします。
>色は 1位に・・・赤
>   2位に・・・緑
>   3位に・・・青
>   4位に・・・ピンク
>   5位に・・・オレンジ です
以前作成したFindメソッドのサブルーチンが目に付いたので
これを使いました。

標準モジュールに
'============================================================
Sub 番号順()
  Dim i As Long
  Dim j As Long
  Dim ans As Variant
  Dim rng As Range
  Dim samecnt As Long
  Dim clarray As Variant
  j = 1
  clarray = Array(3, 10, 5, 7, 46)
  With Range("d4", Cells(Rows.Count, "d").End(xlUp))
    For i = 1 To 5
     j = j + samecnt
     ans = Application.Large(.Cells, j)
     If IsError(ans) Then Exit For
     samecnt = Application.CountIf(.Cells, ans)
     Set rng = get_findcell(ans, .Cells)
     Do Until rng Is Nothing
       rng.Interior.ColorIndex = clarray(i - 1)
       Set rng = get_findcell()
       Loop
     Next
    End With
End Sub
'============================================================
Function get_findcell(Optional ByVal f_v As Variant = "", _
           Optional ByVal rng As Range = Nothing, _
           Optional ByVal alookin As XlFindLookIn = -4163, _
           Optional ByVal alookat As XlLookAt = 1, _
           Optional ByVal aso As XlSearchOrder = 1, _
           Optional ByVal asd As XlSearchDirection = 1, _
           Optional ByVal mc As Boolean = False, _
           Optional ByVal mb As Boolean = True) As Range
'指定された値でセル範囲を検索し、該当するセルを取得する
'input : f_v 検索する値
'    rng 検索する範囲
'    alookin 検索対象 xlvalues,xlformulas,xlcomments
'    alookat: :検索方法 1-完全一致 2-部分一致
'    aso : 検索順序 1 行 2 列
'    asd : 検索方向 1 Xlnext 2 XlPrevious
'    mc  : 大文字・小文字の区別 False しない True する
'    mb  : 半角と全角を区別   True する  False しない
'output:get_findcell 見つかったセル(見つからなかったときはNothingが返る)
  Static 検索範囲 As Range
  Static 最初に見つかったセル As Range
  Static 直前に見つかったセル As Range
  Static 検索方向 As XlSearchDirection
  If Not rng Is Nothing Then
    Set 検索範囲 = rng
    End If
  If f_v <> "" Then
    Set get_findcell = 検索範囲.Find(f_v, 検索範囲.Cells(検索範囲.Rows.Count, 検索範囲.Columns.Count), _
                    alookin, alookat, aso, asd, mc, mb)
    If Not get_findcell Is Nothing Then
     Set 最初に見つかったセル = get_findcell
     Set 直前に見つかったセル = get_findcell
     検索方向 = asd
     End If
  Else
    If 検索方向 = xlNext Then
     Set get_findcell = 検索範囲.FindNext(直前に見つかったセル)
    Else
     Set get_findcell = 検索範囲.FindPrevious(直前に見つかったセル)
     End If
    If get_findcell.Address = 最初に見つかったセル.Address Then
     Set get_findcell = Nothing
    Else
     Set 直前に見つかったセル = get_findcell
     End If
    End If
End Function

同じ数字があっても取り合えず、
1番大きい数字のあるセルは、全部 赤に塗りつぶす
2番目に大きい数字のあるセルは、全部 緑に塗りつぶす



という処理にしました。

意味合いが違うなら、プロシジャー番号順を変更してください。

【49318】Re:上位5位まで書式設定
質問  やま  - 07/5/31(木) 10:15 -

引用なし
パスワード
   ichinoseさん
返事ありがとうございます。
こんな長いコードのなるのですか
私の説明が悪かったようですが
セルの色ではなく文字色を変えたかったのですが
また、常時D列の入力済みから下行に数値を入力していくので
Private Sub Worksheet_Change(ByVal Target As Range)で
変化に対応したいのですができませんか?
よろしくお願いします。

【49330】Re:上位5位まで書式設定
発言  ウッシ  - 07/5/31(木) 13:27 -

引用なし
パスワード
   こんにちは

入力する度にD列の値を全部調べ直すので非効率的ですよね。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim mR As Range
  Dim v
  Dim i As Long
  Dim x As Variant
  
  If Target.Count > 1 Then Exit Sub
  Set mR = Me.Range("D10", Me.Range("D10").End(xlDown))
  If Intersect(Target, mR) Is Nothing Then Exit Sub
  v = mR.Value
  mR.Font.ColorIndex = 0
  For i = 1 To UBound(v, 1)
    Select Case Application.WorksheetFunction.Rank(v(i, 1), mR)
      Case 1: x = 3
      Case 2: x = 4
      Case 3: x = 5
      Case 4: x = 7
      Case 5: x = 46
      Case Else: x = 0
    End Select
    If x <> 0 Then
      mR(i, 1).Font.ColorIndex = x
    End If
  Next
End Sub

【49335】Re:上位5位まで書式設定
質問  やま  - 07/5/31(木) 13:56 -

引用なし
パスワード
   ▼ウッシ さん:
ありがとうございます。バッチリうまくいきました。
非効率ですか・・・
そこで相談ですが範囲を指定しておきコードを実行する場合は
下記修正でよいでしょうか???
ちょっと実行してみたのですがErrorでした。
どこがまずいですか

>こんにちは
>
>入力する度にD列の値を全部調べ直すので非効率的ですよね。
>
★消す>Private Sub Worksheet_Change(ByVal Target As Range)
Sub 五位まで表示()
>  Dim mR As Range
>  Dim v
>  Dim i As Long
>  Dim x As Variant
>  
★消す>  If Target.Count > 1 Then Exit Sub
★消す>  Set mR = Me.Range("D10", Me.Range("D10").End(xlDown))
★消す>  If Intersect(Target, mR) Is Nothing Then Exit Sub
★消す>  v = mR.Value
>  mR.Font.ColorIndex = 0
>  For i = 1 To UBound(v, 1)
>    Select Case Application.WorksheetFunction.Rank(v(i, 1), mR)
>      Case 1: x = 3
>      Case 2: x = 4
>      Case 3: x = 5
>      Case 4: x = 7
>      Case 5: x = 46
>      Case Else: x = 0
>    End Select
>    If x <> 0 Then
>      mR(i, 1).Font.ColorIndex = x
>    End If
>  Next
>End Sub

【49336】Re:上位5位まで書式設定
発言  ウッシ  - 07/5/31(木) 14:17 -

引用なし
パスワード
   >入力する度にD列の値を全部調べ直すので非効率的ですよね。

これは、
>  Set mR = Me.Range("D10", Me.Range("D10").End(xlDown))
D10から、その下のデータ入力したセルまでの範囲
という事ですが、それでも入力する度に処理されますので、

>データ入力が終了したらコードを実行する
方がいいですよね。

Sub 五位まで表示()
  Dim mR As Range
  Dim v
  Dim i As Long
  Dim x As Variant

  Set mR = Range("D10", Range("D10").End(xlDown))
  If Application.WorksheetFunction.CountA(mR) = 0 Then Exit Sub
  v = mR.Value
  mR.Font.ColorIndex = 0
  For i = 1 To UBound(v, 1)
    If Not IsEmpty(v(i, 1)) Then
      Select Case Application.WorksheetFunction.Rank(v(i, 1), mR)
        Case 1: x = 3
        Case 2: x = 4
        Case 3: x = 5
        Case 4: x = 7
        Case 5: x = 46
        Case Else: x = 0
      End Select
      If x > 0 Then
        mR(i, 1).Font.ColorIndex = x
      End If
    End If
  Next
End Sub

【49338】Re:上位5位まで書式設定
発言  やま  - 07/5/31(木) 14:26 -

引用なし
パスワード
   ▼ウッシ さん:
すみません質問がへたで
>>入力する度にD列の値を全部調べ直すので非効率的ですよね。
>
>これは、
>>  Set mR = Me.Range("D10", Me.Range("D10").End(xlDown))
>D10から、その下のデータ入力したセルまでの範囲
>という事ですが、それでも入力する度に処理されますので、
>
>>データ入力が終了したらコードを実行する
>方がいいですよね。
>
>Sub 五位まで表示()
>  Dim mR As Range
>  Dim v
>  Dim i As Long
>  Dim x As Variant
>
>  Set mR = Range("D10", Range("D10").End(xlDown))
汎用性を持たせたいのでRengをいれないで
自分でsheetの範囲をしていしたいのですが
教えて下さい 何度も申し訳ないです
>  If Application.WorksheetFunction.CountA(mR) = 0 Then Exit Sub
>  v = mR.Value
>  mR.Font.ColorIndex = 0
>  For i = 1 To UBound(v, 1)
>    If Not IsEmpty(v(i, 1)) Then
>      Select Case Application.WorksheetFunction.Rank(v(i, 1), mR)
>        Case 1: x = 3
>        Case 2: x = 4
>        Case 3: x = 5
>        Case 4: x = 7
>        Case 5: x = 46
>        Case Else: x = 0
>      End Select
>      If x > 0 Then
>        mR(i, 1).Font.ColorIndex = x
>      End If
>    End If
>  Next
>End Sub

【49339】Re:上位5位まで書式設定
発言  ウッシ  - 07/5/31(木) 14:42 -

引用なし
パスワード
   こんにちは

>Set mR = Range("D10", Range("D10").End(xlDown))

>Set mR = Selection

にするだけですけど、いまのコードは選択範囲が1列でないと正しい結果にならないですよ。

【49347】Re:上位5位まで書式設定
お礼  やま  - 07/5/31(木) 15:30 -

引用なし
パスワード
   ▼ウッシ さん:
何度もありがとうございました。
解決でーす。
また教えてください。

>こんにちは
>
>>Set mR = Range("D10", Range("D10").End(xlDown))
>を
>>Set mR = Selection
>
>にするだけですけど、いまのコードは選択範囲が1列でないと正しい結果にならないですよ。

5709 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free