2016-10-07 3 views
0

Ich habe eine VBA-Anwendung, die alle HTML-Tabellen von einer Website herunterlädt und sie in ein Arbeitsblatt analysiert. Dann habe ich Code geschrieben, der eine Zeichenfolge in der Kopfzeile jeder Tabelle in Spalte A findet, diese Zelle aktiviert, den Bereich der aktuellen Region identifiziert und dem Namen des Tabellenblatt-Managers einen Listenobjektnamen hinzufügt. Das Problem, das ich habe, ist mit der Codezeile 260, wo das Nachrichtenfeld die Anzahl der Zeilen in der Tabelle anzeigt. Die Nummer ist immer gleich, auch wenn die Tabellen eine andere Anzahl von Zeilen haben. Ich glaube, das Problem liegt in den Codezeilen 210 bis 250. Ich habe das ganze Web einschließlich des Stack-Überlaufs durchsucht und finde keine Lösung.Range.Areas gibt falsche Anzahl von Zeilen zurück

Kann jemand sehen, warum die Zahl, die im Nachrichtenfeld angezeigt wird, nicht die Anzahl der Zeilen in der Tabelle widerspiegelt?

'--------------------------------------------------------------------------------------- 
' Method : test_currentregion_IncludeHeaders 
' Author : Richard 
' Date : 10/4/2016 
' Purpose: Find cell with value and turn into named table with headers 
'--------------------------------------------------------------------------------------- 
Sub test_currentregion_IncludeHeaders() 

10  On Error GoTo test_currentregion_IncludeHeaders_Error 

      'convert all tables (listobjects) to ranges 
      Dim WS As Worksheet, LO As ListObject 
20  For Each WS In Worksheets 
30   For Each LO In WS.ListObjects 
40    LO.Unlist 
50   Next 
60  Next 

      'find currentregions and add table 
      Dim tbl As Object 
      Dim c As Object 
      Dim firstAddress As Variant 
      Dim Hdr As String 
      Dim rngTable As Range 
      Dim rows As Long 
      Dim Line As Variant 
      Dim iCounter As Long 

70  Hdr = "Header" 
80  iCounter = 1 
90  rows = 0 

100  With ThisWorkbook.Worksheets(1).Range("A:A") 
110   Set c = .Find(Hdr, LookIn:=xlValues) 
120   If Not c Is Nothing Then 
130    firstAddress = c.Address 
140    c.Select  'must select object 
150   End If 

160  Do 

170  With ThisWorkbook.Worksheets(1) 
180   Set rngTable = c.CurrentRegion 
190   .ListObjects.Add(SourceType:=xlSrcRange, Source:=rngTable, _ 
       xlListObjectHasHeaders:=xlYes, TableStyleName:="TableStyleMedium1") _ 
       .Name = "List" & iCounter 
200  End With 

210  With ThisWorkbook.Worksheets(1).ListObjects(1) 
220   For Each Line In .Range.SpecialCells(xlCellTypeVisible).Areas 
230    rows = rows + Line.rows.Count 
240   Next 
250  End With 

260  MsgBox "Number of rows displayed = " & rows 

      'reset selected variables 
270   iCounter = iCounter + 1 
280   rows = 0 
290   Set Line = Nothing 

      'find next currentregion 
300   Set c = .FindNext(c) 
310  Loop While Not c Is Nothing And c.Address <> firstAddress 
320 End With 

330  On Error GoTo 0 
340  Exit Sub 

test_currentregion_IncludeHeaders_Error: 

350  MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure_test_currentregion_IncludeHeaders of Sub current_region" 

End Sub 
+0

ich einen Link zu dem Makro aktiviert Arbeitsmappe auf Microsoft Onedrive enthalten. – user2948870

+0

Willkommen auf der Website! Bitte [bearbeite deine Frage] (https://stackoverflow.com/posts/39907765/edit), um den kleinsten Teil des Codes einzubeziehen, der notwendig ist, um das Problem zu zeigen. Auf der [Tour] (https://stackoverflow.com/tour) finden Sie weitere Informationen zu Fragen, die qualitativ hochwertige Antworten liefern. – cxw

+0

'test_currentregion_IncludeHeaders' ist nicht zu groß für den Post. –

Antwort

2

Das Problem, das Sie haben, ist, dass Sie immer mit dem ersten Listobject beziehen .ListObjects(1).

können Sie das Listobject zugreifen, dass ein Bereich gehört und zurück ihre Zeilen (ohne Sockel) wie folgt zählen:

rows = rngTable.ListObject.DataBodyRange.rows.Count

Verwandte Themen