动态命名范围的输出不准确

时间:2018-03-10 10:10:21

标签: vba excel-vba named-ranges excel

我使用完全相同的代码命名两个工作簿中的动态范围。在将代码实现到Workbook 111中的通用代码主体之前,我使用Workbook TestBook1来测试代码。

代码是:

    Dim HDaER As Worksheet
    Dim HDaERReturnLR As Long
    Dim HDaERReturnLC As Long
    Dim HDaERReturnsDNR As Range
    Dim HDaERReturns As String

    Set HDaER = Sheets("HistoricalDataandExcessReturns")

        With HDaER.Cells(108, 2).CurrentRegion
            HDaERReturnLR = .Find(What:="*", After:=HDaER.Cells(107, 1), _
            LookIn:=xlFormulas, LookAt:=xlPart, _
            SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row

            HDaERReturnLC = .Find(What:="*", After:=HDaER.Cells(107, 1), _
            LookIn:=xlFormulas, LookAt:=xlPart, _
            SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    Set HDaERReturnsDNR = HDaER.Range(HDaER.Cells(108, 2), _
            HDaER.Cells(HDaERReturnLR, HDaERReturnLC))
        End With

        HDaER.Names.Add Name:="HDaERReturns", RefersTo:=HDaERReturnsDNR

        Range("HDaERReturns").Select

我在TestBook1中获得的输出是准确的: OUTPUT WORKBOOK TESTBOOK1

我在工作簿111中获得的输出是INACCURATE: OUTPUT WORKBOOK 111

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您的整个代码可能会崩溃到以下

With Sheets("HistoricalDataandExcessReturns").Cells(107, 1)
    With .Parent.Range(.End(xlDown), .End(xlToRight))
        .Parent.Names.Add name:="HDaERReturns", RefersTo:=.Resize(.Rows.Count - 1, .Columns.Count - 1).Offset(1, 1)
    End With

    .Range("HDaERReturns").Select
End With

答案 1 :(得分:0)

规范After:=HDaER.Cells(...)显示为起点......在这种情况下,我使用了After:=HDaER.Cells(107, 1),但我在HDaER.Cells(105, 1)中有标题“Volatility”,这意味着为行With HDaER.Cells(108, 2).CurrentRegion指定范围的起始单元格并包含方向SearchDirection:=xlPrevious的另一个规范会导致将HDaER.Range(HDaER.Cells(108, 2), HDaER.Cells(105, 1))标记为要命名的动态范围。

具有准确输出的代码是:

Dim HDaER As Worksheet
Dim HDaERReturnLR As Long
Dim HDaERReturnLC As Long
Dim HDaERReturnsDNR As Range
Dim HDaERReturns As String

Set HDaER = Sheets("HistoricalDataandExcessReturns")

With HDaER.Cells(108, 2).CurrentRegion
            HDaERReturnLR = .Find(What:="*", After:=HDaER.Cells(105, 1), _
            LookIn:=xlFormulas, LookAt:=xlPart, _
            SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row

            HDaERReturnLC = .Find(What:="*", After:=HDaER.Cells(105, 1), _
            LookIn:=xlFormulas, LookAt:=xlPart, _
            SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    Set HDaERReturnsDNR = HDaER.Range(HDaER.Cells(108, 2), _
            HDaER.Cells(HDaERReturnLR, HDaERReturnLC))
        End With

        HDaER.Names.Add Name:="HDaERReturns", RefersTo:=HDaERReturnsDNR

        Range("HDaERReturns").Select

引用HDaER.Cell(105, 1)作为规范After:=HDaER.Cells(105, 1)的起点,可以选择准确的.Range

enter image description here

回答@ DisplayName的评论和答案:

好主意,输出不好......

MsgBox Last Row显示以下结果:

MsgBox LR

MsgBox最后一列显示以下结果:

MsgBox LC

代码输出(正如我之前所回答的):

OUTPUT

确切的代码输入:

Input code