Excel VBA質問箱 IV

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

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


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

【70448】3つのセルの数字の比較評価 トキノハジメ 11/11/16(水) 19:04 質問[未読]
【70449】Re:3つのセルの数字の比較評価 UO3 11/11/16(水) 20:00 回答[未読]
【70450】Re:3つのセルの数字の比較評価 kanabun 11/11/16(水) 20:38 発言[未読]
【70455】Re:3つのセルの数字の比較評価 panpan 11/11/17(木) 15:53 発言[未読]
【70463】Re:3つのセルの数字の比較評価 トキノハジメ 11/11/18(金) 10:13 質問[未読]
【70464】Re:3つのセルの数字の比較評価 kanabun 11/11/18(金) 11:20 発言[未読]
【70465】Re:3つのセルの数字の比較評価 panpan 11/11/18(金) 12:06 発言[未読]
【70504】Re:3つのセルの数字の比較評価 トキノハジメ 11/11/21(月) 21:54 お礼[未読]

【70448】3つのセルの数字の比較評価
質問  トキノハジメ  - 11/11/16(水) 19:04 -

引用なし
パスワード
   1. A1 B1 C1 D1
   6  5  4 ×

2. A1 B1 C1 D1 
   3  4  2 〇

3. A1 B1 C1 D1
   6  7  8 ◎

4. A1 B1 C1 D1
   6  5  6 △

5. A1 B1 C1 D1
   8  8  3 △

上のような表でA1,B1,C1の各セルの数字を比較して
1.の場合はA1の数字が大きいのでD1に×印
2.の場合はB1の数字が大きいのでD1に○印
3.の場合はC1の数字が大きいのでD1に◎印
4.、5.の場合は同数が2つんのでD1には△印
を表示したいのですが方法を教えてください。
宜しくお願いいたします。


    

【70449】Re:3つのセルの数字の比較評価
回答  UO3  - 11/11/16(水) 20:00 -

引用なし
パスワード
   ▼トキノハジメ さん:

こんばんは
もっとスマートな方法があるとは思いますが、とりあえず。
3つ一緒なら■にしてあります。

Sub Sample()
  Dim c As Range
  Dim s As String
  Dim n1 As Long, n2 As Long, n3 As Long, nx As Long, nz As Long
  For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))
    n1 = WorksheetFunction.Rank(c.Value, c.Resize(, 3))
    n2 = WorksheetFunction.Rank(c.Offset(, 1).Value, c.Resize(, 3))
    n3 = WorksheetFunction.Rank(c.Offset(, 2).Value, c.Resize(, 3))
    nx = n1 + n2 + n3
    Select Case nx
      Case 5
        s = "△"
      Case 3
        s = "■"
      Case Else
        If n1 = 1 Then
          s = "×"
        ElseIf n2 = 1 Then
          s = "○"
        Else
          s = "◎"
        End If
    End Select
    c.Offset(, 3).Value = s
  Next
End Sub

【70450】Re:3つのセルの数字の比較評価
発言  kanabun  - 11/11/16(水) 20:38 -

引用なし
パスワード
   ▼トキノハジメ さん:

サンプルのケースを
1行目から5行目に置いておいて
  A  B  C
1 6  5  4
2 3  4  2
3 6  7  8
4 6  5  6
5 8  8  3

こう考えてみました。

Sub Try1()
 Dim maxVal As Long, maxCol As Long
 Dim i As Long, j As Long
 
 For i = 1 To 5
   maxVal = Cells(i, 1)'初めは1列目の値を
   maxCol = 1     '最大値とし
   For j = 2 To 3   '2,3列目の値をこれと比較
     If maxVal < Cells(i, j) Then'これまでの最大値より
       maxVal = Cells(i, j)  '大きかったら、この値を最大値に
       maxCol = j       'かつ、最大値の列番号を更新
     ElseIf maxVal = Cells(i, j).Value Then'値が最大値と同じとき
       maxCol = maxCol + j - (j < 3) '列番号を3以上にする
     End If
   Next
   Cells(i, 4).Value = Choose(maxCol, _
         "×", "〇", "◎", "△", "△")'maxColの値により記号を返す
 Next
 
End Sub

結果
  A  B  C  D
1 6  5  4  ×
2 3  4  2  〇
3 6  7  8  ◎
4 6  5  6  △
5 8  8  3  △

【70455】Re:3つのセルの数字の比較評価
発言  panpan  - 11/11/17(木) 15:53 -

引用なし
パスワード
   私も一例提示

Sub sample()
  Dim r As Range
  Dim v As Variant, n As Long
  
  For Each r In Range("A1:C5").Rows
    With WorksheetFunction
      v = .Max(r)
      If .CountIf(r, v) > 1 Then
        n = 4
      Else
        n = .Match(v, r, 0)
      End If
    End With
    r.Range("D1").Value = Choose(n, "×", "○", "◎", "△")
  Next
