2015-10-23 52 views
0

我有以下列表:VBA:過濾列表,並存儲結果作爲命名範圍

enter image description here

我想打一個VBA代碼過濾上存儲他們的工作不同的名稱,並存儲導致一個帶有商店名稱的命名範圍 - 範圍是在該商店中工作的列表中的名稱。

例如,命名的範圍是倫敦 - 包含單元格B2和B7,依此類推。

編輯

我知道這是錯的,但我解決不了這個。 VBA並不是我想要的那一刻......我首先創建了一個新的命名範圍列,然後繼續。

enter image description here

Sub NamedRange() 

Dim arr() As Variant 

arr = Sheet1.Range("D2:D4").Value 

    Dim i As Integer 
    Dim j As Integer 
    Dim Name As String 
    Dim k1 As Range, k2 As Range 

    Lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row 

    i = 0 

    Do While i < 4 
    Name = arr(i) 
    For j = 1 To Lastrow 
    k1 = Match(arr(i), Cells(i, 1).Value, 0) 
    k2 = Union(k1, k2) 

    Next j 

    Range(k2).Select 
    Application.Goto Reference:=arr(i) 

    Loop 


End Sub 

EDIT2:花了兩個小時試圖瞭解AdvancedFilter功能。使用x1FilterCopy選項使它工作,但是我的整個Excel表格將會這樣混亂。有沒有什麼方法可以將過濾後的範圍過濾並存儲在一個變量中。上帝,VBA,你爲什麼這樣做?

+0

你嘗試過什麼? –

+0

@Scott Craner:當然可以。但我真的不知道如何攻擊這個。我想我需要弄清楚如何將每個部門存儲在某個數組中(我不太確定),然後爲數組中的每個對象創建一個for循環,以便以某種方式從第一列中過濾所需的單元格並存儲我在一個命名的範圍內過濾。我對這個VBA完全陌生,不能直截了當地思考。 – Erosennin

+0

這正是如何做到這一點。因此,請分別將每個部分分別谷歌,嘗試將它們放在一起然後在遇到特定問題時回到代碼中。注意:命名範圍將一直運行,直到有人對數據進行排序,那麼您將需要重做範圍名稱。所以您還需要搜索工作表更改事件。 –

回答

1

試試這個。

請注意,如上所述,以這種方式使用命名範圍可能不是最好的方法。

解釋您的最終目標可能會更好(因爲您可以過濾數據並從那裏操作)。

這就是說,這就是你要找的。

對於B2:B10中的每個單元格,我們將查看是否存在該值的命名範圍。

如果命名範圍不存在,我們創建一個。

如果確實存在,我們結合這兩個範圍。

然後,我們可以點擊我們的部門並通過獲取他們的價值來選擇範圍。

複製並粘貼此宏和運行NameTheRanges

然後,您可以事件的代碼添加到片一個選擇的範圍,當你點擊的部門。

Sub NameTheRanges() 

ClearAllNamedRanges 
Dim c As Range 
For Each c In Range("B2:B10") 
    If Not DoesNamedRangeExist(c.Value) Then 
     c.Offset(0, -1).Name = c.Value 
    Else 
     Union(Range(c.Value), c.Offset(0, -1)).Name = c.Value 
    End If 
Next c 

End Sub 

Function DoesNamedRangeExist(NR As String) As Boolean 
Dim checker As Range 
On Error Resume Next 
Set checker = Range(NR) 
On Error GoTo 0 
If checker Is Nothing Then 
    DoesNamedRangeExist = False 
Else 
    DoesNamedRangeExist = True 
End If 
End Function 

Sub ClearAllNamedRanges() 
Dim NR 
For Each NR In ActiveWorkbook.Names 
    NR.Delete 
Next 
End Sub 

事件代碼,選擇範圍(這正好在紙張使用的是 - 工作表Sheet1在我的情況):

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

If Target.CountLarge > 1 Then Exit Sub 
If Not Intersect(Target, Range("E2:E4")) Is Nothing Then Range(Target.Value).Select 

End Sub 

結果當我點擊利物浦(細胞E3)。

Click Liverpool

名稱管理器結果:

Name Manager Results

+0

非常感謝你的答案!我會盡力理解你寫的東西。 – Erosennin

+0

沒問題:)如果你有多個工作表,你可能需要指定表名(而不是使用'Range(「B2:B10」)''你想使用'Sheets(「Sheet1」)。Range(「B2 :B10「)'或者其他的東西 – user1274820

+0

謝謝!我在* c.Offset(0,-1).Name = c.Value *行遇到了一些問題。我的示例文檔(利物浦,倫敦等)運行良好,但是當移動到真實數據時,這個錯誤會阻止所有的東西。任何想法? – Erosennin