Excel 在范围变量中存储动态范围
我试图从动态F列中获取唯一值并将其存储在数组中。将选择变量设置为动态范围时,我的代码出现“Object Required”错误。请帮助Excel 在范围变量中存储动态范围,excel,vba,Excel,Vba,我试图从动态F列中获取唯一值并将其存储在数组中。将选择变量设置为动态范围时,我的代码出现“Object Required”错误。请帮助 Sub UniqueFilter() Dim tmp As String Dim arr() As String Dim Selection As Range Dim lrow As Long Dim str As String Dim cell As Range Dim sht As Worksheet Set sht = ThisWorkbook.Work
Sub UniqueFilter()
Dim tmp As String
Dim arr() As String
Dim Selection As Range
Dim lrow As Long
Dim str As String
Dim cell As Range
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets("14Feb19")
sht.Activate
'Set Selection = sht.Range(sht.Cells(1, 6), sht.Cells(Rows.Count, 6).End (xlUp)).Select
lrow = shData.Range("F" & Rows.Count).End(xlUp).Row
Set Selection = sht.Range("F2:F" & lrow).Select
If Not Selection Is Nothing Then
For Each cell In Selection
If (cell <> "") And (InStr(tmp, cell) = 0) Then
tmp = tmp & cell & "|"
End If
Next cell
End If
If Len(tmp) > 0 Then tmp = Left(tmp, Len(tmp) - 1)
arr = Split(tmp, "|")
End Sub
Sub-UniqueFilter()
将tmp设置为字符串
Dim arr()作为字符串
变暗选择作为范围
暗淡的光线和长的一样
作为字符串的Dim str
暗淡单元格作为范围
将sht变暗为工作表
Set sht=此工作簿。工作表(“19年2月14日”)
短促激活
'Set Selection=sht.Range(sht.Cells(1,6),sht.Cells(Rows.Count,6).End(xlUp))。选择
lrow=shData.Range(“F”和Rows.Count).End(xlUp).Row
设置选择=短程范围(“F2:F”&lrow)。选择
如果不是的话,选择什么都不是
对于选择中的每个单元格
如果(单元格“”)和(仪表(tmp,单元格)=0),则
tmp=tmp&单元&“|”
如果结束
下一个细胞
如果结束
如果Len(tmp)>0,则tmp=Left(tmp,Len(tmp)-1)
arr=拆分(tmp,“|”)的
端接头
您可以实现您的目标,而无需使用选择。
只需复制范围内容并将其转换为数组:
Sub UniqueFilter()
Dim arr() As String
Dim tmp As Variant
Dim lrow As Long
Dim sht As Worksheet
Dim index As Integer
Dim count As Integer
Set sht = ThisWorkbook.Worksheets("14Feb19")
sht.Activate
lrow = sht.Range("F" & Rows.count).End(xlUp).Row
'Copying and trasposing selected Range
tmp = Application.Transpose(sht.Range("F2:F" & lrow).Value)
'Cleaning from temp array all empty values
count = 1
For index = 1 To UBound(tmp, 1) - LBound(tmp, 1) + 1
ReDim Preserve arr(1 To count)
If tmp(index) <> "" Then
arr(count) = tmp(index)
count = count + 1
End If
Next
End Sub
Sub-UniqueFilter()
Dim arr()作为字符串
Dim tmp作为变体
暗淡的光线和长的一样
将sht变暗为工作表
将索引设置为整数
将计数设置为整数
Set sht=此工作簿。工作表(“19年2月14日”)
短促激活
lrow=sht.Range(“F”和Rows.count).End(xlUp).Row
'复制和传送所选范围
tmp=应用程序转置(短范围(“F2:F”和lrow).Value)
'从临时数组中清除所有空值
计数=1
对于索引=1到UBound(tmp,1)-LBound(tmp,1)+1
重拨保留arr(1到计数)
如果tmp(索引)“,则
arr(计数)=tmp(索引)
计数=计数+1
如果结束
下一个
端接头
(特别感谢帮助简化代码的Nathan_Sav)您无需使用选择即可实现目标。 只需复制范围内容并将其转换为数组:
Sub UniqueFilter()
Dim arr() As String
Dim tmp As Variant
Dim lrow As Long
Dim sht As Worksheet
Dim index As Integer
Dim count As Integer
Set sht = ThisWorkbook.Worksheets("14Feb19")
sht.Activate
lrow = sht.Range("F" & Rows.count).End(xlUp).Row
'Copying and trasposing selected Range
tmp = Application.Transpose(sht.Range("F2:F" & lrow).Value)
'Cleaning from temp array all empty values
count = 1
For index = 1 To UBound(tmp, 1) - LBound(tmp, 1) + 1
ReDim Preserve arr(1 To count)
If tmp(index) <> "" Then
arr(count) = tmp(index)
count = count + 1
End If
Next
End Sub
Sub-UniqueFilter()
Dim arr()作为字符串
Dim tmp作为变体
暗淡的光线和长的一样
将sht变暗为工作表
将索引设置为整数
将计数设置为整数
Set sht=此工作簿。工作表(“19年2月14日”)
短促激活
lrow=sht.Range(“F”和Rows.count).End(xlUp).Row
'复制和传送所选范围
tmp=应用程序转置(短范围(“F2:F”和lrow).Value)
'从临时数组中清除所有空值
计数=1
对于索引=1到UBound(tmp,1)-LBound(tmp,1)+1
重拨保留arr(1到计数)
如果tmp(索引)“,则
arr(计数)=tmp(索引)
计数=计数+1
如果结束
下一个
端接头
(特别感谢帮助简化代码的Nathan_Sav)哪些行错误?以及什么是
shData
您可以只说arr=application.transpose(range)
或使用脚本编写.dictionary
并检查它的.exists
属性以删除重复项等。只需设置Selection=sht.range(“F2:F“&lrow)
我想这对我们中最好的人来说是可以做到的!通常避免选择或激活对象是明智之举,而且似乎这个错误是这种行为的残余。此外,这也是尝试避免保留字的一个很好的例子。您使用了一个变量选择
并重新编码了选择
,这将导致在你的范围之后。在VBA的选择中选择,
好的做法是在变量前面缩写数据类型,所以rngSelection
和rngCell
等等。哪一行错误?什么是shData
你可以说arr=application.transpose(范围)
或使用脚本。字典
并检查它的。是否存在
属性以删除重复等。只需设置选择=sht.Range(“F2:F”&lrow)
我想这对我们中最好的人来说是可以做到的!通常避免选择或激活对象是明智之举,而且似乎这个错误是这种行为的残余。此外,这也是尝试避免保留字的一个很好的例子。您使用了一个变量选择
并重新编码了选择
,这将导致在您的范围之后。在VBA的选择中选择,
良好做法是缩写变量前面的数据类型,因此rngSelection
和rngCell
等。这可以像arr=application.transpose(tmp)一样完成
?我试过了,但是你会得到一个13,类型不匹配的错误,因为函数希望使用矩阵而不是数组。Dim arr()作为变量:arr=Application.Transpose(sht.Range(“F2:F”&lrow.Value))
?是的,只要稍加修改就可以了!我正在更新代码。谢谢!您好,它可以工作,但它也需要空白单元格。我只需要F列中有值的单元格。这可以像arr=application.transpose(tmp)一样完成
?我试过了,但是你会得到一个13,类型不匹配的错误,因为函数希望使用矩阵而不是数组。Dim arr()作为变量:arr=Application.Transpose(sht.Range(“F2:F”&lrow.Value))
?是的,只要稍加修改就可以了!我正在更新代码。谢谢!您好,它可以工作,但它也需要空白单元格。我只需要F列中有值的单元格。