更新:只需要学习如何制作动态的动态
大图: 我试图根据列中的数据自动创建命名范围。
我发布的子过程采用数组元素作为参数。所有这些逻辑工作正常。我可以为数组的每个元素创建命名范围。
我想出了如何在我的范围内获得我想要的值的逻辑。
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
答案 0 :(得分:1)
你和所有人都有错误,因为你以错误的方式分配范围对象。
这条线不好
Set temprng = Range(thiscell, nextcell)
thiscell
和nextcell
已经是范围。您应该使用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