【问题标题】:Creating effecient next statement创建有效的下一个语句
【发布时间】:2022-01-19 16:26:24
【问题描述】:

您好,我有一个代码,我使用输入字符串长度来确定它是什么类型的部分。我写了一个 else/elseif 语句,但它非常混乱,现在我得到一个没有下一个错误的 for,然后当我广告下一个时,我得到一个没有错误的下一个。有没有更好的方法来做到这一点?

我添加了下一条语句并没有错误地结束

Private Sub UserPartNumberInput_AfterUpdate()

    PartNumberToSearch = UserPartNumberInput.Text

    If Me.UFSearchTypeComboBox.Text = SearchTypeList(1) Then
        If UserPartNumberInput.Text = "" Then
        Else
            CommandButton1.Caption = "Search Google"
        End If
    End If
    
    If SearchingForHeader.Caption = "" Or SearchingForHeader.Caption = "Standards" Then 'Show Header If option Is Chosen
    Else
        SearchingForHeader.Visible = True
    End If

    Dim i As Integer

    If Len(Me.UserPartNumberInput.Text) = 11 Then
                     
        If Left((Right(PartNumberToSearch, 3)), 1) = "0" Then
            SearchingForHeader.Caption = "Search Assembly By Serial #"
            Me.Height = 445
        End If
        If Left((Right(PartNumberToSearch, 3)), 1) <> "0" Then
            SearchingForHeader.Caption = "Search Part By Serial #"
            SerialNumberCode = Left(PartNumberToSearch, 4)
            SectionNumberCode = Mid(PartNumberToSearch, 6, 2)
            PartNumberCode = Right(PartNumberToSearch, 3)
        End If
    End If                
            
    If Len(Me.UserPartNumberInput.Text) = 10 Then
            SearchingForHeader.Caption = "Search By Stadard Assemblies Parts"    
        
    ElseIf Len(Me.UserPartNumberInput.Text) = 3 Then
            SearchingForHeader.Caption = "Search Standard Part # by code"
            SerialNumberCode = PartNumberToSearch
            Me.Height = 435
            MsgBox StandardPartOptionCount(1)
        For i = 1 To LastRowLCtbl
            If ADCOStandardizedParts(i) = UserPartNumberInput Then
                Standardpartoptionrownum = i
                next   'added next                                                    
                
             MsgBox Standardpartoptionrownum       
    
            ElseIf IsLetter(Mid(Me.UserPartNumberInput.Text, 2, 1)) = True Then

                SearchingForHeader.Caption = "Search By Description"
        
    ElseIf Len(Me.UserPartNumberInput.Text) = 7 Then
    
        SearchingForHeader.Caption = "Search Standard Assemblies"
        SerialNumberCode = Left(PartNumberToSearch, 3)
        SectionNumberCode = Mid(PartNumberToSearch, 5, 2)
        PartNumberCode = Right(PartNumberToSearch, 3)
        
    ElseIf Len(Me.UserPartNumberInput.Text) = 8 Then
    
        SearchingForHeader.Caption = "Search 6000XXXX's"
        SerialNumberCode = PartNumberToSearch
            
        Call StandardPartReturn
          
    ElseIf Len(SearchingForHeader.Caption) = 5 Then
          
        SearchingForHeader.Caption = "Search ADCO Purchase Part #"
        Me.CommandButton1.Caption = "Google Search"
        Me.CommandButton2.Caption = "Open DataSheet"
        Me.CommandButton3.Caption = "Open Model"
        SerialNumberCode = PartNumberToSearch
                
     Else
        MsgBox "Incorrect Part Number Format"
         
     End If
end sub

【问题讨论】:

  • 如果你能正确缩进你的代码会很有帮助。也就是说:你的 for 循环 For i = 1 To LastRowLCtbl) 需要一个匹配的 Next 语句(否则编译器不知道循环在哪里结束)
  • 考虑使用Select Case 而不是一堆If Else 语句
  • 您好,感谢您的反馈。在过去一个月左右的时间里,我已经自学了,我不确定你正确缩进是什么意思。我试图在互联网上研究 vba 的正确缩进,但我找不到任何标准的方法。有没有最好的特定格式?
  • 另外,当我在 for 循环之后添加下一条语句时,它会显示“没有 for 的下一条语句”
  • 我修正了你的缩进,应该更清楚 Next 需要在哪里,在内部 If ElseIf 之后但在同一级别 ElseIf 之前,For 包含在.

标签: excel vba if-statement dynamic combobox


【解决方案1】:

下一个应该在SearchingForHeader.Caption = "Search By Description" 之后。代码中的逻辑结构不能部分重叠,它们必须完全位于其他逻辑结构之内或之外。缩进您的代码有助于快速可视化这一点并避免您遇到的问题。 Next 应该与对应的 For 对齐:

