即使未满足所有条件,Excel VBA也会运行所有If语句

时间:2020-06-14 18:08:11

标签: excel vba if-statement

我的工作表有一个包含许多列的表,但是只有前两列是输入字段,其余的具有基于前两列中的值的公式。我没有在表的前几列中手动输入信息,而是在表外部设置了两个输入字段,一旦单击带有已分配宏的按钮,便希望将它们输入表中。

我编写的VBA代码具有多个If-Then语句。如果第一个输入字段(B3)为空,则第一条语句返回一个msgbox。如果第二个输入字段(B4)为空,则第二个语句返回msgbox。如果B3和B4不为空,则第三个If-Then语句会将信息从B3和B4转移到下一个可用表行中。

如果我在B3和B4中输入信息,则代码可以正常工作。当B3和B4为空白时,就会出现问题-我收到了相应的msgbox,但是空白信息仍然作为新行添加到表中。如果在B3和B4中没有任何信息时单击我的按钮,它将继续为我提供msgbox,同时还将行添加到表中。我在做什么错了?

Sub AddToPortfolio()

Dim portfolio As Worksheet
Dim table_list_object As ListObject
Dim table_object_row As ListRow

Set portfolio = Sheets("Sheet1")
Set table_list_object = portfolio.ListObjects(1)
Set table_object_row = table_list_object.ListRows.Add

  If portfolio.Range("B3").Value = Empty Then
        MsgBox "Please Enter CUSIP ID"
     portfolio.Range("B3").Select
    Exit Sub
  End If

  If portfolio.Range("B4").Value = Empty Then
        MsgBox "Please Enter Quantity"
     portfolio.Range("B4").Select
  End If

  If portfolio.Range("B3").Value <> "" And portfolio.Range("B4").Value <> "" Then
     table_object_row.Range(1, 1).Value = portfolio.Range("B3").Value
     table_object_row.Range(1, 2).Value = portfolio.Range("B4").Value
  End If


End Sub

2 个答案:

答案 0 :(得分:0)

 Set table_list_object = portfolio.ListObjects(1)
  Set table_object_row = table_list_object.ListRows.Add

能否请您尝试在最后的IF语句中移动这两行?另外,还要在第二个if语句中放入一个“退出子”。

答案 1 :(得分:0)

写入表中的新行

代码

Option Explicit

Sub AddToPortfolio()

    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    Dim Cell1 As Range: Set Cell1 = ws.Range("B3")
    Dim Cell2 As Range: Set Cell2 = ws.Range("B4")

    If checkEmpty(Cell1, "Please Enter CUSIP ID") Then Exit Sub
    If checkEmpty(Cell2, "Please Enter Quantity") Then Exit Sub

    Dim tbl As ListObject: Set tbl = ws.ListObjects(1)
    Dim tblRow As ListRow: Set tblRow = tbl.ListRows.Add
    tblRow.Range(1, 1).Value = Cell1.Value
    tblRow.Range(1, 2).Value = Cell2.Value
    ' To avoid duplicates:
    Union(Cell1, Cell2).ClearContents

End Sub

Function checkEmpty(SourceCell As Range, ByVal Message As String) As Boolean
    If SourceCell.Value = Empty Then
        checkEmpty = True
        SourceCell.Select
        MsgBox Message
    End If
End Function