我将在 8 天后开始一份新工作,但对 Visual Basic 还不太熟悉。我能够跟随一位现任员工工作,在其中一份报告中,该员工筛选了大约 100 列,选择 8 列左右作为报告,然后将其复制并粘贴到新工作表中。
我想要实现的目标如下:
创建一个查看工作表 2 的宏,其中我将有报告的 8 列标题,查看工作表 1(主表)并找到 8 列并将数据(不是标题)移动到工作表 2。这将有助于加快报告速度,我希望它能够做其他事情,但这将是一个很好的起点。
例如:表 2 应该包含:承包商姓名、经理姓名、项目描述等。
答案1
尽可能基础。
1 |Sub copycolumns()
2 |Dim i As Integer, searchedcolumn As Integer, searchheader As Object
3 |
4 |For i = 1 To 8
5 |
6 | set searchheader = Sheets(2).Cells(1, i)
7 |
8 | searchedcolumn = 0
9 | On Error Resume Next
10| searchedcolumn = Sheets(1).Rows(1).Find(what:=searchheader.value, lookat:=xlWhole).Column
11| On Error GoTo 0
12|
13| If searchedcolumn <> 0 Then
14| Sheets(1).Columns(searchedcolumn).Copy Destination:=searchheader
15| End If
16|
17|Next i
18|
19|End Sub
第 4 行:使用 FOR 循环将变量从 1 移到 8。
变量i
代表工作表 2 中的当前列第 6 行:在这里我们将当前标题(单个单元格)保存为对象。此对象将在第 10 行和第 14 行中重复使用
第 8 行:您必须
searchedcolumn
在进行新搜索之前重置搜索变量。如果不重置,搜索将失败(不存在于工作表 1 中),变量仍保留旧值。第 10 行:该
find
方法是整个宏的关键部分。它从 Sheet 2 中获取当前列的字符串,并在 Sheet 1 的第一行中搜索该字符串。如果搜索到结果,则将相应的列号存储在变量中searchedcolumn
第 9 行和第 11 行:这将启动和停止错误处理程序。这样,如果第 10 行发生错误,您将不会收到内部 VBA 错误消息。相反,代码将继续运行。
第 13 行:测试 find 方法是否找到了某些内容,并且值是否从零更改为有效的列号。
第 14 行:如果是,则将工作表 1 中的整列复制到工作表 2 中的相应列
笔记:代码还可以进一步缩短。但是解释所有内容会更加复杂。
当然你必须手动删除每行开头的索引号。