我想知道我是否可以保存通用范围,而不附加工作表名称?
让我们说我的程序为一周中的每一天创建一张工作表,然后为每张工作表制作标题。我想给它一些范围,它必须合并并在每张表中添加不同的标题到这些范围。所以每张纸的标题看起来都一样。
我有以下范围,例如:
...
Set rowTwoHeadingKiloRange = Range(Cells(2, 4), Cells(2, 8))
Set rowTwoHeadingUnitRange = Range(Cells(2, 10), Cells(2, 14))
...
现在,当我尝试将字典中的这个范围传递给每个创建的工作表时,我发现我有不希望的结果,因为有些标题是在不属于它们的工作表上创建的(而且我认为这是因为当创建范围,它在那一刻附加到活动工作表 - 可能会不时地不同。
所以现在我基本上有一个看起来像这样的函数......
Public Function colmHeadingsAndSpacing(sheetName)
With Worksheets(sheetName)
...
Set rowTwoHeadingKiloRange = Range(Cells(2, 4), Cells(2, 8))
Set rowTwoHeadingUnitRange = Range(Cells(2, 10), Cells(2, 14))
...
End with
End Function
...每次创建工作表时都会运行该函数,其中包含刚刚创建的工作表的名称。但是当我每次使用相同的数据(范围)时,这会运行7次。此外,我觉得它也不能正常工作(我仍然会得到奇怪的反应 - 范围最终会出现在错误的工作表中)。
第二个问题,有没有办法找出一个范围,哪个表“附加”到该范围。类似于:msgbox rowTwoHeadingKiloRange.worksheets.name
会产生Sunday
答案 0 :(得分:3)
你很亲密。要将Range
和Cell
附加到With
语句,您需要在关键字前使用句号.
。像这样:
Public Function colmHeadingsAndSpacing(sheetName)
With ThisWorkbook.Worksheets(sheetName)
...
Set rowTwoHeadingKiloRange = .Range(.Cells(2, 4), .Cells(2, 8))
Set rowTwoHeadingUnitRange = .Range(.Cells(2, 10), .Cells(2, 14))
...
End with
End Function
这是一个很好的做法,可以使用它附带的工作表来限定每个范围参考。我更进一步包括工作簿参考(ThisWorkbook
)。现在它完全合格了。
对于第二个问题 - 尝试MsgBox rowTwoHeadingKiloRange.Parent.Name
获取工作表的名称。通常最好从工作表名称开始,而不是回过头来工作。
答案 1 :(得分:0)
范围是工作表上(大部分为矩形)区域的参考。因此,引用未定义Set r = Range ("B2:F10")
这样的工作表的范围与Set r = Activeworkbook.Activesheet.Range ("B2:F10")
完全相同。因此,为了更专业的目的,VBA以下列方式为您提供灵活性:
Dim wb As Workbook
Dim ws As Worksheet
Set wb = Workbooks.Add ' open new xlsx file
Set ws = Activesheet OR
Set ws = wb.Activesheet OR
Set ws = wb.Sheets(1)
' do something else here and later when neither wb nor ws is active, you can
Set r = wb.ws.Range("B5:G22") OR
Set r = ws.Range("B5:G22")
附加:为了生成大量相同格式的图纸,您可以考虑使用模板。然后,您需要以编程方式仅填写差异。编程更少,维护更容易:)