使用字符串数组来获取要在VBA中复制数据的条件

时间:2017-05-24 22:29:03

标签: arrays excel vba excel-vba

我正在编写一个代码,您可以在其中确定要在我的常规报告中包含哪些参数。我需要在需要修改或添加参数时更改我的代码。

更改完成后,我需要更改要打开的报告并从中复制格式化的表。我希望我的代码要做的是向用户询问他们想要包含的参数并将它们存储在某个数组中(可能),以下代码将有条件检查字符串数组是否包含参数的单词。

我在这里粘贴一个想法,但我不确定这是否是更有效的方式。

Dim parameters() As String
'Input box for size of array*
redim parameters(size)

'Input box for p1, p2, ... pn
parameters = { p_1, p_2, ... p_n}  ' I am not really sure about this part

For i = 1 To size
    If LCase(parameters(i)) = "parameter_name1" Then 
        'Copy the table of paramater_name1 report
        Exit For
    End If
Next i

For i = 1 To size
    If LCase(parameters(i)) = "parameter_name2" Then 
        'Copy the table of paramater_name2 report
        Exit For
    End If
Next i  

...

是否有更具体(并且迭代次数更少)的方法来查找输入值是否在数组中?如您所见,我正在检查数组中的每个对象。

欢迎任何形式的帮助。

3 个答案:

答案 0 :(得分:0)

由于不清楚哪个VBA应用程序是您的上下文(即您可以在Excel-VBA中使用Application.Match),您可以在Scripting.Dictionary对象的帮助下实现此目的,您可以在其中放置参数名称作为键,然后使用Dictionary.Exists方法进行检查。然后,您将获得两个好处:

  • 无循环轻松搜索
  • 快速搜索

Sub UsingADictionary()
    Dim D As Object: Set D = CreateObject("Scripting.Dictionary")
    D.CompareMode = TextCompare ' <-- If you want to ignore case in param names

    ' dummy statement to insert keys. Values will be 0, don't care
    D("p_1") = D("p_2") + D("p_3") + D("p_4") + D("p_5")  '...

    If D.Exists("p_2") Then
      Debug.Print "p_2 exists"
      ' ... do something for p_2
    Else
      Debug.Print "p_2 does not exist"
    End If
End Sub

现在您已指定Excel和Application.Match,它可以这样工作。请注意,您的搜索数组应声明为variant,而不是

等类型数组
Sub UsingMatch()
  Dim parameters
  parameters = Array("aa", "bb", "cc", "dd", "ee")

  If Not IsError(Application.Match("a", parameters, 0)) Then
    Debug.Print "aa found"
  Else
    Debug.Print "aa Not found"
  End If
End Sub

请注意,Match不区分大小写。

答案 1 :(得分:0)

您可以通过将数组连接到字符串并搜索字符串来搜索数组,以下是它如何工作的示例:

Sub SearchArray()
    Dim MyArr As Variant
    MyArr = Array("Hello", "World", "These", "Are", "Seperate", "Array", "Values")
    If InStr(1, "|" & Join(MyArr, "|") & "|", "|These|") > 0 Then MsgBox "Found These"
    If InStr(1, "|" & Join(MyArr, "|") & "|", "|NotInArray|") > 0 Then MsgBox "Found NotInArray"
End Sub

我们使用管道将数组连接到单个字符串作为分隔符,我们然后用|来顶部和尾部这样我们就可以在任一边用管道搜索我们的字符串,如果我们的搜索字词部分存在于另一个值中,我们这样做是为了阻止它返回误报。

一旦我们得到了我们的字符串,我们使用instr来确定我们的搜索词的起始字符,如果没有找到它将只是零,一个简单的测试,看看结果是否> 0将确定是否值你正在寻找存在于阵列中。

答案 2 :(得分:0)

也许这适用于你

For i=lbound(parameters) to ubound(parameters)
  Select Case Lcase(parameters(i))
    Case "parameter name1"
      Set tbl= ws.ListObjects(tablename)
  End Select
  'Copy tablecontents
Next i