比较数组与表

时间:2015-02-04 01:45:54

标签: vba excel-vba excel-2007 excel

我的目标是将Workbook中的工作表(ws1 ... wsn)加载到具有特定条件的WorkbookA中。 我已经在WorkbookA中形成了一系列工作表。

条件:
我在WorkbookB中有一个表(tblList),它列出了必须忽略的工作表名称loading(假设我不想加载ws2,ws4)。

Set SourceDataWorkbook = Workbooks.Open(vSrcFileName)
validationProd = SourceDataWorkbook.Sheets.Count

ReDim arrsNames(validationProd)
For i = 1 To validationProd
sName = ""

If fCheckSheet(SourceDataWorkbook, SourceDataWorkbook.Sheets(i).Name) Then
    sName = SourceDataWorkbook.Sheets(i).Name
    If Len(Trim(sName)) > 30 Then
    sName = Mid(sName, 1, 29)
End If
    arrsNames(i - 1) = sName
    outputWorkbook.Sheets.Add(After:=outputWorkbook.Worksheets(i + 3)).Name = _
        sName + "_P"
    SourceDataWorkbook.Sheets(i).Activate
Else
    ErrorStatus = "Source Sheet not found "
    msgBoxReturn = MsgBox(ErrorStatus & SourceDataWorkbook.FullName, _
        vbExclamation + vbOKCancel)
    GoTo TheExit:
End If

请帮助我达到要求。

2 个答案:

答案 0 :(得分:1)

您的代码有很多悬而未决的陈述(For LoopIf Statements) 我不知道你的意思是加载,但如果你想要的是从WorkbookA中复制不在列表中的工作表(WorkbookB中的表格中的表格),你可以尝试下面的内容:

WorksheetB中的代码:

Dim sourcewb As Workbook, destwb As Workbook
Dim ws As Worksheet
Set sourcewb = Workbooks("workbookname") 'or using Open method
Set destwb = ThisWorkbook 'contains your table

For Each ws In sourcewb.Sheets
    If IsError(Application.Match(ws.Name, Sheet1.Range("tblList"), 0)) Then
        ws.Copy , destwb.Sheets(destwb.Sheets.Count) 'copy after last sheet
    End If
Next

假设您的表格只有一列,如下所示:

enter image description here

如果没有,您应该包括如下标题:

If IsError(Application.Match(ws.Name, Sheet1.Range("tblList[List]"), 0)) Then

请注意,Sheet1是包含您的表格的工作表代号 它可以替换为destwb.Sheets("Sheet1")或您的工作表具有的任何名称。这是你正在尝试的吗? HTH。

答案 1 :(得分:1)

L42的替代解决方案。 abpve问题可以通过使用Dictionary来实现。

Public Function ExclutionDict(Table As String) As Dictionary

Dim rngTable As Range
Dim arr As Variant
Dim Dict As Dictionary
Dim Count As Long
Dim tblIgnoreLoad As String
Dim lo As Excel.ListObject
Dim test As String

If Table = "tblIgnoreLoad" Then
Set lo = ShControl.ListObjects("tblIgnoreLoad")
Set rngTable = lo.DataBodyRange

    arr = rngTable.Value
    Set Dict = New Dictionary

    For Count = LBound(arr, 1) To UBound(arr, 1)
     If Len(arr(Count, 1)) <> 0 Then
         Dict.Add arr(Count, 1), Count
     End If
    Next Count
End If
Set ExclutionDict = Dict
End Function

可以执行上述功能以匹配要求

Dim temp As Dictionary
    Set temp = ShControl.ExclutionDict("tblIgnoreLoad")

     If temp.Exists(SourceDataWorkbook.Sheets(i).name) Then
      'Do Nothing

     Else 
  ' Do you usual copy/load
end if

该表被转换为字典,列表被视为数组。验证条件以检查字典中是否存在工作表,不执行任何操作;别的复制。

注意:请不要忘记添加Microsoft Scripting Runtime的引用以启用字典属性。

感谢。