Excel VBA質問箱 IV

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

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


20740 / 76738 ←次へ | 前へ→

【61411】Re:同じ処理の簡略化
回答  neptune  - 09/5/6(水) 11:17 -

引用なし
パスワード
   ▼たけ さん:
こんにちは

たけ さんのソースを生かすように書いてみました。

コンパイルは通るようにしてますが、データを作るのが面倒くさかったんで
1行だけしか検証はしてません。
多分修正箇所は沢山あると思いますが、たたき台にはなると思います。

なお、VBの数値データ型にはnullの概念はないと思いますので -1 としています。
※この点は判断に使うなら問題ないですが、計算時の障害になるので、
 修正の必要があります。

Private Type Score
  Eat As Long     '食事を取る
  How_Many As Long  '何人
  Mealtime As Long  '食事時間
End Type

'昼,夜とB2:D2の内容が横に3回続きます.なので , E2: G2が昼 , H2: J2が夜となります
Sub t()
Dim typScoreMorning() As Score, typScoreNoon() As Score, typScoreNight() As Score
Dim gtl As Long
Dim b As Long, l As Long, d As Long
Dim targetRng As Range
Dim i As Long
Dim wsName As String

  'ワークシート名
  wsName = "Sheet1"

  '計算範囲を求める
  Set targetRng = Worksheets(wsName).Range(Range("B3"), Range("B3").End(xlDown))
  '
  ReDim typScoreMorning(targetRng.Count)
  ReDim typScoreNoon(targetRng.Count)
  ReDim typScoreNight(targetRng.Count)
  '行毎に計算
  For i = 0 To i = targetRng.Count
    typScoreMorning(i) = Judge(targetRng(i))
    typScoreNoon(i) = Judge(targetRng(i).Offset(, 4))  '4であっているのかな?
    typScoreNight(i) = Judge(targetRng(i).Offset(, 7))  '7であっているのかな?
  Next
  Set targetRng = Nothing
  
  '初期化
  b = 0
  l = 0
  d = 0
  '足し算(この辺りは必要に応じて適当に計算)
  For i = 0 To UBound(typScoreMorning) - 1
    '朝
    b = b + typScoreMorning(i).Eat
    l = l + typScoreMorning(i).How_Many
    d = d + typScoreMorning(i).Mealtime
'    '昼
'    b = b + typScoreNoon(i).Eat
'    l = l + typScoreNoon(i).How_Many
'    d = d + typScoreNoon(i).Mealtime
'
'    '夜
'    b = b + typScoreNight(i).Eat
'    l = l + typScoreNight(i).How_Many
'    d = d + typScoreNight(i).Mealtime
  Next i
  '総合計
  gtl = b + l + d
  MsgBox "朝の合計は: " & gtl
End Sub

'判定の条件、セルの位置関係などが変わった時はこの関数を直せばよい。
'○食事を取るか: Yesなら10点 , Noなら0点
'○何人で:2人以上でなら10点,1人でなら0点
'○食事時間:20分以上なら10点,10分以上20分未満なら5点,10分未満なら0点
Function Judge(pRng As Range) As Score
Dim typScore As Score

  '朝食を食べる(回答が1)なら10,食べない(回答が2)なら0
  If pRng.Value = 1 Then
      typScore.Eat = 10
  ElseIf pRng.Value = 2 Then
    typScore.Eat = 0
  Else
    typScore.Eat = -1  'nullはないので取りあえず-1とした。
  End If
  
  '朝食を2人以上で食べるなら10,1人なら0
  If pRng.Offset(, 1).Value = 1 Then
    typScore.How_Many = 0
  ElseIf pRng.Offset(, 1).Value >= 2 Then
    typScore.How_Many = 10
  Else
    typScore.How_Many = -1 'nullはないので取りあえず-1とした。
  End If

  '時間が20分以上なら10,10分以上20分未満なら5,10分未満なら0
  Select Case pRng.Offset(, 2).Value
    Case Is >= 20
      typScore.Mealtime = 10
    Case Is < 20
      typScore.Mealtime = 5
    Case Is < 10
      typScore.Mealtime = 0
    Case Else
      typScore.Mealtime = -1 'nullはないので取りあえず-1とした。
  End Select

  LSet Judge = typScore

End Function

他にも沢山サンプルを書いてくださってますので、ご自分に一番わかりやすい
方法でどうぞ。

1 hits

【61398】同じ処理の簡略化 たけ 09/5/5(火) 23:07 質問
【61401】Re:同じ処理の簡略化 neptune 09/5/5(火) 23:42 発言
【61403】Re:同じ処理の簡略化 たけ 09/5/6(水) 0:38 発言
【61405】Re:同じ処理の簡略化 ゆみこん 09/5/6(水) 7:10 発言
【61408】Re:同じ処理の簡略化 りん 09/5/6(水) 7:42 発言
【61411】Re:同じ処理の簡略化 neptune 09/5/6(水) 11:17 回答
【61412】Re:同じ処理の簡略化 たけ 09/5/7(木) 6:27 お礼

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