2017-12-16 11 views
0

わかりやすく簡潔にしてコードを改善しようとしています。 「ABC」という名前の「MODTEST」とのSheet1という名前のモジュールでは、私は次のようにありますFORを使用してそれぞれの変数名で関数を呼び出す方法は?

Sub Questionnaire_1() ' ModTest 
    ' do something 
End Sub 

Sub Questionnaire_2() ' ModTest 
    ' do something 
End Sub 

Sub Questionnaire_3() ' ModTest 
    ' do something 
End Sub 

Sub Questionnaire_4() ' ModTest 
    ' do something 
End Sub 

Sub Math() ' ModTest 

     Dim Question As Integer 

     Question = Sheets("ABC").Range("G5").Value 

     If Question = 0 Then 

      ' do something 

     Else 
       Select Case Question 

        Case Is = 1 
         Call Questionnaire_1 

        Case Is = 2 
         Call Questionnaire_1 
         Call Questionnaire_2 

        Case Is = 3 
         Call Questionnaire_1 
         Call Questionnaire_2 
         Call Questionnaire_3 

        Case Is = 4 
         Call Questionnaire_1 
         Call Questionnaire_2 
         Call Questionnaire_3 
         Call Questionnaire_4 
       End Select 
      End if 
End Sub 

しかし、サブQuestionnaire_1 [私は4件のアンケートを使用していませんが、100私の意図は、ラインを維持することです(...)サブQuestionnaire_100]が選択ケースを排除することでコマンドに以内に「変数」という名前コール機能を改善します

Sub Math() 

Dim i, Question As Integer 
Dim Variable as String 

Question = Sheets("ABC").Range("G5").Value 

     If Question = 0 Then 

     ' do something 

     Else 
      For i = 1 to Question 

      Variable = "Questionnaire_" & i 

      Call Variable 
      Next i 
     End if 
End Sub 

缶だれでもしてください 助けて?私は、以下の「VBAコンパイルエラー:予想されるサブ、関数やプロパティ」を受け取る。


よりリッテを考えると、また、働いている他のソリューションでのSelect Caseとコール機能ラウンドを取得することが可能であったと100隻の潜水艦の使用を避けるよう、フォローアップ、新たに改良されて、すべての上記のコードを置き換えます!。私はこのコードをあなたのために働くかもしれないと思われる

Sub Questionnaire() ' ModTest 

Dim i, f, g, Question As Integer 

Question = Sheets("ABC").Range("G5").Value 

    If Question = 0 Then 

     ' do something 

    Else 

     For i = 1 To Question 

      f = 18 + 2 * i 
      g = 19 + 2 * i 

      With Worksheets("ABC") 

      .Activate 
      .Range("V2").Value = i 
      .Range("X2").Value = "C" 
      .Range("G2").Select 
       Selection.Copy 
      .Range("G" & f).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
      .Range("G3").Select 
       Selection.Copy 
      .Range("H" & g).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
      .Range("X2").Value = "I" 
      .Range("L5").Select 
       Selection.Copy 
      .Range("L" & f).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
      .Range("L6").Select 
       Selection.Copy 
      .Range("M" & g).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

      End With 

     Next i 
    End If 
End Sub 
+0

'変数="アンケート "&i'。文字列を連結するには '&'を使い、ブール演算子として 'And'を使います。 –

+0

可読性と簡潔さを向上させることを目的としている場合は、まずは100のSubsを使用するべきではありません。それらがすべて同じ(名前付けを考慮して)同じであると仮定すると、おそらくパラメータやクラスを調べるべきです。 – Chrowno

+2

[文字列でサブを呼び出そうとしている - VBA](https://stackoverflow.com/questions/15969796/trying-to-call-a-sub-with-a-string-vba) –

答えて

1

それをテストしてください

Option Explicit 

Sub MathTest() 
    ' 17 Dec 2017 
    ' "Math" is a module of VBA. (For explanation, select and press F1) 
    ' Its use as a procedure name may lead to unexpected results 

    Dim Ws As Worksheet 
    Dim i As Integer 

    Set Ws = Worksheets("ABC") 
    Application.ScreenUpdating = False 
    ' this loop will not run if G5 < 1 
    For i = 1 To Int(Val(Ws.Range("G5").Value)) 
     Questionnaire i, Ws 
    Next i 
    Application.ScreenUpdating = True 
End Sub 

Private Sub Questionnaire(ByVal Q As Integer, _ 
          Ws As Worksheet) 
    ' 17 Dec 2017 

    Const WhatsThis As Long = 18 

    ' in the next line, all items are Variants except 'Question' 
    ' Dim i, f, g, Question As Integer 
    Dim RowG As Long 
    Dim i As Long 

    RowG = WhatsThis + (2 * Q) 

    With Ws 
     .Range("V2").Value = Q 
     .Range("X2").Value = "C" 

     For i = 0 To 1 
      .Cells(RowG + i, "G").Value = .Cells(2 + i, "G").Value 
     Next i 
    End With 
End Sub 
+0

"Variatus"、ありがとうございました。うわー、私たちは今、3つの可能な解決策を持っています!私はあなたのコードを変更し、私のニーズに合うように適応させる自由を取った。テストされ、リンクが提供されています(https://drive.google.com/open?id=1jRHLOD3ig1OVW27iABxxJnrr6wPOtdgP)。ご多幸を祈る。 –

+0

私はこれほどまでにマークから離れていなかったことをうれしく思っています。私が眠っている間にあなたの編集について何か騒ぎがあるのを見ました。司会者は、自分のコードのカスタマイズが私の答えの価値には改善せず、あなたの編集を許可しなかったと考えました。これはあなたの努力に感謝していることを知らせることです。 – Variatus

+0

それについてニース知っている。素晴らしいクリスマスを祈っています。 –

関連する問題