Excel VBA質問箱 IV

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

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


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

【77801】一つのセル内にカンマで区切って表示 A/C 15/12/27(日) 23:50 質問[未読]
【77802】Re:一つのセル内にカンマで区切って表示 γ 15/12/28(月) 6:44 発言[未読]
【77803】Re:一つのセル内にカンマで区切って表示 γ 15/12/29(火) 8:09 発言[未読]

【77801】一つのセル内にカンマで区切って表示
質問  A/C  - 15/12/27(日) 23:50 -

引用なし
パスワード
   A列縦に苗字が入っていて、その人数はその都度かわります。B列にある試験の点数が表示されています。C1に90〜100とあり、これは成績が90点から100点までという意味で、D1にその点数の範囲内にある苗字がカンマで区切られて全て表示させるようにしたいのですが、そのプログラムが全くわかりません。
どなたか教えてください。よろしくお願いします。

【77802】Re:一つのセル内にカンマで区切って表示
発言  γ  - 15/12/28(月) 6:44 -

引用なし
パスワード
   一例です。

Sub test()
  Dim dic As Object
  Dim r As Range
  Dim s As String
  Dim name As String
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  '氏名、得点に基づき、該当する得点ランク別のdictionaryに氏名を保持
  For Each r In Range([A1], [A1].End(xlDown))
    name = r.Value
    s = getRank(r.Offset(, 1).Value)
    If Not dic.exists(s) Then
      Set dic(s) = CreateObject("Scripting.Dictionary")
    End If
    dic(s)(name) = Empty
  Next
  
  Columns("D").ClearContents
  
  'カンマで文字列連結して書き出し
  For Each r In Range([C1], [C1].End(xlDown))
    If dic.exists(r.Value) Then
      r.Offset(, 1).Value = Join(dic(r.Value).keys, ",")
    End If
  Next
 
End Sub

'得点毎のランクを得る(得点は整数と仮定)
Function getRank(v As Long) As String
  Select Case v
    Case Is >= 90: getRank = "90〜100"
    Case Is >= 70: getRank = "良"
    Case Is >= 50: getRank = "可"
    Case Else: getRank = "不可"
  End Select
End Function

【77803】Re:一つのセル内にカンマで区切って表示
発言  γ  - 15/12/29(火) 8:09 -

引用なし
パスワード
   ああ、ポイントは、得点ランクをもとに自動判定する部分でしたか?
それと、文字列操作のもっと基本的な手法も書いておきましょう。

以下はサンプルです。
得点ランクが一つのケースです。必要なら繰り返しに持ち込んで下さい。

Sub test2()
  Dim r As Range
  Dim name As String
  Dim score As Long
  Dim s As String
  Dim scoreRank As String
  Dim lowScore As Long
  Dim highScore As Long

  Columns("E").ClearContents

  scoreRank = Cells(1, 3).Value
  lowScore = CLng(Split(scoreRank, "〜")(0))
  highScore = CLng(Split(scoreRank, "〜")(1))
  
  For Each r In Range(Range("A1"), Range("A1").End(xlDown))
    name = r.Value
    score = r.Offset(, 1).Value
    If score >= lowScore Then
      If score <= highScore Then
        s = s & name & ","
      End If
    End If
  Next
  s = Left(s, Len(s) - 1) '尻尾の","をカット
  Cells(1, 4).Value = s
End Sub

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