2013-11-21 15 views
5

Mam duży arkusz. Muszę ustawić wiele filtrów w tym arkuszu na nagłówki kolumn w pozycjach dynamicznych. Po ustawieniu filtrów muszę znaleźć konkretną kolumnę w arkuszu mającą nagłówek kolumny "Nov", a następnie uzyskać sumę wartości w tej kolumnie i zaimportować tę konkretną wartość sumy do innego arkusza. Napisałem kod aż do części, w której mogę ustawić filtry do wielu kolumn, ale trudno mi znaleźć nagłówek kolumny i dodać tę kolumnę. Poniżej znajduje się kod, który napisałem do tej pory.VBA - Znajdź kolumnę z określonym nagłówkiem i znajdź sumę wszystkich wierszy w tej kolumnie

Sub Button2_Click() 
Dim colName As Long 
Dim colName1 As Long 
Dim colName2 As Long 
Dim r As Long 

SearchV = Range("A8:DD8").Find(What:="Nov", LookIn:=xlValues, LookAt:=xlWhole, _ 
MatchCase:=False, SearchFormat:=False).Column 

lastrow = Cells(Rows.Count, SearchV).End(xlUp).Row 

colName = Range("A8:DD8").Find(What:="Teams", LookIn:=xlValues, LookAt:=xlWhole, _ 
MatchCase:=False, SearchFormat:=False).Column 

colName1 = Range("A8:DD8").Find(What:="Items", LookIn:=xlValues, LookAt:=xlWhole, _ 
MatchCase:=False, SearchFormat:=False).Column 

colName2 = Range("A8:DD8").Find(What:="Domain", LookIn:=xlValues, LookAt:=xlWhole, _ 
MatchCase:=False, SearchFormat:=False).Column 

ActiveSheet.Range("$A$8:$DD$9999").AutoFilter Field:=colName, Criteria1:="ST Test",  Operator:=xlOr, Criteria2:="" 
ActiveSheet.Range("$A$8:$DD$9999").AutoFilter Field:=colName1, Criteria1:="Variance", Operator:=xlOr, Criteria2:="(Blanks)" 
ActiveSheet.Range("$A$8:$DD$9999").AutoFilter Field:=colName2, Criteria1:="9S", Operator:=xlOr, Criteria2:="(Blanks)" 

Nagłówki kolumn zawsze zaczynają się od ósmego rzędu. Niektóre nieosiągalne informacje są obecne w wierszach powyżej. Tak więc chcę, aby kolumna "Nov" znajdowała się w rzędzie H. Suma powinna być obliczona od H9 do końca ostatniego wiersza. Użyłem tej formuły, gdy kolumna znajdowała się w kolumnie "H".

Cells(lastrow + 1, colName3).Formula = "=SUBTOTAL(9,H9:H" & lastrow & ")" 

Ale kolumna „listopad” nie zawsze będzie obecny w wierszu „H”, więc nie jestem w stanie dowiedzieć się, jak zmienić swój kod, aby wybrać kolumnę dynamicznie.

Odpowiedz

7

Upewnij się, że w pełni kwalifikujesz swoje obiekty, a także sprawdzisz, czy .Find coś zwróci, czy nie. Oto przykład.

Powiedzmy arkuszu wygląda następująco

enter image description here

Teraz spróbuj tego kodu

Option Explicit 

Sub Sample() 
    Dim ws As Worksheet 
    Dim aCell As Range, Rng As Range 
    Dim col As Long, lRow As Long 
    Dim colName As String 

    '~~> Change this to the relevant sheet 
    Set ws = ThisWorkbook.Sheets("Sheet1") 

    With ws 
     Set aCell = .Range("A8:DD8").Find(What:="Nov", LookIn:=xlValues, LookAt:=xlWhole, _ 
        MatchCase:=False, SearchFormat:=False) 

     '~~> If Found 
     If Not aCell Is Nothing Then 
      col = aCell.Column 
      colName = Split(.Cells(, col).Address, "$")(1) 

      lRow = .Range(colName & .Rows.Count).End(xlUp).Row 

      '~~> This is your range 
      Set Rng = .Range(colName & "8:" & colName & lRow) 

      Debug.Print Rng.Address 
     '~~> If not found 
     Else 
      MsgBox "Nov Not Found" 
     End If 
    End With 
End Sub 

wyjścia

enter image description here

+0

Dzięki wielkie za pomoc Siddh arth. Zrobiłem z tego większość mojej pracy. Ale rzeczywisty problem polega na dodaniu sumy wierszy. Używam tego kodu już teraz. 'SumV = SV i "9"' 'SumW = SV i lRow' ' Komórki (lRow + 1, SV) .Formula = "= SUBTOTAL (9, SumV: SumW)" ' Ale to zwraca następującą wartość w programie Excel "= SUBTOTAL (9, SumV: SumW)" I otrzymuję #NAME? błąd. –

+0

Umm, co to jest "SV"? –

+0

Przepraszam, nie byłam jasna. Cokolwiek wspomniałeś jako colName w twoim kodzie, zmieniłem nazwę na SV, ponieważ już używałem zmiennej colName gdzie indziej. Zasadniczo, co próbuję zrobić, to połączyć kolumnę i wiersz, aby uzyskać pewną wartość (np. W9). Więc mam wartość W9 dla SumV i W2128 dla SumW. Ale gdy użyję funkcji sumy częściowej, ta sama zostanie wstawiona zamiast rzeczywistej wartości. Próbowałem również ich używać. '= SUBTOTAL (9," i SumV & ":" & SumW & ")'. Ale nawet to rzuca wyjątek. –

Powiązane problemy