Ich habe zwei Sub-Prozeduren, die beide zu unglaublich lang sind, um hier in ihrer Gesamtheit einzufügen, jedoch habe ich den Code-Block bis herunter zu die folgende Funktion und Aufrufprozedur, die den Fehler verursachen.Zwei Sub-Prozeduren, warum verursacht diese Funktion einen Objektvariablenfehler nach dem Durchlauf durch beide
ich in der Lage bin zu laufen Sub 1 und dann Sub 2 ohne Probleme, dann, wenn ich versuche Sub 1 erneut ausführen, erhalte ein object variable not set
Fehler auf dieser Linie, die in Sub 1:
cName = "Current Price"
cG = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext).Column
„Current Preis "wird korrekt geschrieben und ist eine Spaltenüberschrift auf jedem Arbeitsblatt, die als Parameter übergeben wird, und wieder Sub 1 läuft beim ersten Mal gut, könnte dies ein Problem der öffentlichen Deklaration sein? Der Fehler wird auf die IsInArray
Funktion zugeschrieben unter
Sub 1
Sub Example(ws_string As String)
Sheets(ws_string).Activate
LR = Range("a1000").End(xlUp).Row
LC = Range("zz1").End(xlToLeft).Column
cName = "Fund ID"
cA = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext).Column
cName = "BBH ID"
cB = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext).Column
cName = "Description"
cC = ActiveSheet.Rows.Find(What:=UCase(cName), LookAt:=xlWhole, SearchDirection:=xlNext).Column
cName = "Security Type"
cD = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext).Column
cName = "Price Date"
cF = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext).Column
cName = "Current Price"
cG = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext).Column
cName = "Prior Price"
cH = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext).Column
Sub 2
Set aSelection = Range("C2:C1500")
Set aSelect_Recon = Sheets("Recon").Range("L2:C1500")
For Each cell In aSelection
If IsInRange(cell.Value, aSelect_Recon) Then
cell.Interior.ColorIndex = 10
End If
Next cell
Function IsInRange(stringToBeFound As String, ByVal rng As Range) As Boolean
Dim r As Range
Set r = rng.Find(What:=stringToBeFound, _
MatchCase:=True, _
LookIn:=xlValues, _
Lookat:=xlPart) 'partial match to have the same behaviour as the filter version
If Not r Is Nothing Then IsInRange = True
End Function
EDIT UPDATE Ferner Ich nenne Sub 1 dreimal Übergeben eines anderen Arbeitsblatts als so:
Example "ETF"
Example "MAV"
Example "Main"
Aber wenn ich die ETF- und MAV-Aufrufe auskommentieren, funktioniert der Main-Prozeduraufruf gut.
Schwach aus dem Thema; Als Faustregel gilt, dass jede Untereinheit oder Funktion, die nicht auf einen Bildschirm passt, [zu groß] ist (http://www.homeandlearn.org/excel_vba_subroutines.html). Wenn Sie Ihren Code in kleine spezialisierte Blöcke zerlegen, von denen jeder einen einzigen Zweck hat, wird das Debuggen erheblich vereinfacht. Zum Thema Debuggen des Fensters [localhosts] (https://msdn.microsoft.com/en-us/library/office/gg264148.aspx) und der Mauszeiger über die Variablen zur Laufzeit sollten Ihnen helfen, den Fehler zu diagnostizieren. –