2016-07-08 8 views
0

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.

+1

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. –

Antwort

1

Sie müssen Set Fund Werte, nicht um sie

Set rngTest = ActiveSheet.Rows.Find(What:=UCase(cName), Lookat:=xlWhole, SearchDirection:=xlNext) 
if Not rngTest is Nothing then 
    cA= rngTest.Column 
end if 

Anregung asign können: Start Option Explicit verwenden, die viel helfen wird, diese Art von Fehler zu vermeiden.

+0

Aber '.Column' macht es zu einem Integer/Long, also' Set' ist nicht notwendig/richtig. – arcadeprecinct

+0

Wenn nichts gefunden wird, wirft Spalte den Fehler. Stellen Sie zuerst den Bereich ein, prüfen Sie, ob es nicht nichts ist, und suchen Sie dann nach der Spalte. Ich habe nicht bis zum Ende geschaut. Siehe dieses Thema ist immer wegen keine variable Dekrierung :) Eigentlich war ich auch faul. :) Wird die Antwort bearbeiten. – cyboashu

1

Ich denke, das ist das Problem: Die Optionen der Find-Methode werden gespeichert. (Sie sind die gleichen wie im Suchfenster in Excel). Nach der Ausführung der Funktion IsInRange ist die Option MatchCase auf True eingestellt. In Ihrem Beispiel suchen Sie nach UCase(cName), so dass Sie nach "CURRENT PRICE" suchen, wenn Sie es nach ausführen, und es wirft den Object not set Fehler, wenn es nicht finden kann.

Die Lösung wäre MatchCase:=False in der Example Sub.

bearbeiten: Befolgen Sie den Rat von Cyboashu über Option Explicit und überprüfen Sie das Objekt zuerst, auch wenn dies das Problem jetzt löst!

(PS:. Ich gehörte die MatchCase:=True Option in der IsInRange Funktion das gleiche Ergebnis wie die Filter Funktion zu reproduzieren)

Bitte auch akzeptieren eine Antwort, wenn es Ihr Problem gelöst (man könnte es sogar upvote) .

Wenn es Ihr Problem nicht löst, schreiben Sie einen Kommentar und erklären Sie, warum.

+0

Ich habe 'MatchCase: = False' in der Funktion gesetzt und das hat das Problem nicht gelöst. Ich stimme Ihrer Logik zu, da ich nie ein Problem mit den Zeilen 'ActiveSheet.Rows.Find (Was: = UCase (cName), Lookat: = xlWhole, SearchDirection: = xlNext)' hatte, bevor Sie diese Funktion – phillipsK

+0

@phillipsK hinzufügen Edit Sie sagen, Sie stoßen auf das Problem, ohne 'IsInRange' zu ​​nennen, so scheint es ein anderes Problem zu geben. Stellen Sie unbedingt sicher, dass das Blatt zu dem Zeitpunkt, zu dem Sie das Sub-Telefon erneut anrufen, das enthält, was Sie suchen. Versuchen Sie bitte, das Problem reproduzierbar zu machen, indem Sie den gesamten Code entfernen, der das Problem nicht verursacht, und die vollständige (verbleibende) Subdatei veröffentlichen. – arcadeprecinct