Excel 在范围变量中存储动态范围

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

我试图从动态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.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列中有值的单元格。