2016-07-07 9 views
0

てゴールを使用して値を取得する:ループは、複数のパラメータ

私のプログラムは、現在使用の単月のための加熱と冷却のコストの値を計算します。さて、私はユーザーが複数ヶ月使用することを許可しようとしています。

を、私は2つの異なる状況(4つの関数は合計)のための加熱と冷却のコストを計算(ユーザーフォームと出力用紙と一緒に)関数を作成しました:私はこれまで何をしたか

。以下はそれらのコードのコードです。異なる機能間の唯一の変更は、その隣に2つの星がある行です。これらはVBAユーザーフォームの4つの個別のドロップダウンです(それを行うより効率的な方法があるかもしれませんが、ここではそうです)。

Function CoolingCostS1(month As String, sqft As Single, ElecAUC As Single, Days As Single) As Single 

'variable declaeration 
Dim cost As Single 

Select Case Main.ddRegion.value 'Case statement for region value 

    Case "South" 

     **Select Case Main.ddS1Cooling.value** 

      Case "Chill Water System" 

       Set chillWater = New clsMonth 'create new object for CWS system 

        With chillWater 'assign calculated values 

         .January = 0.7136/20 
         .February = 0.6755/20 
         .March = 0.6528/20 
         .April = 0.7773/20 
         .May = 0.8213/20 
         .June = 0.8715/20 
         .July = 0.9/20 
         .August = 1.0243/20 
         .September = 1.0516/20 
         .October = 0.8514/20 
         .November = 0.7095/20 
         .December = 0.6994/20 

         cost = .ValueFor(month) * sqft * ElecAUC * Days 

        End With 

      Case "Direct Expansion" 

       Set DX = New clsMonth 

        With DX 

         .January = 0.577/20 
         .February = 0.553/20 
         .March = 0.516/20 
         .April = 0.611/20 
         .May = 0.703/20 
         .June = 0.74/20 
         .July = 0.801/20 
         .August = 0.834/20 
         .September = 0.9333/20 
         .October = 0.686/20 
         .November = 0.597/20 
         .December = 0.4907/20 

         cost = .ValueFor(month) * sqft * ElecAUC * Days 
        End With 
     End Select 

    Case "North" 

     Select Case Main.ddS1Cooling.value 

      Case "Chill Water System" 

       Set chillWater = New clsMonth 'create new object for CWS system 

        With chillWater 'assign calculated values 

         .January = 0.775/20 
         .February = 0.845/20 
         .March = 0.699/20 
         .April = 0.722/20 
         .May = 0.751/20 
         .June = 0.1/20 
         .July = 0.9/20 
         .August = 0.95/20 
         .September = 0.946/20 
         .October = 0.749/20 
         .November = 0.739/20 
         .December = 0.75/20 

         cost = .ValueFor(month) * sqft * ElecAUC * Days 

        End With 

      Case "Direct Expansion" 

       Set DX = New clsMonth 

        With DX 

         .January = 0.536/20 
         .February = 0.52/20 
         .March = 0.49/20 
         .April = 0.482/20 
         .May = 0.511/20 
         .June = 0.5/20 
         .July = 0.5/20 
         .August = 0.461/20 
         .September = 543/20 
         .October = 0.521/20 
         .November = 0.497/20 
         .December = 0.531/20 

         cost = .ValueFor(month) * sqft * ElecAUC * Days 
        End With 
     End Select 

End Select 

CoolingCostS1 = cost 

End Function 

ご覧のとおり、これらの機能は1か月間のみ受け付けます。ユーザーフォームには複数の月のオプションがあり、選択すると毎月1つのチェックボックスが表示されます。

シミュレート]ボタンをクリックすると、以下のコードが実行される:

2つの星があり、それが選択されている複数ヶ月間としませ用の2つのケース - オンを行うことの可能性をブレーンストーミングくれた
Private Sub bSimulate_Click() 'logic to calculate simulation values 

