VBA:使用工作表名称和/或范围名称作为inputfunction

我有一个简单的函数,阴影工作表中给定范围的其他行:

Public Function ShadeEveryOtherRow() Sheets("mySheet").Select ShadedRows = Range("myRange").Rows.Count ' determines the number of rows to shade in the range ' Code that loops through and shades rows here End Function 

我希望能够使用给定的工作表名称和范围作为input来调用此函数。 如果我写如下所示的函数,并试图使用test()子执行,我会得到一个“编译错误:types不匹配”错误。 任何援助将不胜感激。 谢谢。

 Public Function ShadeEveryOtherRow(targetSheet As Worksheet, targetRange As Range) Dim targetSheet As Worksheet Dim targetRange As Range Sheets(targetSheet).Select shadeRows = Range(targetRange).Rows.Count 'Code that shades rows here End Function Sub test() ShadeEveryOtherRow "mySheet", "myRange" End Sub 

targetRangetargetSheet应该是stringtypes,而不是作为对象传递给函数。

 Public Function ShadeEveryOtherRow(targetSheet As string, targetRange As string) Dim targetSheet As Worksheet Dim targetRange As Range Sheets(targetSheet).Select shadeRows = Range(targetRange).Rows.Count 'Code that shades rows here End Function Sub test() ShadeEveryOtherRow "mySheet", "myRange" End Sub 

不要Dim你的variables两次。 在函数签名中声明它们就足够了。 另外,不要使用。select。 做你想做的明确。

 Public Function ShadeEveryOtherRow(targetSheet As string, targetRange As string) shadeRows = Sheets(targetSheet).Range(targetRange).Rows.Count 'Code that shades rows here End Function 

编辑:像Sigil指出下面你应该使用string为您的variables。 另一种select是明确地通过范围。

 Public Function ShadeEveryOtherRow(targetRange As Range) shadeRows = targetRange.Rows.Count 'Code that shades rows here End Function Sub test() ShadeEveryOtherRow Sheets("mySheet").Range("myRange") End Sub 

记住! 始终在所有代码的顶部使用Option Explicit