2016-11-30 166 views
0

我写在Excel中VBA的脚本与IfElseIf报表数据库检索。该搜索是通过UserForm具有两个字段进行的,标记为CountryCategory和在脚本定义如下:如果声明VBA

Dim country As String 
Dim Category As String 
country = Sheets("Results").Range("D5").Value 
Category = Sheets("Results").Range("D6").Value 

的信息被搜索和在相对于该国的呈现搜索,并且同样地,所述搜索运行所需的最小值是Country由用户提供的数据库中的国家/地区提供。

以用户输入的标准,则搜索通过数据在一个叫Database片和糊剂在另一片的结果称为Results表运行。根据搜索条件,脚本将运行If声明中规定的几个选项。

OPTION 1 - 用户提供一个国家和一个类别和:

  • country存在于数据库中,但;
  • Category不存在针对特定国家。

在这种情况下,MsgBox会弹出,说用户提供的国家和类别的特定组合不存在于数据库中。该消息将询问用户是否希望针对所提供的国家/地区的所有条目进行搜索,在这种情况下。我已经写相应代码如下:

finalrow = Sheets("Database").Range("A200000").End(xlUp).Row 

For i = 2 To finalrow 

    If Sheets("Database").Cells(i, 1) = country And _ 
     (Category <> "" Or Sheets("Database").Cells(i, 3) <> Category) Then 
       Dim question As Integer 
       question = MsgBox("Unfortunately, the Database has no sources regarding " & Category & " in " & country & ". Would you perhaps want to broaden your search and see all sources regarding " & country & "?", vbYesNo + vbQuestion, "Empty Sheet") 
        If question = vbYes Then 
         Sheets("Results").Range("D6").ClearContents 
         Category = Sheets("Results").Range("D6").Value 
         boolRestart = True 
        Else 
         Sheets("Results").Range("D5").ClearContents 
         Sheets("Results").Range("D6").ClearContents 
         Me.Hide 
         WelcomeForm.Show 
         Exit Sub 
        End If 

OPTION 2 - 用户提供了country和:

  • country存在于数据库中和;
  • 用户还提供了一个Category存在于数据库中为特定国家或;
  • 用户已经离开了Category字段为空。

在这种情况下,搜索将运行。这是写在脚本如下:

