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

时间:2018-01-03 12:58:44

标签: excel vba excel-vba

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

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

我有以下范围,例如:

...
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

的结果

2 个答案:

答案 0 :(得分: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获取工作表的名称。通常最好从工作表名称开始,而不是回过头来工作。

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

附加:为了生成大量相同格式的图纸,您可以考虑使用模板。然后,您需要以编程方式仅填写差异。编程更少,维护更容易:)