Excel - 创建更复杂表格的简化“视图”(宏?)

时间:2011-09-01 13:52:52

标签: excel excel-vba vba

简介:我的Excel工作簿中的Sheet1包含一个“复杂”表,其中包含大约130列和2,5k行。

第一期: 基于此表,我想在Sheet2中创建一个简化表(“View”),它仅包含例如Sheet1中表格中的A,C,F,G列。

当Sheet1中的表格被更改时,应该更新这个新的“简化”表格,例如以编辑的单元格形式,或插入新行。另一种接近这种方法的方法是每次用户保存工作簿或类似的东西时自动生成Sheet2中的表。

第二期: 包含F列中特定值的行,可以说值“XXX”,不应包含在Sheet2表中。

我对更高级的“高级”excel功能并不是很有经验,但在研究了这个问题后,我倾向于通过创建一个宏来接近它。这个假设是否正确?或者excel是否有任何其他功能来执行此任务?

如果创建宏是最好的方法,那么任何帮助都会非常感激。我正在玩一个带有4行测试表的arround,并将其中的两个复制到一个新的工作表中。但是我遇到了如何自动执行此操作并排除具有特定值的行的问题(问题#2)

2 个答案:

答案 0 :(得分:5)

请尝试以下代码:(放置在简单工作表模块中)

Private Sub Worksheet_Activate()

    Application.ScreenUpdating = False

    With ActiveSheet
        .UsedRange.ClearContents
        '// Copy from data sheet too presentation sheet
        Sheet1.UsedRange.Copy .[a1]
        '// Filter all rows with xxx
        .Range("F:F").AutoFilter Field:=1, Criteria1:="xxx", Operator:=xlAnd
        '// Delete all rows with xxx excluding the header
        .UsedRange.Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        '// Remove the autofilter
        If .AutoFilterMode Then .AutoFilterMode = False
        '// Delete unwanted columns
        .Range("B:B,D:E,H:H").Delete
     End With

    Application.ScreenUpdating = True

End Sub

答案 1 :(得分:3)

我这样做的方法是在工作表的on_activate方法中使用一些代码。

这样,只要用户选择该工作表,数据就会刷新。

这是伪代码:

option explicit 'but thats just me.

Private Sub Worksheet_Activate()  <<-- event of the simplified sheet.
    Worksheets("simplesheet").Cells.ClearContents
    Worksheets("alldata").Columns("A:A").Copy
    Worksheets("simplesheet").Columns("A:A").Select
    Worksheets("simplesheet").Paste
    'etc for all the relevant rows
End Sub
  

第二个问题:在F列中包含特定值的行,可以说值“XXX”,不应包含在Sheet2表中。

将以下内容添加到活动

    dim cel as range

    'for each goes in the wrong direction, we need to start down and go up.
    '1-select the REAL last cell in a range.
    Worksheets("simplesheet").Range("F65536").End(xlup).Select 'edit for Excel 2007
    Set cel = selection
    while cel.row > 0 
      if cel.value = "xxxx" then cel.entirerow.delete
      set cel = cel.offset(-1,0)
    wend
    Worksheets("simplesheet").Range("a1").select