VBA - 当用户关闭文件时,将特定行从一个 sheet 复制到另一个 sheet
VBA - copy specific rows from one sheet into another sheet when user closes file
我是 VBA 的新手,我正在为我想要构建的文件苦苦挣扎。
我有一个主要的 Sheet,简单来说看起来像这样(从 B 列开始 - A 是一个空列):
main
这是一个简化版本,仅供示例使用。 sheet 的第一个 table 从 B13 到 O92,第二个从 B104 到 O114,但其中一些行可能是空的。
我的目标是将来自第一个区域的内容的行与来自第二个区域的内容的行连接在不同的 sheet (Sheet1) 中,在左侧添加一个带有 1s 的列和 "Cell 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 是 "emptied" 当文件打开和编辑时文件关闭 - 这样如果添加新行或更新信息,它就会进入Sheet每次1个。
我已经尝试了一些在网上找到的东西,但无法正常工作。我的主要问题是一个接一个地添加指定的行,但我也很难在每次打开文件时重置 Sheet1 并在文件关闭时自动 运行 宏。
任何帮助将不胜感激。
希望这能让您入门。 两个 subs 都需要粘贴在VBE 中ThisWorkBook
而不是模块或sheet(n) 下。
第一个子程序将在工作簿打开时执行。
您确定要在这种情况下清除您的 sheet 吗?
您将永远无法访问您的 table(没有解决方法),因为它会在每次打开 时清除。
如果这是您的需要,请参阅以下方法清除动态范围(Col A - D 一直到 Col A 中使用的最后一个单元格)Sheet1
每次 打开包含此代码的工作簿。
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
接下来,下面的子程序只会在本书关闭之前执行。这是您的大部分代码将用于构建您的 table 的地方。
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
您需要直接限定您的对象(范围、单元格等)(其中 sheet),因为代码不会放在 sheet。第一个 sub 使用 With
块来限定范围,第二个 sub 直接用 ThisWorkbook.Sheets(1).
限定所有对象
最后,我建议您编写代码以在模块中构建 table(限定范围!),这样您就可以测试和调试,而无需连续 close/open 您的书。一旦您的代码在模块中运行,您可以将代码直接复制并粘贴到此处的第二个子项中,您就可以开始了!
我是 VBA 的新手,我正在为我想要构建的文件苦苦挣扎。
我有一个主要的 Sheet,简单来说看起来像这样(从 B 列开始 - A 是一个空列):
main
这是一个简化版本,仅供示例使用。 sheet 的第一个 table 从 B13 到 O92,第二个从 B104 到 O114,但其中一些行可能是空的。
我的目标是将来自第一个区域的内容的行与来自第二个区域的内容的行连接在不同的 sheet (Sheet1) 中,在左侧添加一个带有 1s 的列和 "Cell 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 是 "emptied" 当文件打开和编辑时文件关闭 - 这样如果添加新行或更新信息,它就会进入Sheet每次1个。
我已经尝试了一些在网上找到的东西,但无法正常工作。我的主要问题是一个接一个地添加指定的行,但我也很难在每次打开文件时重置 Sheet1 并在文件关闭时自动 运行 宏。
任何帮助将不胜感激。
希望这能让您入门。 两个 subs 都需要粘贴在VBE 中ThisWorkBook
而不是模块或sheet(n) 下。
第一个子程序将在工作簿打开时执行。
您确定要在这种情况下清除您的 sheet 吗?
您将永远无法访问您的 table(没有解决方法),因为它会在每次打开 时清除。
如果这是您的需要,请参阅以下方法清除动态范围(Col A - D 一直到 Col A 中使用的最后一个单元格)Sheet1
每次 打开包含此代码的工作簿。
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
接下来,下面的子程序只会在本书关闭之前执行。这是您的大部分代码将用于构建您的 table 的地方。
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
您需要直接限定您的对象(范围、单元格等)(其中 sheet),因为代码不会放在 sheet。第一个 sub 使用 With
块来限定范围,第二个 sub 直接用 ThisWorkbook.Sheets(1).
最后,我建议您编写代码以在模块中构建 table(限定范围!),这样您就可以测试和调试,而无需连续 close/open 您的书。一旦您的代码在模块中运行,您可以将代码直接复制并粘贴到此处的第二个子项中,您就可以开始了!