2016-06-27 16 views
1

Ich arbeite in VBA - Excel 2016‚Range von Objekt‘ _Worksheet fehlgeschlagen - Userform

Ich versuche, eine Eingabe von einem Userform aus einem Blatt, finden die nächste leere Zeile auf einem anderen Blatt und Einsatz genannt zu nehmen der Wert. Ich bekomme jedoch immer einen Laufzeitfehler - 'Objektbereich' _Worksheet Failed. Die Form wird von einer anderen Form aus aufgerufen.

Ich habe verschiedene Lösungen ausprobiert, aber nichts scheint zu funktionieren.

Ich verwende fast den gleichen Code woanders, der funktioniert, wenn das Formular aufgerufen wird und der Wert auf dem gleichen Blatt eingefügt wird, so haben Sie geschlossen, dass es auf das andere Blatt zugreifen muss.

versagt es in dieser Zeile:

ActiveWorkbook.Worksheets("Suppliers").Range("A" & NextRow) = SupplierName 

Der Code ich benutze ist unten.

Private Sub addSupplierConfirm_Click() 

'Initialise variables 
Dim SupplierName As String 

'Assign variables 
SupplierName = addSupplierName.Value 

If (SupplierName = "") Then 
    MsgBox ("Please enter a supplier name") 
    Exit Sub 
End If 

'Find next row on supplier sheet add supplier name 

NextRow = ActiveWorkbook.Worksheets("Suppliers").Range("A" & Rows.Count).End(xlUp).Row + 1 
ActiveWorkbook.Worksheets("Suppliers").Range("A" & NextRow) = SupplierName 

Application.ScreenUpdating = False 

'Sort Suppliers 
ActiveWorkbook.Worksheets("Suppliers").ListObjects("tbl_suppliers").Sort.SortFields. _ 
    Clear 
ActiveWorkbook.Worksheets("Suppliers").ListObjects("tbl_suppliers").Sort.SortFields. _ 
    Add Key:=Range("tbl_suppliers[[#All],[Suppliers]]"), SortOn:=xlSortOnValues, _ 
    Order:=xlAscending, DataOption:=xlSortNormal 
With ActiveWorkbook.Worksheets("Suppliers").ListObjects("tbl_suppliers").Sort 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

'Activate home page 
Sheets("Expenses").Activate 
Range("A1").Select 

Application.ScreenUpdating = True 

'Unload form 
addSupplierName.Value = "" 
UfAddSupplier.Hide 

End Sub 

Vielen Dank im Voraus!

+0

Hallo, danke für die Antwort. Ich habe überprüft, dass 'NextRow' positiv ist und dass' Lieferanten' zusammen mit führenden/nachgestellten Leerzeichen existiert. Ich habe jetzt diesen Laufzeitfehler "Methode 'Value2' des Objekts 'Bereich' fehlgeschlagen". Der Wert wird am Ende der Tabelle hinzugefügt, aber nicht sortiert, da der Laufzeitfehler den Rest des Codes daran hindert, ausgeführt zu werden. –

+0

Ich habe '' Value2' 'aus Ihrem Kommentar hinzugefügt, wo Sie 'ThisWorkbook.Worksheets (" Suppliers ") vorgeschlagen haben. Range (" A "& NextRow) .Value2 = SupplierName'. Der Code schlägt in dieser Zeile fehl. –

+0

'addSupplierName.Value' gibt den gleichen Wert wie in der Eingabe zurück. Sieht so aus, als müsste ich vielleicht eine andere Lösung finden, danke für deine Hilfe. –

Antwort

0

Sie können nicht auf das Blatt zugreifen, während ein Formular noch angezeigt wird. Bewegen Sie UfAddSupplier.Hide ein bisschen weiter nach oben in Ihrem sub kurz bevor das Blatt den Zugriff und alles sollte wie vorgesehen:

Private Sub addSupplierConfirm_Click() 

'Initialise variables 
Dim SupplierName As String 

'Assign variables 
SupplierName = addSupplierName.Value 

If (SupplierName = "") Then 
    MsgBox ("Please enter a supplier name") 
    Exit Sub 
End If 

UfAddSupplier.Hide 

'Find next row on supplier sheet add supplier name 

NextRow = ActiveWorkbook.Worksheets("Suppliers").Range("A" & Rows.Count).End(xlUp).Row + 1 
ActiveWorkbook.Worksheets("Suppliers").Range("A" & NextRow) = SupplierName 
... 
... 
... 
+0

Immer noch der gleiche Fehler. Wenn ich das Benutzerformular selbst ausführe (nicht aus dem ursprünglichen Benutzerformular), funktioniert es gut, ohne das Formular vor dem Zugriff auf das Blatt ausblenden zu müssen. Könnte es sich um ein Problem handeln, wenn das ursprüngliche Benutzerformular aktiv ist? –

+0

Natürlich. ** Nein ** 'UserForm' (es sei denn, das Formular wird nicht angezeigt) kann angezeigt werden, während Sie auf ein Blatt zugreifen. – Ralph

+0

Endlich hat es funktioniert! Ihre Lösung war korrekt, musste das ursprüngliche Benutzerformular zuerst ausblenden, bevor Sie das neue laden, anstatt es oben zu laden. Danke für Ihre Hilfe! –