Excel VBA質問箱 IV

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

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


2651 / 13646 ツリー ←次へ | 前へ→

【66713】違う文字色それぞれの最高値 Yuki 10/9/28(火) 18:13 質問[未読]
【66715】Re:違う文字色それぞれの最高値 Abebobo 10/9/29(水) 10:48 発言[未読]
【66719】Re:違う文字色それぞれの最高値 teian 10/9/29(水) 17:15 発言[未読]

【66713】違う文字色それぞれの最高値
質問  Yuki  - 10/9/28(火) 18:13 -

引用なし
パスワード
   今晩は。
A1〜A100の範囲内全てに文字色が白と赤の数値が入力されています。
白色の最大値、赤色の最大値をそれぞれ取得する方法を教えてください。
範囲内のどこに白色、赤色という法則性はありません。白色、赤色入り乱れて
入力されています。

【66715】Re:違う文字色それぞれの最高値
発言  Abebobo  - 10/9/29(水) 10:48 -

引用なし
パスワード
   '最初のFor Each は Unionメソッド を使う為に初期Rangeをセット
'次ののFor Each で Unionメソッド

Sub test()
Dim FC_Ch_R  As Range
Dim FC2    As Range
Dim FC3    As Range
Dim FC    As Range
Const C_no2 As Long = 2
Const C_no3 As Long = 3

For Each FC_Ch_R In Selection
 With FC_Ch_R.Font
'  Debug.Print .ColorIndex
  Select Case .ColorIndex
  Case C_no2
   Set FC2 = FC_Ch_R
  Case C_no3
   Set FC3 = FC_Ch_R
  Case Is <> C_no2, Is <> C_no3
   Set FC = FC_Ch_R
  End Select
 End With
Next

For Each FC_Ch_R In Selection
 With FC_Ch_R.Font
  Select Case .ColorIndex
  Case C_no2
   Set FC2 = Union(FC_Ch_R, FC2)
  Case C_no3
   Set FC3 = Union(FC_Ch_R, FC3)
  Case Is <> C_no2, Is <> C_no3
   Set FC = Union(FC_Ch_R, FC)
  End Select
 End With
Next
Debug.Print FC2.Address(0, 0)
Debug.Print FC3.Address(0, 0)
Debug.Print FC.Address(0, 0)
End Sub

前半のループがムダだと思うんですけど・・・。
ほかに良い方法があるんでしょうか?

【66719】Re:違う文字色それぞれの最高値
発言  teian  - 10/9/29(水) 17:15 -

引用なし
パスワード
   セル100個程度ならUnionで纏めた範囲について、MAX関数で求めればいいでしょう。
例)
Sub SampleUnion()
  Dim r As Range, c As Range
  Dim rRed As Range, rWhite As Range
  
  Set r = Range("A1:A100")
  For Each c In r
    Select Case c.Font.Color
    Case vbRed
      If rRed Is Nothing Then
        Set rRed = c
      Else
        Set rRed = Union(rRed, c)
      End If
    Case vbWhite
      If rWhite Is Nothing Then
        Set rWhite = c
      Else
        Set rWhite = Union(rWhite, c)
      End If
    End Select
  Next
  With WorksheetFunction
    MsgBox "赤Max=" & .Max(rRed) & vbCrLf & _
        "白Max=" & .Max(rWhite)
  End With
End Sub


もしExcel2007なら、Font色でフィルターを掛けられますので
これを利用する手もあるでしょう。
例)
Sub SampleFilter()
  Dim r As Range
  Dim RedMax As Double
  Dim WhiteMax As Double

  Set r = Range("A1:A100")
  r.Resize(1).EntireRow.Insert
  With r.Offset(-1).Resize(r.Rows.Count + 1)
    .Worksheet.AutoFilterMode = False
    .AutoFilter Field:=1, Criteria1:=vbRed, Operator:=xlFilterFontColor
    RedMax = WorksheetFunction.Subtotal(4, r)
    .AutoFilter Field:=1, Criteria1:=vbWhite, Operator:=xlFilterFontColor
    WhiteMax = WorksheetFunction.Subtotal(4, r)
    .Worksheet.AutoFilterMode = False
    .Rows(1).EntireRow.Delete xlShiftUp
  End With
  MsgBox "赤Max=" & RedMax & vbCrLf & _
      "白Max=" & WhiteMax
End Sub

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