End Sub

【70463】Re:3つのセルの数字の比較評価
質問  トキノハジメ  - 11/11/18(金) 10:13 -

引用なし
パスワード
   UO3さん、Kanabunさん、panpan さん

3っもの回答を戴き有難うこざいます。
panpanさんのコードで
If .CountIf(r, v) > 1 Then
の所が構文エラーと成るのですが

kanabunさんに教えて頂きたいのですが
A1 B1 C1 をD3 D4 D5になった場合は如何すればよいのか教えてください。
宜しくお願いいたします。
>
>Sub sample()
>  Dim r As Range
>  Dim v As Variant, n As Long
>  
>  For Each r In Range("A1:C5").Rows
>    With WorksheetFunction
>      v = .Max(r)
>      If .CountIf(r, v) > 1 Then
>        n = 4
>      Else
>        n = .Match(v, r, 0)
>      End If
>    End With
>    r.Range("D1").Value = Choose(n, "×", "○", "◎", "△")
>  Next
>End Sub

【70464】Re:3つのセルの数字の比較評価
発言  kanabun  - 11/11/18(金) 11:20 -

引用なし
パスワード
   ▼トキノハジメ さん:こんにちは〜
>
>kanabunさんに教えて頂きたいのですが
>A1 B1 C1 をD3 D4 D5になった場合は如何すればよいのか教えてください。

以下のように元の表が[D3]から始まっているなら、

  D  E  F  G
3 6  5  4  ×
4 3  4  2  〇
5 6  7  8  ◎
6 6  5  6  △
7 8  8  3  △

Sub Try1() のFor〜Nextループ文を
> With Range("D3", Cells(Rows.Count, "F").End(xlUp))
> End With
で括ってやり、内部の Cells(i, j) を .Cells(i, j) のように
Cellsのまえにドットをつけてやれば、その他の変更は無用です。

Sub Try2()
 Dim maxVal As Long, maxCol As Long
 Dim i As Long, j As Long

 With Range("D3", Cells(Rows.Count, "F").End(xlUp))
  For i = 1 To .Rows.Count
    maxVal = .Cells(i, 1) '初めは1列目の値を
    maxCol = 1     '最大値とし
    For j = 2 To 3   '2,3列目の値をこれと比較
      If maxVal < .Cells(i, j) Then 'これまでの最大値より
        maxVal = .Cells(i, j)  '大きかったら、この値を最大値に
        maxCol = j       'かつ、最大値の列番号を更新
      ElseIf maxVal = .Cells(i, j).Value Then '値が最大値と同じとき
        maxCol = maxCol + j - (j < 3) '列番号を3以上にする
      End If
    Next
    .Cells(i, 4).Value = Choose(maxCol, _
          "×", "〇", "◎", "△", "△") 'maxColの値により記号を返す
  Next
 End With
End Sub


けれど、

>A1 B1 C1 をD3 D4 D5になった場合は如何すれば

これは列方向が行方向に変わるのですから、別の修正が必要です。
ほんとに表がそのように変わったのですか?
一応確認しときます。

【70465】Re:3つのセルの数字の比較評価
発言  panpan  - 11/11/18(金) 12:06 -

引用なし
パスワード
   ▼トキノハジメ さん:
>panpanさんのコードで
>If .CountIf(r, v) > 1 Then
>の所が構文エラーと成るのですが

さて、何ででしょう? 分かりませんね。

なお、
>A1 B1 C1 をD3 D4 D5になった場合は如何すればよいのか教えてください。
>宜しくお願いいたします。
が、行単位でなく列単位であるってことなら、
私のコードにおける修正としては、
以下のような感じでしょうか?

Sub sample()
  Dim r As Range
  Dim v As Variant, n As Long
 
'  For Each r In Range("A1:C5").Rows
  For Each r In Range("D3:Z5").Columns
    With WorksheetFunction
      v = .Max(r)
      If .CountIf(r, v) > 1 Then
        n = 4
      Else
        On Error Resume Next
        n = 0
        n = .Match(v, r, 0)
        On Error GoTo 0
      End If
    End With
'    r.Range("D1").Value = Choose(n, "×", "○", "◎", "△")
    r.Range("A4").Value = Choose(n, "×", "○", "◎", "△")
  Next
End Sub

cf.
なお、シートのデータが数値で無かった場合はMatchでエラーになる可能性がありますのでその回避用にいれました。

【70504】Re:3つのセルの数字の比較評価
お礼  トキノハジメ  - 11/11/21(月) 21:54 -

引用なし
パスワード
   ▼panpan さん:
kanabunさん、UO3さん
大変有難うございました。また宜しくお願いいたします。

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