根据其他单元格中的值将行数据从一个工作表复制到一个或多个工作表

时间:2012-02-22 11:22:35

标签: excel vba excel-vba

我在A - C列中有一张包含用户详细信息的表格。 列D-H也是用户订阅的分发列表。 (当前复选框链接到单元格以指示用户订阅的列表)

用户可以订阅多个列表。

目前我可以使用可以过滤用户列表x的过滤器,将用户信息复制到另一个工作表,然后下一个列表过滤(用于列表选择的文本) 这确实会导致此工作表的某些用户之间出现一些问题(那些不知道如何使用过滤器的人)

我想为每个自动填充的列表创建一个新工作表。 当用户在列表中添加/删除时,他的详细信息会自动从相应的“列表”中添加/删除。

这样没有人可以抱怨过滤器 然后,他们可以根据需要将他们需要的“列表”导出到另一个xls doc或csv。

我找到了有关如何执行此操作的各种选项,但所有选项都只有一个选择列。我以为我可以改变示例代码中的一些范围等,但是由于我对VB的了解有限,所有这些都失败了。

有关如何执行此操作的任何建议? 谢谢!

2 个答案:

答案 0 :(得分:1)

请不要尝试创建两份数据副本。保持两个版本的相同数据是非常非常困难的。

我相信您最好的选择是创建一个宏,您的用户可以使用它选择所需的过滤器。

您没有详细描述您的数据,因此我想象了以下内容:

Name    Addr        Tele   List1    List2   List3   List4   List5
John    London      1234   x                
Jane    Paris       2345            x           
Kevin   Stockholm   3456                    x       
Mary    Brussels    4567                            x   
Nigel   Dublin      5678                                    x
Abby    Athens      6789   x        x               x
Brian   Rome        7890                    x           

鉴于上述布局,下面的宏显示了我将提供的那种东西。

执行宏时,它会显示如下的InputBox:

enter image description here

用户可以从中选择所需的过滤器。

我希望这会给你一些想法。

Option Explicit
Sub SelectFilter()

  Dim ColNum() As Variant
  Dim InxList As Long
  Dim ListName() As Variant
  Dim Prompt As String
  Dim ReturnValue As Variant

  ' Load ListName with user-friendly names for the lists
  ListName = Array("Name list 1", "Name list 2", "Name list 3", _
                   "Name list 4", "Name list 5")
  ' Load ColNum with the column number for each list.  The entries in ColNum
  ' must be in the same sequence as the entries in ListName.  Column "A" is
  ' column 1, column "B" is column 2 and so on.
  ColNum = Array(4, 5, 6, 7, 8)

  ' Combine the user-friendly list names to create a menu
  Prompt = ""
  For InxList = 0 To UBound(ListName)
    Prompt = Prompt & InxList + 1 & ". " & ListName(InxList) & vbLf
  Next
  Prompt = Prompt & "Please enter the number against the list you require." _
           & vbLf & "Leave box empty to cancel selection."

  ' Loop until user cancels or enters a permitted value
  Do While True
    ReturnValue = InputBox(Prompt, "Select filter")
    If VarType(ReturnValue) = vbBoolean Then
      If Not ReturnValue Then
        ' The documentation for InputBox claims it returns False if
        ' the user clicks Cancel.  In my experience it return a
        ' null string but check to be on the safe side.
        Exit Sub
      Else
        ' True is not a documented return value from InputBox.
        ' This code should never be executed but if something
        ' goes wrong there is a message for the user.
        Call MsgBox("Please report there has been a InputBox " & _
                    "error type 1 to Chaka", vbCritical)
        Exit Sub
      End If
    End If
    If VarType(ReturnValue) <> vbString Then
      ' False or a string are the only documented return values
        ' This code should never be executed but if something
        ' goes wrong there is a message for the user.
       Call MsgBox("Please report there has been a InputBox " & _
                    "error type 2 to Chaka", vbCritical)
       Exit Sub
    End If
    If ReturnValue = "" Then
      ' User has clicked cancel or left the text box empty.
      Exit Sub
    End If
    If IsNumeric(ReturnValue) Then
      InxList = ReturnValue - 1
      If InxList >= 0 And InxList <= UBound(ListName) Then
        ' Good selection
        Exit Do
      End If
    End If
  Loop

  With Sheets("Sheet2")
    If .AutoFilterMode Then
      ' AutoFilter is on.  Cancel current selection before applying
      ' new one because criteria are additive.
      .AutoFilterMode = False
    End If

    .Cells.AutoFilter Field:=ColNum(InxList), Criteria1:="x"
  End With

End Sub

答案 1 :(得分:0)

一个简单的解决方案,希望这有帮助

我认为这是一个简单的解决方案:

  1. 将主页上的标题复制到顶行 表
  2. 将此公式粘贴到每张纸的字段A2中:='MainSheet'!A2:I555(数字 555可根据要求增加)
  3. 首先按行拖动,然后按列拖动直至结束
  4. 在带标题的第一行中,根据您的要求过滤数据,例如在MainSheet中,可以在任何所需的任何列上过滤数据
  5. 为所有工作表执行此操作
  6. 更新MainSheet中的数据时,只需重新运行过滤器以刷新数据
  7. HTH,