【问题标题】:VBA - copy specific rows from one sheet into another sheet when user closes fileVBA - 当用户关闭文件时,将特定行从一张表复制到另一张表中
【发布时间】:2018-07-12 22:17:13
【问题描述】:

我是 VBA 新手,我正在为一个想要构建的文件而苦苦挣扎。

我有一个简单的主工作表,看起来像这样(从 B 列开始 - A 是一个空列):

main

这是一个简化版本,仅用于示例。表格的第一个表格从 B13 到 O92 不等,第二个表格从 B104 到 O114 不等,但其中一些行可能是空的。

我的目标是将来自第一个区域的内容的行与来自不同工作表(Sheet1)的第二个区域的内容的行连接起来,在左侧添加一个带有 1 和“单元格 0”的列(单元格 B1 的内容) .使用示例,结果将是这样的:

Sheet1

Sheet1 将保持隐藏状态,因为我将它用作不同文件的信息源。事实上,如果我找到一种以不同方式复制信息的方法,我可能不需要 1s 列 - 我正在这样做(wsSource 是 Sheet1):

  lRow = wsSource.Columns("A").Find(1, SearchDirection:=xlPrevious, LookIn:=xlValues, LookAt:=xlWhole).Row
  wsSource.Range("B1:N" & lRow).Copy

我试图这样做,以便在文件打开时“清空”Sheet1,并在文件关闭时进行编辑 - 这样,如果添加新行或更新信息,它每次都会进入 Sheet1。

我尝试了一些我在网上找到的东西,但无法正常工作。我的主要问题是一个接一个地添加指定的行,但我也很难在每次打开文件时重置 Sheet1 并在文件关闭时自动运行宏。

任何帮助将不胜感激。

【问题讨论】:

    标签: vba excel excel-formula excel-2010


    【解决方案1】:

    希望这能让您入门。 两个子都需要粘贴到 VBE 中的ThisWorkBook 下,而不是模块或工作表(n)下。

    第一个 sub 将在工作簿打开时执行。
    您确定要在这些情况下清除工作表吗?
    您将永远无法访问您的桌子(没有变通方法),因为它会在每次打开时清除。

    如果这是您需要的,请参阅下面的方法来清除 Sheet1每次包含的工作簿上的动态范围(Col A - D 直到 Col A 中使用的最后一个单元格)此代码已打开。

    Private Sub Workbook_Open()
    
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim ClearRange As Range
    
    Application.ScreenUpdating = False
        With ws
            .Visible = xlSheetVisible
                .Range("A1:D" & .Range("A" & .Rows.Count).End(xlUp).Row).ClearContents
            .Visible = xlSheetHidden
        End With
    Application.ScreenUpdating = True
    
    End Sub
    

    接下来,下面的 sub 只会在书籍关闭之前执行。这是您的大部分代码将用于构建表格的地方。

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    Application.ScreenUpdating = False
        ThisWorkbook.Sheets(1).Visible = xlSheetVisible
            'Code goes here
        ThisWorkbook.Sheets(1).Visible = xlSheetHidden
    Application.ScreenUpdating = True
    
    End Sub
    

    您需要直接限定您的对象(范围、单元格等)(哪个工作表),因为代码不会包含在工作表中。第一个子使用With 块来限定范围,第二个子直接使用ThisWorkbook.Sheets(1). 限定所有对象

    最后,我建议您编写代码以在模块内构建表格(限定范围!),这样您就可以测试和调试,而无需连续关闭/打开您的书。一旦您的代码在模块中工作,您可以将代码直接复制并粘贴到此处的第二个子中,您就可以开始了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多