Disclaimer: Ich in der Entwicklung von Rubber stark involviert bin.
diese häufigen Fehler vor:
lastRow = Worksheets("Sheet12").Cells(1, Rows.Count).End(xlUp).Row
Rows
unqualifiziert ist, und deshalb bezieht sich implizit auf das aktive Blatt und deshalb ist Rows.Count
nicht unbedingt die Zeilenanzahl auf „Sheet12“. Der Code könnte funktionieren, aber es könnte auch zu einem subtilen Fehler führen, bei dem lastRow
nicht den richtigen Wert hat, abhängig vom Inhalt des aktiven Blattes.
Oder diese:
ActiveWorkbook.Worksheets("SummarySheet") _
.ListObjects("Table1").Sort.SortFields.Add _
Key:=Range("Table1[[#All],["Date]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
es sehen? Da der Parameter Key
nicht qualifiziert ist, wird der Aufruf zur Laufzeit mit Fehler 1004 - "Methode 'Range' des Objekts '_Global' failed" fehlschlagen. Das ist 169 Stack Overflow questions. "Fehler 1004" ergibt 1465 Stack Overflow questions.
Implizite Verweise auf das aktive Arbeitsblatt sind eine häufige Ursache für Fehler.
Rubber der VBA Code-Inspektionen sind, wie ReSharper der C# statische Code-Analyse, Hinweise/Anregungen. Das Tool sagt Ihnen, dass es hier etwas gibt, das könnte verursachen Probleme, oder das macht den Code weniger explizit als es sein könnte.
Sie tun Notwendigkeit voll jeden einzelnen Range
Anruf zu qualifizieren? Natürlich nicht - Rubberduck lässt Sie nur wissen, dass in diesen Fällen ActiveSheet
implizit referenziert wird, das ist alles, was dazu gehört.
Sie können immer sagen, Rubberduck „aussehen, ich weiß, was ich tue“, mit dem „einmal ignorieren“ quick-fix:
Das „fix“ fügt einen speziellen Kommentar (intern , Rubber sie „Anmerkungen“) aufruft, die die Inspektion weist bestimmte Ergebnisse zu ignorieren, während die Inspektion verlassen aktiviert:
With ActiveWorkbook
Set wsMacro = .Worksheets("Macro")
Set wsORatio = .Worksheets("ORatio" & TabNum)
With wsORatio
sMap = "oratio" & TabNum & "map"
'@Ignore ImplicitActiveSheetReference
For CurrentRow = 1 To Range(sMap).Rows.Count
'@Ignore ImplicitActiveSheetReference
Test = Range(sMap).Cells(CurrentRow, 1)
Set wsData = ActiveWorkbook.Worksheets(Test)
'@Ignore ImplicitActiveSheetReference
Start = Range(Range(sMap).Cells(CurrentRow, 2)).Row
Report = wsMacro.Range(sMap).Cells(CurrentRow, 3)
For Cat = 0 To 12
For iMth = 1 To 12
wsORatio.Cells(Report + Cat, 7 + iMth) = wsData.Cells(Start + Cat, 37 + iMth)
Next iMth
Next Cat
Next CurrentRow
End With
End With
Diese Anmerkungen haben den Vorteil, sagen die Leser (Zukunft Sie, oder wer auch immer nimmt der Code über) Das hier ist etwas los.
Zukünftige Versionen unterstützen eventuell die Angabe von @Ignore
Annotationen einmal auf Modulebene, um alle Ergebnisse einer bestimmten Inspektion in einem ganzen Modul zu ignorieren.
Beachten Sie, dass die Inspektion unter der Wartbarkeit und Ablesbarkeit Probleme Kategorie. Range("DefinedName")
ist nicht halb so explizit und ausfallsicher wie:
ActiveWorkbook.Names("DefinedName").RefersToRange
dem Sie den gleichen Bereich gibt, und liest sich wie es tatsächlich ist ein benannter Bereich scoped auf Arbeitsmappe Ebene ziehen.
Da Sie nicht Ihren gesamten Code (wahrscheinlich zu lang) geteilt haben, ist 'sMap' als' Name' definiert? hast du es auf eine 'Range' gesetzt? –
Ich habe, das einzige, was ausgelassen sind die Deklarationen ... hinzugefügt – Rdster
Was ist der Umfang Ihrer benannten Bereiche "oratio1map" ...? Ist es Arbeitsbuch? Sie sollten das Blatt angeben, in dem der Bereich definiert ist, um dieses Tag zu vermeiden, zB 'Sheets (" SheetName "). Bereich (...)'! – R3uK