Private Sub UserPartNumberInput_AfterUpdate()

    PartNumberToSearch = UserPartNumberInput.Text

    If Me.UFSearchTypeComboBox.Text = SearchTypeList(1) Then
        If UserPartNumberInput.Text = "" Then
        Else
            CommandButton1.Caption = "Search Google"
        End If
    End If
    
    If SearchingForHeader.Caption = "" Or SearchingForHeader.Caption = "Standards" Then 'Show Header If option Is Chosen
    Else
        SearchingForHeader.Visible = True
    End If

    Dim i As Integer

    If Len(Me.UserPartNumberInput.Text) = 11 Then
                     
        If Left((Right(PartNumberToSearch, 3)), 1) = "0" Then
            SearchingForHeader.Caption = "Search Assembly By Serial #"
            Me.Height = 445
        End If
        If Left((Right(PartNumberToSearch, 3)), 1) <> "0" Then
            SearchingForHeader.Caption = "Search Part By Serial #"
            SerialNumberCode = Left(PartNumberToSearch, 4)
            SectionNumberCode = Mid(PartNumberToSearch, 6, 2)
            PartNumberCode = Right(PartNumberToSearch, 3)
        End If
    End If                
            
    If Len(Me.UserPartNumberInput.Text) = 10 Then
            SearchingForHeader.Caption = "Search By Stadard Assemblies Parts"    
        
    ElseIf Len(Me.UserPartNumberInput.Text) = 3 Then
            SearchingForHeader.Caption = "Search Standard Part # by code"
            SerialNumberCode = PartNumberToSearch
            Me.Height = 435
            MsgBox StandardPartOptionCount(1)
        For i = 1 To LastRowLCtbl
            If ADCOStandardizedParts(i) = UserPartNumberInput Then
                Standardpartoptionrownum = i
                MsgBox Standardpartoptionrownum       
            ElseIf IsLetter(Mid(Me.UserPartNumberInput.Text, 2, 1)) = True Then
                SearchingForHeader.Caption = "Search By Description"
            End if
        Next i
        
    ElseIf Len(Me.UserPartNumberInput.Text) = 7 Then
    
        SearchingForHeader.Caption = "Search Standard Assemblies"
        SerialNumberCode = Left(PartNumberToSearch, 3)
        SectionNumberCode = Mid(PartNumberToSearch, 5, 2)
        PartNumberCode = Right(PartNumberToSearch, 3)
        
    ElseIf Len(Me.UserPartNumberInput.Text) = 8 Then
    
        SearchingForHeader.Caption = "Search 6000XXXX's"
        SerialNumberCode = PartNumberToSearch
            
        Call StandardPartReturn
          
    ElseIf Len(SearchingForHeader.Caption) = 5 Then
          
        SearchingForHeader.Caption = "Search ADCO Purchase Part #"
        Me.CommandButton1.Caption = "Google Search"
        Me.CommandButton2.Caption = "Open DataSheet"
        Me.CommandButton3.Caption = "Open Model"
        SerialNumberCode = PartNumberToSearch
                
     Else
        MsgBox "Incorrect Part Number Format"
         
     End If
end sub

使用Select Case(注意这是未经测试的,我可能没有正确理解你的逻辑):

Private Sub UserPartNumberInput_AfterUpdate()

    PartNumberToSearch = UserPartNumberInput.Text

    If Me.UFSearchTypeComboBox.Text = SearchTypeList(1) Then
        If UserPartNumberInput.Text = "" Then
        Else
            CommandButton1.Caption = "Search Google"
        End If
    End If
    
    If SearchingForHeader.Caption = "" Or SearchingForHeader.Caption = "Standards" Then 'Show Header If option Is Chosen
    Else
        SearchingForHeader.Visible = True
    End If

    Dim i As Integer
    Select Case Len(Me.UserPartNumberInput.Text)
        Case 11
            If Left((Right(PartNumberToSearch, 3)), 1) = "0" Then
                SearchingForHeader.Caption = "Search Assembly By Serial #"
                Me.Height = 445
            End If
            If Left((Right(PartNumberToSearch, 3)), 1) <> "0" Then
                SearchingForHeader.Caption = "Search Part By Serial #"
                SerialNumberCode = Left(PartNumberToSearch, 4)
                SectionNumberCode = Mid(PartNumberToSearch, 6, 2)
                PartNumberCode = Right(PartNumberToSearch, 3)
            End If
    
        Case 10
            SearchingForHeader.Caption = "Search By Stadard Assemblies Parts"    
        
        Case 3
            SearchingForHeader.Caption = "Search Standard Part # by code"
            SerialNumberCode = PartNumberToSearch
            Me.Height = 435
            MsgBox StandardPartOptionCount(1)
            For i = 1 To LastRowLCtbl
                If ADCOStandardizedParts(i) = UserPartNumberInput Then
                    Standardpartoptionrownum = i
                    MsgBox Standardpartoptionrownum       
                ElseIf IsLetter(Mid(Me.UserPartNumberInput.Text, 2, 1)) = True Then
                    SearchingForHeader.Caption = "Search By Description"
                End if
            Next i

        Case 7
            SearchingForHeader.Caption = "Search Standard Assemblies"
            SerialNumberCode = Left(PartNumberToSearch, 3)
            SectionNumberCode = Mid(PartNumberToSearch, 5, 2)
            PartNumberCode = Right(PartNumberToSearch, 3)

        Case 8
            SearchingForHeader.Caption = "Search 6000XXXX's"
            SerialNumberCode = PartNumberToSearch
              
            Call StandardPartReturn

        Case Else
            If Len(SearchingForHeader.Caption) = 5 Then
          
                SearchingForHeader.Caption = "Search ADCO Purchase Part #"
                Me.CommandButton1.Caption = "Google Search"
                Me.CommandButton2.Caption = "Open DataSheet"
                Me.CommandButton3.Caption = "Open Model"
                SerialNumberCode = PartNumberToSearch
            Else
                MsgBox "Incorrect Part Number Format"
            End If
    End Select
end sub

【讨论】:

  • 已修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多