2016-11-30 103 views
0

我有一個命令按鈕單擊事件,保持拋出錯誤91代碼。當我通過代碼時,它會引發錯誤右'後設置findvalue '代碼執行。查看下面的代碼片段。在檢查代碼本身時我無法弄清楚。用戶窗體命令按鈕代碼 - 錯誤91:對象變量或與塊變量未設置

'findvalue'被標註爲範圍對象。 'DataSH'是主數據表以Record ID(B列)列開始的工作表。用戶表單元素在DataSH的數據表中設置爲它們各自的列。

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 

單擊事件子程序,該代碼段取自是設置來更新相應的列上的行中所選擇的記錄ID在DataSH基於在那些UF元素的值的數據(行號的標識符)(即更改或刪除的值)。重點是更新DataSH中的主數據表,並對UF元素(文本框和組合框)中所做的任何更改進行更新。

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

設置findvalue使用SET語句,然後嘗試只分配給它的另一個值。 – Rdster

+1

@Rdster,但不應該引起任何錯誤,因爲它只是確認當前的「findvalue」值 – user3598756

+0

@Rdster在列表框中雙擊一個記錄(一個單獨的子例程)時,將填充文本框和組合框元素來自DataSH上的數據表)在同一個UF上。 'findvalue'被設置爲在該事件時填充在tbRecID文本框元素中的記錄ID。其餘的代碼應該使用'findvalue'對象作爲參考點,將UF元素(即那些已更改)的值返回DataSH表中的專用字段(以及擴展名列表框)。至少我認爲我解釋正確。 –

回答

1

我認爲DataSH沒有設置。 「Sheet1」是工作表名稱還是工作表變量?如果它是一個名字,那麼你必須設置DataSH這樣的:

Set DataSH = thisworkbook.worksheets("Sheet1") 

,而不是Set DataSH = Sheet1

+0

這會從「Set DataSH = Sheet1」語句中引發錯誤 – user3598756

+0

不,它的工作原理與他一樣。只要數據表是Sheet1。一個是屬性窗口中工作表的名稱...另一個是(名稱)。 – Rdster

+0

@ user3598756這就是票!我將它設置爲Excel默認的Sheet1名稱。我一直這樣做,沒有任何以前的問題,以防萬一表名改變。但是,當我將其設置爲實際工作表名稱(如解決方案中的名稱)時,它就像魅力一樣。問題解決了。非常感謝! –

0

錯誤91彈起(在這種情況下),因爲你正試圖將值分配給尚未設定一定範圍內,所以你Me.tbRecID.ValueDataSH.Range("B:B")存在。爲了避免這個問題,你可以添加一些錯誤的異常,例如:

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] 

這將迫使程序繞過它採用findvalue如果沒有分配給該變量的範圍線。

0

你的代碼只是在尋找的「Me.tbRecID.Value」「DataSH.Range(」 B:B「)」沒有

所以包裹你的代碼在「如果然後結束。如果」執行對象如果findvalue實際設置爲有效範圍

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

如果我的答案解決了您的問題,那麼您可能需要將其標記爲accepet。謝謝! – user3598756

相關問題