excel vba:创建一个范围而不引用工作表

问题描述 投票:0回答:2

我想知道我是否可以保存通用范围,而不附加工作表名称?

让我们说我的程序为一周中的每一天创建一个工作表,然后为每个工作表制作标题。我想给它一些范围,它必须合并并在每张表中添加不同的标题到这些范围。所以每张纸的标题看起来都一样。

我有以下范围,例如:

...
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的结果

excel vba excel-vba
2个回答
3
投票

你很亲密要将RangeCell附加到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获取工作表的名称。通常最好从工作表名称开始,而不是回过头来工作。


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")

另外一点:为了生成大量相同格式的工作表,您可以考虑使用模板。然后,您需要以编程方式仅填写差异。编程少,维护方便:)

© www.soinside.com 2019 - 2024. All rights reserved.