2017-02-26 2 views
1

Ich bin ziemlich neu in VBA und ich habe gekämpft mit der Erstellung eines einfachen Berichts für viele Tage, so entschied ich mich für einige Hilfe zu erkundigen. Ich werde wirklich dankbar sein für alle Tipps, die Sie haben oder auf Fehler hinweisen könnte, die ich in meinem Code gemacht habe.Zählen Sie die Anzahl der Zellen in einer gefundenen Spalte mit VBA

Ich habe das folgende Stück Code (aus meiner Schleife extrahiert). Was ich tun möchte, ist, eine Liste zu erstellen, basierend auf rund 20 Excel-Dateien, die unter Statistiken haben:

  1. Namen der aktuellen Registerkarte in der Arbeitsmappe
  2. Anzahl der Nicht leere in einer Spalte die Namen enthält Wort " Difference“
  3. Zählung von der gleichen Spalte (immer in Zeile 7, sondern kann in verschiedenen Spalten), aber wo Zellen nicht leer und sind anders als 0.

Für den letzten stat habe ich nicht einmal starten, so Sie werden es nicht in meinem Code sehen, aber ich würde mich freuen, wenn Sie auch für diesen einen Tipp haben (wh ich Methode am besten zu verwenden).

Windows("PassRate.xlsm").Activate 
b = ActiveSheet.Cells(Rows.count, 2).End(xlUp).Row + 1 
Cells(b, 3) = xlWorkBook.Worksheets(i).Name 
xlWorkBook.Worksheets(i).Activate 
Set Myrng = Range("B7:M9999").Find(What:="Difference", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False) 
If Not Myrng Is Nothing Then 
RowQnt = xlWorkBook.Worksheets(i).Myrng.Offset(9999, 2).Cells.SpecialCells(xlCellTypeConstants).count 
End If 
Windows("PassRate.xlsm").Activate 
Cells(b, 4) = RowQnt 

Mein Problem ist, dass das Makro ausgeführt wird und funktioniert, aber das Ergebnis, das ich bekommen, ist die Liste der Registerkarte Namen, aber alle zählt, sind 0, und ich kann nicht dieses Problem überwinden. Für die Zeilennummer 7 habe ich auch den Code unten ausprobiert, der das gleiche Ergebnis liefert.

RowQnt = xlWorkBook.Cells(Rows.count, Myrng).End(xlUp) 

Ist es möglich, dass mein Problem auf die Tatsache zurückzuführen ist, dass in den Quelldateien der Spalte Wort „Difference“ enthält, ist manchmal zwei Spalten zusammengefügt? Leider kann ich das nicht ändern, da dies einige automatisch generierte Dateien eines anderen Programms sind.

+0

zurück, was 'xlWorkbook'? – user3598756

Antwort

0

xlWorkBook.Worksheets(i).Myrng ist keine gültige Range Syntax, während Sie einfach MyRng verwenden können, die Sie bereits mit einem nicht null Range Bezug gesetzt und hat bereits beide Eltern worksheet und workbook Referenzen innen es

aber auch Myrng.Offset(9999, 2).Cells wouldn‘ t tun, da es eine Zelle nur referenziert und nicht eine Reihe von Zellen

Sie brauchen eine Range(Range1, Range2) Syntax, wobei beide Range1 und Range2 gültig sind Range r eferenzen an die erste und die letzte Zelle des Bereichs wollen Sie eigentlich nicht leere Zellen von

außerdem könnten Sie WorksheetFunction.CountA() Funktion anstelle von SpecialCells(xlCellTypeConstants) Bereich verwenden zählen, da diese letztere Fehler, wenn keine konstant Zellen im Bereich gefunden werden es angewendet wird (so dass Sie einen Scheck benötigen würde), während der ehemalige einfach Null zurück, wenn keine nicht leeren Zellen

für alle zu finden sind, was oben Sie folgende GetRowQnt() Funktion schreiben konnte:

Function GetRowQnt(sht As Worksheet) As Long 
    Dim Myrng As Range 

    With sht '<--| reference passed worksheet 
     Set Myrng = .Rows(7).Find(What:="Difference", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False) '<--| find "Difference" in its 7th row 
     If Not Myrng Is Nothing Then GetRowQnt = WorksheetFunction.CountA(.Range(.Cells(8, Myrng.Column), .Cells(WorksheetFunction.Max(.Cells(.Rows.count, Myrng.Column).End(xlUp).row, 8), Myrng.Column))) '<--| count not blank cells in column where "Difference" was found from row 8 down to its last not empty cell 
    End With 
End Function 

und verwenden Sie es in Ihrem Haupt-Code wie folgt:

With Windows("PassRate.xlsm").ActiveSheet '<--| reference "PassRate.xlsm" workbook active sheet (or change 'ActiveSheet' with 'Worksheetes("yourSheetName")') 
    For i = 1 To xlWorkbook.Worksheets.count '<--| loop through 'xlWorkbook' workbook worksheets 
     b = .Cells(.Rows.count, 3).End(xlUp).row + 1 '<--| get "PassRate.xlsm" workbook active sheet current first empty cell in column "C" 
     .Cells(b, 3) = xlWorkbook.Worksheets(i).Name 
     .Cells(b, 4) = GetRowQnt(xlWorkbook.Worksheets(i)) 
    Next 
End With 

bitte beachten, dass mit

b = .Cells(.Rows.count, 3).End(xlUp).row + 1 

I Spalte „C“ nahm als führendes eines zu bekommen dauert nicht leere Zeile aus, da es keine Code in Ihrem Beitrag, der etwas in Spalte "B" geschrieben hat.

Aber wenn Ihr richtiger Code

einige

.Cells(b, 2) = somedata '<--| write something in column "B" current row 
hat, dann können Sie auf b = .Cells(.Rows.count, 2).End(xlUp).row + 1

+0

@Maja, bist du durchgekommen? – user3598756

Verwandte Themen