2

ステートメントを使用できることは知っていますがIf、好奇心から、タイトルに記載されているように、SELECTステートメントを使用して以下の太字のようなことを行うことは可能ですか? Sub理解を深めるために、以下のように全体を提出しました。

サブ addNewCust_Click()

Dim response As String

response = Application.InputBox(prompt:="", Title:="New customer name", Type:=2)

Select Case response
Case False
    Exit Sub

'Check if response is not an empty value AND record found in "CustomerList"

Case Is <> "" & WorksheetFunction.CountIf(Worksheets("CustomerList").Range("B:B"), response) > 0

    MsgBox "'" & response & "' already exists on this sheet."
    Call addNewCust_Click

'Check if response is not an empty value and record is not found in "Customerlist"

Case Is <> "" & WorksheetFunction.CountIf(Worksheets("CustomerList").Range("B:B"), response) < 1

    Sheets("CustomerList").Range("B1048576").End(xlUp).Offset(1, 0).Value = response
    MsgBox "'" & response & "' successfully entered!"**

Case Else
        MsgBox "Field is empty!"
        Call addNewCust_Click

End Select

End Sub
4

1 に答える 1

2

このような?

Sub addNewCust_Click()
    Dim response As String

    response = Application.InputBox(prompt:="", Title:="New customer name", Type:=2)

    Select Case response
    Case False: Exit Sub    
    'Check if response is not an empty value AND record found in "CustomerList"
    Case Is <> ""
        If WorksheetFunction.CountIf(Worksheets("CustomerList").Range("B:B"), response) > 0 Then
            MsgBox "'" & response & "' already exists on this sheet."
            Call addNewCust_Click
        Else
            Sheets("CustomerList").Range("B1048576").End(xlUp).Offset(1, 0).Value = response
            MsgBox "'" & response & "' successfully entered!"
        End If
    Case Else
        MsgBox "Field is empty!"
        Call addNewCust_Click
    End Select
End Sub

フォローアップ(コメントから)

Select Caseはより高速であると考えられていますIf-Endifが、そのような小さなシナリオでは、効率の比較は無駄です。さらに重要なのは、コードの書き方です

以下は別の方法です。物事が小さな部分に分割され、すべてが適切に宣言されているので、私はこの方法が大好きです。以下のエラー処理には触れていません。詳細な分析については、これを参照してください。

以下の方法は便利です。

  1. コードを見ていて(たとえば1年後)、コードにコメントが付けられてから何が起こっているかを正確に把握している場合。
  2. コードの保守が簡単です。たとえば、シート名が変更された場合、1か所でのみ変更する必要があります。別の方法は、Codenames
  3. すべてのExcelプラットフォームで同じコードを使用できます。範囲をハードコーディングすると、例:Range("B1048576")上記のコードはExcel2003では機能しません。

サンプルコード

Sub addNewCust_Click()
    Dim ws As Worksheet
    Dim Lrow As Long
    Dim response

    '~~> Set the relevant worksheet
    Set ws = ThisWorkbook.Worksheets("CustomerList")

    With ws
        Do
            '~~> Get user response
            response = Application.InputBox(prompt:="", Title:="New customer name", Type:=2)

            Select Case response
                Case False: Exit Sub    '<~~ If user presses cancel or closes using 'X'
                Case "": MsgBox "Field is empty!" '<~~ If user enters a blank entry
                Case Else
                    '~~> Check if the entry exists
                    If WorksheetFunction.CountIf(.Range("B:B"), response) > 0 Then
                        MsgBox "'" & response & "' already exists on this sheet."
                    Else
                        '~~> Get last Row
                        Lrow = .Range("B" & .Rows.Count).End(xlUp).Row + 1
                        '~~> Add the new entry
                        .Range("B" & Lrow).Value = response
                        MsgBox "'" & response & "' successfully entered!"
                        Exit Do 'OR Exit Sub (As Applicable)
                    End If
            End Select
        Loop
    End With
End Sub
于 2013-02-18T19:25:47.043 に答える