VBA范围问题 - 设置和动态

时间:2017-12-01 18:37:36

标签: excel vba excel-vba object range

更新:只需要学习如何制作动态的动态

大图: 我试图根据列中的数据自动创建命名范围。

我发布的子过程采用数组元素作为参数。所有这些逻辑工作正常。我可以为数组的每个元素创建命名范围。

我想出了如何在我的范围内获得我想要的值的逻辑。

for rownum = 2 to finalrow 下一行

包含这个逻辑。

问题是我的范围有问题。

如果我不使用Set my ranges = Range(cells),那么我会得到一个对象错误..这是有道理的,该对象已被声明但未设置为任何内容。

我只是不知道如何初始化这些范围,然后将它们更改为我想要的单元格组

fullrng也需要动态将是2个单元格高,然后是3个单元格,然后是4个单元格等。

Sub Createranges(ByVal TableName As String)

 If TableName <> "" Then

    Debug.Print TableName
    Dim fullrng As Range
    Dim temprng As Range
    Dim thiscell As Range
    Dim nextcell As Range

    Set fullrng = Range("H1")

    fullrng.Name = TableName

        For rownum = 2 To finalrow

            'Checking to see if cell should be in named range
            If Cells(rownum, ColumnVar).Value = TableName Then

                'Modify Ranges for union
                Set thiscell = Range(ColumnVar & Cells.Row, ColumnVar & Cells.Column)
                Set nextcell = Range(ColumnVar & Cells.Row + 1, ColumnVar & Cells.Column)

                'union the range to include all past matching values
                If thiscell.Value2 = nextcell.Value2(2, 1) Then
                    Set temprng = Range(thiscell, nextcell)
                    'Figure out dynamic ranges here
                    Set fullrng = Range(
                    fullrng = Union(fullrng, temprng)
                End If

            End If

        Next rownum
    End If


End Sub

2 个答案:

答案 0 :(得分:1)

你和所有人都有错误,因为你以错误的方式分配范围对象。

这条线不好

Set temprng = Range(thiscell, nextcell)

thiscellnextcell已经是范围。您应该使用Union来组合它们:

set temrange=application.union(thiscell, nextcell)

改变这一部分的方式相同:

 set fullrange=application.union(fullrng,temprange)

作为改进,您必须始终确保在取消Union之前确定要合并的两个范围(is not nothing

例如,第一次执行上面的行时,fullrange可能没有任何会引发错误的内容,以避免这样做:

if not fullrange is nothing then
    set fullrange=application.union(fullrng,temprange)
else
    set fullrange=temprange
end if

答案 1 :(得分:0)

原来有很多问题!

我想这就是当你不创建自己的对象时得到的东西,你必须探索并找出对象模型。

除了一些明显错误的东西 - 使用Cells.Column而不是我的ColumnVar&amp; rownum变量,这是我改变的:

我最初将我的范围设置为随机单元格,以便我可以命名我的范围。 fullrng.Name = TableName我设置fullrng之后我刚刚将这一行移到了右边。

Sub Createranges(ByVal TableName As String)

If TableName <> "" Then

Debug.Print TableName
Dim fullrng As Range
Dim temprng As Range
Dim thiscell As Range
Dim nextcell As Range


    For rownum = 2 To finalrow

        'Checking to see if cell should be in named range
        If Cells(rownum, ColumnVar).Value = TableName Then

            'Modify Ranges for union
            Set thiscell = Range(ColumnVar & rownum, ColumnVar & rownum)
            Set nextcell = Range(ColumnVar & rownum + 1, ColumnVar & rownum + 1)

            'union the range to include all past matching values
            If thiscell.Text = nextcell.Text Then
                Set temprng = Application.Union(thiscell, nextcell)
                If Not fullrng Is Nothing Then
                    Set fullrng = Application.Union(fullrng, temprng)
                    fullrng.Name = TableName
                Else
                    Set fullrng = temprng
                End If

            End If

        End If

    Next rownum
End If


End Sub