ElseIf Sheets("Database").Cells(i, 1) = country And _ 
     (Sheets("Database").Cells(i, 3) = Category Or Category = "") Then 

     'Copy the headers of the "Database" sheet 
     With Sheets("Database") 
      .Range("A1:I1").Copy 
     End With 
     Sheets("Results").Range("B10:J10").PasteSpecial 

     'Copy the rows of the table that match the search query 
     With Sheets("Database") 
      .Range(.Cells(i, 1), .Cells(i, 9)).Copy 
     End With 
     Sheets("Results").Range("B20000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 

    End If 

我试图写在几个不同的方式脚本,但搜索引擎不断不工作,我想。现在的情况是,当我输入一个Country,我知道要在数据库中,无论输入Category以及与否,OPTION 1总是触发。我曾试图取出OPTION 1干脆用选项运行只是一个If声明2因为是和搜索运行正常与Country填写并与两个CountryCategory填写。但是,只要OPTION 1在代码中,无论用户输入什么内容,这总是选项运行。

完整的代码是在这里,供大家参考:

Dim country As String 'Search query country, user-inputted 
Dim Category As String 'Search query category user-inputted 
Dim finalrow As Integer 
Dim i As Integer 'row counter 
Dim ws As Worksheet 

Set ws = Sheets("Database") 

country = Sheets("Results").Range("D5").Value 
Category = Sheets("Results").Range("D6").Value 
finalrow = Sheets("Database").Range("A200000").End(xlUp).Row 

For i = 2 To finalrow 

    If Sheets("Database").Cells(i, 1) = country And _ 
     (Category <> "" Or Sheets("Database").Cells(i, 3) <> Category) Then 
       Dim question As Integer 
       question = MsgBox("Unfortunately, the Database has no sources regarding " & Category & " in " & country & ". Would you perhaps want to broaden your search and see all sources regarding " & country & "?", vbYesNo + vbQuestion, "Empty Sheet") 
        If question = vbYes Then 
         Sheets("Results").Range("D6").ClearContents 
         Category = Sheets("Results").Range("D6").Value 
         boolRestart = True 
        Else 
         Sheets("Results").Range("D5").ClearContents 
         Sheets("Results").Range("D6").ClearContents 
         Me.Hide 
         WelcomeForm.Show 
         Exit Sub 
        End If 

    ElseIf Sheets("Database").Cells(i, 1) = country And _ 
     (Sheets("Database").Cells(i, 3) = Category Or Category = "") Then 

     'Copy the headers of the "Database" sheet 
     With Sheets("Database") 
      .Range("A1:I1").Copy 
     End With 
     Sheets("Results").Range("B10:J10").PasteSpecial 

     'Copy the rows of the table that match the search query 
     With Sheets("Database") 
      .Range(.Cells(i, 1), .Cells(i, 9)).Copy 
     End With 
     Sheets("Results").Range("B20000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 

    End If 

Next I 

非常感谢您的帮助。

+0

编辑后的版本不起作用。您的原始版本将会。更好的是,在选项1中完全消除'Category'和''“''之间的比较 - 在​​这里将'Category'与用户输入进行比较就足够了。 – bobajob

+0

谢谢你的帮助!我已经这样做了,最终结果是一样的。无论用户输入如何,选项1仍然被触发。 – franciscofcosta

回答

1

问题是,如果任何行不符合标准,您的代码将转到选项1,而我们希望只有在每行都不符合标准时才会失败。因此,我们需要对数据进行两次扫描,第一次检查是否有任何传球线路(如果不是那么我们提供清除类别),然后是另一个扫描相关数据。

试试这个:

Option Explicit 

Private Sub CommandButton1_Click() 

    Dim country As String 'Search query country, user-inputted 
    Dim Category As String 'Search query category user-inputted 
    Dim finalrow As Integer 
    Dim i As Integer 'row counter 
    Dim ws As Worksheet 
    Dim foundMatch As Boolean 
    foundMatch = False 

    Set ws = Sheets("Database") 

    country = Sheets("Results").Range("D5").Value 
    Category = Sheets("Results").Range("D6").Value 
    finalrow = Sheets("Database").Range("A200000").End(xlUp).Row 

    For i = 2 To finalrow 
     If Sheets("Database").Cells(i, 1) = country And _ 
      (Sheets("Database").Cells(i, 3) = Category Or Category = "") Then 
       foundMatch = True 
     End If 
    Next i 

    If Not foundMatch Then 
     Dim question As Integer 
     question = MsgBox("Unfortunately, the Database has no sources regarding " & Category & " in " & country & ". Would you perhaps want to broaden your search and see all sources regarding " & country & "?", vbYesNo + vbQuestion, "Empty Sheet") 
      If question = vbYes Then 
       Sheets("Results").Range("D6").ClearContents 
       Category = Sheets("Results").Range("D6").Value 
      Else 
       Sheets("Results").Range("D5").ClearContents 
       Sheets("Results").Range("D6").ClearContents 
       Me.Hide 
       WelcomeForm.Show 
       Exit Sub 
      End If 
    End If 

    For i = 2 To finalrow 
     If Sheets("Database").Cells(i, 1) = country And _ 
      (Sheets("Database").Cells(i, 3) = Category Or Category = "") Then 
       'Copy the headers of the "Database" sheet 
       With Sheets("Database") 
        .Range("A1:I1").Copy 
       End With 
       Sheets("Results").Range("B10:J10").PasteSpecial 

       'Copy the rows of the table that match the search query 
       With Sheets("Database") 
        .Range(.Cells(i, 1), .Cells(i, 9)).Copy 
       End With 
       Sheets("Results").Range("B20000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 
     End If 
    Next i 

End Sub 
+0

谢谢!这工作! – franciscofcosta

1

我想你应该在三个独立的子程序划分代码: - 当用户触发搜索的第一个会跑的话,就必须检查是否country有(给错误消息,如果不是)一个有效的值,然后检查是否Category有一个值,如果它有值,转到第二个子程序,如果它是空的,转到第三个子程序; - 第二个子程序必须获得countryCategory变量的值并返回预期结果; - 第三个子程序只能得到country变量并返回预期的结果。

你可以把模块的开头两个变量(之前的任何Sub和使用Private代替Dim)离开他们到模块中的任何子程序访问,或者你可以创建参数,子程序在那里你可以值传递给另一个Sub,但不允许它们访问该模块中的所有Sub。我更喜欢第二种选择。如果你不知道如何将参数传递到另一个模块,它是一个例子:

Sub QueryCountryAndCategory (QCountry as String, QCategory as String) 

在这种SubQCountryQCategory是变量,将只在该模块是可访问的,它会接收传递的值通过来电显示子程序,这样的事情(使用变量):

QueryCountryAndCategory(country, Category) 

或者这样:

QueryCountryAndCategory(QCountry:=country, QCategory:=Category) 

请记住,长代码难以维护并且难以测试。当你的代码变长时,总是考虑将它分成一些Sub s或Function s(它会返回一个值)。测试也更容易,因为您可以单独运行每个Sub以查看它是否正常工作。

0

(Category <> "" Or Sheets("Database").Cells(i, 3) <> Category) Then更换ORAND

,办理入住手续必须考虑

  1. category不是空的,
  2. category不发现

中频工作的方式是,它总是会触发如果任

  1. category心不是空(因此,如果您在category输入任何内容,它将匹配在这里)
  2. category不匹配(如果category为空,但它实际上有任何内容)