2016-07-29 70 views
0

我需要从列N2和M2中获取值,使用自动筛选器后,赋值只给出了整个工作表中不存在于自动筛选器范围内的值。excel vba将单元格值赋给变量来自自动筛选器结果

Sub mainSub() 
Dim fRngb as Range 

For Each key In fCatId.Keys 
With wshcore 
    llastrow = wshcore.Range("A" & Rows.Count).End(xlUp).Row 
    .AutoFilterMode = False 
    .Range("A1:N" & llastrow).AutoFilter 
    .Range("A1:N" & llastrow).AutoFilter Field:=1, Criteria1:=fCatId(key) 
    min = WorksheetFunction.Subtotal(5, Range("H:H")) 
    max = WorksheetFunction.Subtotal(4, Range("H:H")) 

    'This does not work. it gives the first 13,2 value not the filtered one. 
    Set fRngb = wshcore.AutoFilter.Range.SpecialCells(xlCellTypeVisible) 
    'MsgBox fRngb.Cells(13, 2) 
    'I've also tried this: 
    'Range("K2:K2").CurrentRegion.Value(2) 

    Debug.Print fRngb.Cells(13, 2) & " - " & Range("K2:K2").CurrentRegion.Value(2) 
End With 
Next key 
End Sub 

有什么建议吗?

+0

的过滤器后,你可以复制列范围(例如'.Range(“N2:M”&llastrow).Copy'并将其粘贴到某处。这将复制可见单元格。 – Slai

回答

0

编辑 OP的澄清后:

  • 使用.Areas()财产Range对象返回其是由

  • 得到它的第一个“区域”索引1所有连续范围的集合:.Areas(1)

  • 将其第一个单元格调整为一行:.Areas(1).Resize(1)

这里如下全码:

Sub mainSub() 
    Dim fRngb As range 

    With wshcore 
     With .range("A1:N" & .Cells(.Rows.Count, 1).End(xlUp).Row) 
      For Each Key In fCatId.Keys 
       .AutoFilter field:=1, Criteria1:=fCatId(Key) 
       Min = WorksheetFunction.Subtotal(5, .Columns("H")) 
       Max = WorksheetFunction.Subtotal(4, .Columns("H")) 
       Set fRngb = .Columns("N").Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) '<--| get all column "N" (relative to considered range) filtered values excluded header row 
       MsgBox fRngb.Areas(1).Resize(1).Address '<--| get its first cell 
       .AutoFilter 
      Next Key 
     End With 
    End With 
End Sub 

我猜fCatId是Dictionary类型的一些Public变量...否则,您必须将其传递给mainSub作为参数

+0

最小和最大值是在过滤范围内获取该列中的最小/最大值。 fcatId是一个字典,我必须控制其他信息。我测试了它给出了一个“运行时错误5”的代码。无效的过程调用或参数在这里:“With .Range(”A1:N“&.Cells(”A“&.Rows.Count).End(xlUp)。 Row)“ – sys73r

+0

是的,它必须是”With .Cells(.Rows.Count,1).End(xlUp).Row“。请参阅编辑的代码 – user3598756

+0

我认为我们已经差不多了,它现在返回标题名称,如何获取它返回数据中的第一行(过滤器中的第二行)?谢谢。顺便说一句我使用Msgbox fRngb.Value,因为我需要单元格中的值是一个字符串。我尝试过使用fRngb.Address(RowAbsolute:= False),但它给我的范围不是数值。 – sys73r