2016-11-30 2 views
0

Ich habe Code für ein Befehlsschaltflächenklickereignis, das Fehler 91 hält. Wenn ich den Code durchtrete, wird der Fehler direkt nach dem 'Set findvalue 'Code wird ausgeführt. Siehe Codefragment unten. Ich kann es bei der Überprüfung des Codes selbst nicht herausfinden.UserForm Befehlsschaltfläche Code - Fehler 91: Objektvariable oder Mit Blockvariable nicht festgelegt

'findvalue' wird als Bereichsobjekt dimensioniert. 'DataSH' ist das Arbeitsblatt, in dem die Stammdatentabelle beginnend mit der Spalte für Record ID (Spalte B) existiert. Die Benutzerformularelemente werden auf ihre jeweiligen Spalten in der Datentabelle auf DataSH festgelegt.

Private Sub cmdEdit_Click() 
    'declare the variables 
    Dim findvalue As Range 
    Dim cNum As Integer 
    Dim DataSH As Worksheet 
    'error handling 
    On Error GoTo errHandler: 
    'hold in memory and stop screen flicker 
    Application.ScreenUpdating = False 
    Set DataSH = Sheet1 

das Click-Ereignis-Unterprogramm, daß diese Schnipsel aus genommen wird, ist Setup der entsprechende Spalt der Daten der Zeile für die ausgewählten Daten ID (Zeilennummer identifier) ​​in DatAsh basierend auf dem Wert in den UF-Elementen zu aktualisieren (dh geänderte oder gelöschte Werte). Der Punkt ist, die Stammdatentabelle auf DataSH mit Änderungen zu aktualisieren, die in den UF-Elementen (Textfeldern und Kombinationsfeldern) vorgenommen werden.

Set findvalue = DataSH.Range("B:B"). _ 
    Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole) 
    'update the values 
    findvalue = tbRecID.Value 
    findvalue.Offset(0, 1) = tbRecDate.Value 
    findvalue.Offset(0, 2) = cmbRecLoc.Value 
    findvalue.Offset(0, 3) = cmbRecCust.Value 
    findvalue.Offset(0, 4) = tbRecAmt.Value 
    findvalue.Offset(0, 5) = cmbRecComm.Value 
    findvalue.Offset(0, 6) = cmbRecPrin.Value 
    findvalue.Offset(0, 7) = tbRecTerr.Value 
    findvalue.Offset(0, 8) = tbRecRep.Value 
+1

Sie setzen findvalue die Set-Anweisung verwenden, und dann versucht, es einfach einen anderen Wert zuweisen. – Rdster

+1

@Rdster, aber das sollte keinen Fehler auslösen, da es gerade den aktuellen "findvalue" -Wert bestätigt – user3598756

+0

@Rdster Die Textbox und die Kombinationsfeldelemente werden gefüllt, sobald ein Datensatz doppelt geklickt wird (eine separate Subroutine) in einer Listbox (gezogen aus der Datentabelle auf DataSH) auf der gleichen UF. 'findvalue' wird auf die Datensatz-ID gesetzt, die bei diesem Ereignis in das Textelement tbRecID eingefügt wird. Der Rest des Codes soll den Wert aus den UF-Elementen (nämlich denjenigen, die geändert wurden) an das entsprechende Feld in der DataSH-Tabelle (und damit an das Listenfeld) zurückgeben, wobei das Objekt 'findvalue' als Referenzpunkt verwendet wird. Zumindest denke ich, dass ich das richtig erklärt habe. –

Antwort

1

Ich denke DataSH ist nicht eingestellt. Ist "Sheet1" ein Name eines Arbeitsblattes oder ist es eine Arbeitsblattvariable? wenn es ein Name ist, dann müssen Sie DatAsh wie folgt festgelegt:

Set DataSH = thisworkbook.worksheets("Sheet1") 

und nicht Set DataSH = Sheet1

+0

Das würde einen Fehler rechts von "Set DataSH = Sheet1" Anweisung – user3598756

+0

Nein, es funktioniert, wie er es hat. Solange das Datenblatt Sheet1 ist. Einer ist der Name des Blattes im Eigenschaftenfenster ... der andere ist der (Name). – Rdster

+0

@ user3598756 Das ist das Ticket! Ich habe es auf den Excel-Standard Sheet1-Namen festgelegt. Ich habe das ohne vorherige Probleme gemacht, nur für den Fall, dass der Name des Blattes geändert wurde.Wie auch immer, wenn ich es auf den tatsächlichen Blattnamen wie in deiner Lösung setze, wirkt das wie ein Zauber. Problem gelöst. Vielen Dank1! –

0

Fehler 91 erscheint (in dieser Situation), weil Sie versuchen, Wert bis zu einem gewissen Bereich zugewiesen werden, die nicht festgelegt haben, so dass Ihre Me.tbRecID.Value in DataSH.Range("B:B") existiert nicht. Um dieses Problem zu vermeiden, können Sie einige Fehler Ausnahme hinzufügen, zum Beispiel:

Set findvalue = DataSH.Range("B:B"). _ 
    Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole) 
    'update the values 
On Error GoTo ErrHand: 
    findvalue = tbRecID.Value 
On Error GoTo 0 
    findvalue.Offset(0, 1) = tbRecDate.Value 
    findvalue.Offset(0, 2) = cmbRecLoc.Value 
    findvalue.Offset(0, 3) = cmbRecCust.Value 
    findvalue.Offset(0, 4) = tbRecAmt.Value 
    findvalue.Offset(0, 5) = cmbRecComm.Value 
    findvalue.Offset(0, 6) = cmbRecPrin.Value 
    findvalue.Offset(0, 7) = tbRecTerr.Value 
    findvalue.Offset(0, 8) = tbRecRep.Value 
ErrHand: 
[rest of your code] 

Dies wird das Programm zwingen Linien zu umgehen, die findvalue verwendet, wenn es keine Bereich dieser Variablen zugewiesen ist.

0

Ihr Code einfach an versagt "Me.tbRecID.Value" bei der Suche nach "DataSH.Range (" B: B ")"

wickeln So Ihren Code in einem "If Then End If" ausgeführt werden wenn findvalue tatsächlich auf einen gültigen Bereich gesetzt wurde

Set findvalue = DataSH.Range("B:B"). _ 
Find(What:=Me.tbRecID.Value, LookIn:=xlValues, LookAt:=xlWhole) 
If Not findvalue Is Nothing Then 
    findvalue.Offset(0, 1) = tbRecDate.Value 
    findvalue.Offset(0, 2) = cmbRecLoc.Value 
    findvalue.Offset(0, 3) = cmbRecCust.Value 
    findvalue.Offset(0, 4) = tbRecAmt.Value 
    findvalue.Offset(0, 5) = cmbRecComm.Value 
    findvalue.Offset(0, 6) = cmbRecPrin.Value 
    findvalue.Offset(0, 7) = tbRecTerr.Value 
    findvalue.Offset(0, 8) = tbRecRep.Value 
End If 
+0

Wenn meine Antwort Ihre Frage gelöst hat, können Sie sie als Accepet markieren. Vielen Dank! – user3598756

Verwandte Themen