'''''''''''variable decleration''''''''''''''''''''''''' 

Dim s1Sqft As Single, s2Sqft As Single, s1ElecAUC As Single, s2ElecAUC As Single, s1HeatAUC As Single, s2HeatAUC As Single, Days As Single 

'''''''''''conditional if and logic''''''''''''''''''''' 

If IsNumeric(Me.txtS2elec.value) = True And IsNumeric(Me.txtS2NG.value) = True And IsNumeric(Me.txtS2sqft.value) = True And Me.ddS2cooling.ListIndex > -1 And Me.ddS2Heating.ListIndex > -1 Then 

    **case for unselected using prior information** 
    **case for selected using new information** 

    'variable assignment 

    s1Sqft = txtS1sqft.value 'system 1 
    s1ElecAUC = txtS1elec.value 
    s1HeatAUC = Me.txtS1NG.value 

    s2Sqft = txtS2sqft.value 'system 2 
    s2ElecAUC = txtS2elec.value 
    s2HeatAUC = txtS2NG.value 

    Days = txtUseDays.value 'usage page 

    'resets cells back to white 
    Me.txtS2elec.BackColor = vbWhite 
    Me.txtS2NG.BackColor = vbWhite 
    Me.txtS2sqft.BackColor = vbWhite 


    'System one output 
    Cells(13, 3).value = Days 
    Cells(14, 3).value = Application.WorksheetFunction.RoundUp(CoolingCostS1(Me.ddMonthOfUse.value, s1Sqft, s1ElecAUC, Days)/s1ElecAUC, 0) & " KWH" 
    Cells(14, 5).value = Application.WorksheetFunction.RoundUp(CoolingCostS1(Me.ddMonthOfUse.value, s1Sqft, s1ElecAUC, Days), 0) 
    Cells(15, 3).value = Application.WorksheetFunction.RoundUp((HeatingCostS1(Me.ddMonthOfUse.value, s1Sqft, s1HeatAUC, Days)/s1HeatAUC), 0) & " " & Me.ddHeatingUtility.value 
    Cells(15, 5).value = Application.WorksheetFunction.RoundUp(HeatingCostS1(Me.ddMonthOfUse.value, s1Sqft, s1HeatAUC, Days), 0) 

    'System two output 
    Cells(21, 3).value = Days 
    Cells(22, 3).value = Application.WorksheetFunction.RoundUp(CoolingCostS2(Me.ddMonthOfUse.value, s2Sqft, s2ElecAUC, Days)/s2ElecAUC, 0) & " KWH" 
    Cells(22, 5).value = Application.WorksheetFunction.RoundUp(CoolingCostS2(Me.ddMonthOfUse.value, s2Sqft, s2ElecAUC, Days), 0) 
    Cells(23, 3).value = Application.WorksheetFunction.RoundUp((HeatingCostS2(Me.ddMonthOfUse.value, s2Sqft, s2HeatAUC, Days)/s2HeatAUC), 0) & " " & Me.ddHeatingUtility.value 
    Cells(23, 5).value = Application.WorksheetFunction.RoundUp(HeatingCostS2(Me.ddMonthOfUse.value, s2Sqft, s2HeatAUC, Days), 0) 

    'System one information output 
    Cells(12, 9).value = Me.ddS1Cooling.value 
    Cells(13, 9).value = Me.ddS1Heating.value 
    Cells(14, 9).value = Me.txtS1sqft.value 

    'System two information output 
    Cells(20, 9).value = Me.ddS2cooling.value 
    Cells(21, 9).value = Me.ddS2Heating.value 
    Cells(22, 9).value = Me.txtS2sqft.value 

Else 

    HighlightBadCells2 'checks for incorrect cell input values 
    MsgBox "Please check the highlighted cells" 
    GoTo CleanFail 

End If 

Main.Hide 

CleanFail: 
End Sub 

私は写真をまだアップロードしていないので、私はあなたにユーザーフォームを表示できません。

問題:私はトラブルに選択されている複数カ月間の総コストを取得するための最も効率的な方法を把握しようとしたのです

。私はいくつかのアイデアを跳ね回りますが、それらを取り除くことはできません。私がブレーンストーミングを始めるたびに、たくさんのコードやたくさんの別々の機能や何かの不条理なことに終わります。私は既存の機能を使うことができると思ったが、複数の月を選択するときにそれを行う方法を知らない。

ご協力いただきありがとうございます。不明な点があれば教えてください。それは私には意味がありましたが、他の誰にとっても邪魔になるかもしれません。

答えて

0

私は右の理解場合は、次のようなものは、複数の選択のための新しい数式作成しなくても十分であろう:

Cells(22, 3).value = 0 
Cells(23, 3).value = 0 
For Each month in Me.ddMonthOfUse 
    Cells(22, 3).value = Cells(22, 3).value + Application.WorksheetFunction.RoundUp(CoolingCostS1(month.value, s1Sqft, s1ElecAUC, Days)/s1ElecAUC, 0) & " KWH" 
    Cells(23, 3).value = Cells(23, 3).value + Application.WorksheetFunction.RoundUp((HeatingCostS1(month.value, s2Sqft, s2HeatAUC, Days)/s2HeatAUC), 0) & " " & Me.ddHeatingUtility.value 
Next month 
+0

をユーザーフォームから選択ヶ月にそれを適用する方法はありますか?私が正しく理解していれば、これはデータ型の毎月のことです。 – ct4242

+0

ddMonthOfはリストボックスですか?もしそうなら、私は以下の答えを更新します:http://stackoverflow.com/a/2933240/3218398 – hstay

関連する問題