Excel VBA 小技巧 -- 如何使录制的宏通用化
有朋友问到:我在当前工作表录制的宏能用到其他工作表吗?对这个问题的回答是:一般来说不能,但在两种情况下是可能的。如果其他工作表与当前录制宏的工作表相同,则是可以应用的。但这种情况极为罕见,更多的是第二种情况。针对某个工作表录制的宏,里面会有一些对特定的行、列或单元格的引用。工作表不同,一般来说表格结构也不同,所以对某个工作表有效的行、列或单元格的引用,是不能应用于其他工作表的。所谓将宏通用化,就是把对这些特定行、列或单元格的引用参数化,不同工作表体现为不同的行、列或单元格的参数。只要提供不同的参数,就可以应用于不同的工作表。这是一个非常简单的表格,表头只有一行。录制冻结表头的宏,并命名为 FreezeHeadings,一般来说最后体现为下面的 VBA 代码:Sub FreezeHeadings()Rows("2:2").Select ActiveWindow.FreezePanes =TrueEnd Sub
要想让这个宏能够应用于冻结任意表头,就要将 Range("2:2") 中的 2 参数化,由用户输入表头所占的行数,代码如下:Sub FreezeHeadings() Dim headingRows As Long Dim freeRow As Long Do headingRows = InputBox("请输入表头所占行数:") Loop Until headingRows >0 freeRow = headingRows +1Rows(freeRow & ":" & freeRow).Select ActiveWindow.FreePanes =TrueEnd Sub
一般来说,不同的表格结构主要体现在表头上。冻结表头的意义在于翻页时表头不会消失,只要将表头所占用的行冻结住即可。用户只要输入一个表头所占行数的参数,就可以将冻结表头的宏应用于各个工作表。现在要将左图的表格做一下美化,使其成为右图的样子。例1非常简单,用户只需要提供一个参数即可。这个美化表格的例子就比较复杂了,不仅需要表头参数,还需要表体的参数,不仅需要行数,还需要列数。如果还是利用 InputBox 提供参数的话,因为 InputBox 只有一个输入框,就需要将以上参数编排为以下结构:第一个 RS:RE 结构表示表头的 起始行:结束行,第二个 RS:RE 表示表体的 起始行:结束行,CS:CE 表示起始列:结束列。表格格式化宏 FormatTable 的代码如下:这段代码用于获取用户输入的参数,并对参数进行检查和解析。这段代码主要是设置表头行高、表体行高,以及对整个表格进行格式化。