2016-05-06 11 views
1

Vielen Dank für Ihre Augen! Ich fürchte, ich bin völlig neu in VBA und habe ein bisschen zu kämpfen, muss ich zugeben.VBA VLookUp - funktioniert nicht, aber kein Fehler

Ich probiere mein erstes Projekt aus und lerne damit, und ich bin in meine erste Straßensperre geraten. Keine Fehler, aber mein VLookUp möchte keine Daten zurückgeben.

Grundsätzlich versuche ich alle Daten auf meiner Registerkarte "Eingabe" auszuwählen, sie zu schneiden und hinter meine "Ausgabe" Registerkarte, dann ein VLookUp von meiner "Client List" -Registerkarte, um Werte zur Ausgabe zurückzukehren.

Mein Code sieht so aus;

Option Explicit 
Sub RP_Maker() 
''''''variables 

'Misc 

Dim x As Long 

'Worksheets 

Dim ws_Input As Worksheet 
Set ws_Input = Workbooks("RP Maker").Worksheets("Input") 

Dim ws_Output As Worksheet 
Set ws_Output = Workbooks("RP Maker").Worksheets("Output") 

Dim ws_ClientList As Worksheet 
Set ws_ClientList = Workbooks("RP Maker").Worksheets("Client List") 

Dim ws_PRP As Worksheet 
Set ws_PRP = Workbooks("RP Maker").Worksheets("Previous RPs") 

'Last Column & Row 

Dim lCol As Long 
lCol = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column 

Dim lRow As Long 
lRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 

'''''Code 

'Cut Input sheet and paste to Output sheet. 

ws_Input.Activate 

ws_Input.Range(Cells(1, 1), Cells(lRow, lCol)).Cut ws_Output.Cells(1, 1) 

ws_Output.Activate 

'VLookUp 

ws_ClientList.Activate 

For x = 2 To lRow 

    On Error Resume Next 
    ws_Output.Cells(x, 4) = Application.WorksheetFunction.VLookup(ws_Output.Cells(x, 1), ws_ClientList.Range(Cells(1, 1), Cells(lRow, lCol)), 4, False) 
    On Error GoTo 0 

Next x 

ws_Output.Activate 


End Sub 

Es wird keine Fehler auswerfen, aber im Erraten das ist, weil ich verwendet habe (wahrscheinlich falsch), die Fehlerbehandlung.

Dort sind relevante Daten zu suchen, so dass jeder Lauf kein Fehler sein sollte. Etwa die Hälfte ist leer und die Hälfte hat Daten.

Vielen Dank!

Callum

+1

Könnte einfacher sein 'ws_Output.Cells (x, 4) .formula =' stattdessen? – findwindow

+0

Danke für die Antwort, nicht sicher, wie man das strukturiert und die Schleife hält? – CMWells

+0

'Offset' vielleicht? – findwindow

Antwort

1

Die folgende versucht, einen Bereich zu konstruieren, Zellen, die von einem anderen Tabellenblatt (der Standard ActiveSheet property) verwendet wird.

ws_ClientList.Range(Cells(1, 1), Cells(lRow, lCol)) 

Es sollte näher sein,

ws_ClientList.Range(ws_ClientList.Cells(1, 1), ws_ClientList.Cells(lRow, lCol)) 

Es gibt ein paar Orte, wo man diese fehlerhafte Bereich Referenzierung wiederholen, aber Sie bekommen, weg mit ihm wegen der richtigen Active. Es ist besser, alle Range object und Range.Cells propertyRange.Parent Eigenschaften explizit zu verweisen.

+0

lol Sie nicht einmal das Problem auf der Hand^_ ^; – findwindow

+0

Ich tat dies vorher (und verlor alles), aber dort habe ich separate Variablen für jeden ws lcol/lrow erstellt. Wird dies allgemein als bessere Praxis angesehen? Am besten, gute Gewohnheiten am Anfang zu bekommen! – CMWells

1

Vielen Dank für Ihre Hilfe. Es war die schlechte Zelle/Reichweite, die meinerseits dafür verantwortlich war.

Ich habe wie vorgeschlagen geändert und es funktioniert perfekt, nur wenn jemand sonst leidet ähnlich, das ist, wie mein Arbeitscode aussieht;

'VLookUp 

For x = 2 To lRow 

On Error Resume Next 
ws_Output.Cells(x, 4) = Application.WorksheetFunction.VLookup(ws_Output.Cells(x, 1), ws_ClientList.Range(ws_ClientList.Cells(1, 1), ws_ClientList.Cells(lRowClientlist, lColClientList)), 4, False) 
On Error GoTo 0 

Next x