我有一個帶有多張作業表的 excel 作業簿,并試圖限制用戶在第一個作業表中插入/洗掉行的能力。我目前有 VBA 代碼可以洗掉(隱藏)行選單中的“插入”和“洗掉”按鈕,并插入到新的假插入/洗掉按鈕中,這兩個按鈕都會創建彈出框,指導用戶如何正確洗掉/add 行(我有一些鍵系結宏,它們可以同時在多個選擇表中洗掉/添加行)。
此代碼有時會起作用,但通常會回傳“運行時錯誤'91':物件變數或未設定塊變數”。
通過挑選大量類似的問題,我確定我很可能沒有正確初始化命令欄物件(或類似的東西),但我無法弄清楚如何正確地做到這一點。任何人都可以協助糾正錯誤嗎?
這是作業表物件中的代碼:
Private Sub Worksheet_Activate()
'reset to standard context menu before adding new option
Application.CommandBars("Row").Reset
'removes standard Delete and Insert menu bar items
Application.CommandBars("Row").FindControl(ID:=293).Visible = False
Application.CommandBars("Row").FindControl(ID:=296).Visible = False
'add custom row deletion call
With Application.CommandBars("Row").Controls.Add
.Caption = "Delete Row"
.Style = msoButtonCaption
.OnAction = "DeleteRow"
End With
With Application.CommandBars("Row").Controls.Add
.Caption = "Insert Row"
.Style = msoButtonCaption
.OnAction = "InsertRow"
End With
End Sub
Private Sub Worksheet_Deactivate()
'get rid of the customization when you're done with this sheet
Application.CommandBars("Row").Reset
End Sub
這是作業簿物件中的代碼:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
'resets menu bars when workbook sheets are changed
Application.CommandBars("Row").Reset
End Sub
Private Sub Workbook_Deactivate()
'Resets menu bars when workbook is deactivated
Application.CommandBars("Row").Reset
End Sub
這是添加按鈕的模塊 -
模塊一:
Public Sub DeleteRow()
MsgBox "Manually deleting rows from this Estimate will disconnect linked sheets. Please use CTRL-Q to delete rows.", vbOKOnly, "WARNING: Delete Rows"
End Sub
模塊 2:
Public Sub InsertRow()
MsgBox "Manually inserting rows into this Estimate will disconnect linked sheets. Please use CTRL-A to add rows.", vbOKOnly, "WARNING: Insert Row"
End Sub
uj5u.com熱心網友回復:
將這些控制元件的可見性設定為 false 似乎是在修改集合,洗掉您要查找的 ID。
查看 ID 的代碼:
Sub test()
Dim ctl As Object
For Each ctl In Application.CommandBars("Row").Controls
Debug.Print ctl.ID, ctl.Caption, ctl.TooltipText
Next
Debug.Print vbNewLine, vbNewLine
End Sub
如果我在修改之前運行它:
| ID | 標題 | 工具提示 |
|---|---|---|
| 21 | 切 | 切 |
| 19 | &復制 | &復制 |
| 22 | &粘貼 | &粘貼 |
| 21437 | 特殊黏貼... | 特殊黏貼... |
| 3624 | 粘貼表 (&P) | 粘貼表 (&P) |
| 32713 | 資料型別 | |
| 296 | 行(&R) | 插入行 |
| 293 | &洗掉 | &洗掉 |
| 3125 | 清除內容(&N) | 清除內容(&N) |
| 855 | 格式化單元格 (&A)... | 格式化單元格 (&A)... |
| 541 | 行高(&R)... | 行高(&R)... |
| 883 | &隱藏 | 隱藏(&H) (Ctrl 9) |
| 884 | 取消隱藏(&A) | &取消隱藏 (Ctrl Shift ( ) |
| 3626 | 洗掉超鏈接(&E) | 洗掉超鏈接(&E) |
首先使用 ID:=293 運行它:
| ID | 標題 | 工具提示 |
|---|---|---|
| 21 | 切 | 切 |
| 19 | &復制 | &復制 |
| 22 | &粘貼 | &粘貼 |
| 21437 | 特殊黏貼... | 特殊黏貼... |
| 3624 | 粘貼表 (&P) | 粘貼表 (&P) |
| 32713 | 資料型別 | |
| 3183 | &插入 | 插入單元格 |
| 293 | &洗掉 | &洗掉 |
| 3125 | 清除內容(&N) | 清除內容(&N) |
| 855 | 格式化單元格 (&A)... | 格式化單元格 (&A)... |
| 541 | 行高(&R)... | 行高(&R)... |
| 883 | &隱藏 | 隱藏(&H) (Ctrl 9) |
| 884 | 取消隱藏(&A) | &取消隱藏 (Ctrl Shift ( ) |
| 3626 | 洗掉超鏈接(&E) | 洗掉超鏈接(&E) |
您可以看到 ID 296 從串列中消失了,現在出現了 3183。手動測驗它做同樣的事情,添加一行。
換行并成功運行腳本后:
| ID | 標題 | 工具提示 |
|---|---|---|
| 21 | 切 | 切 |
| 19 | &復制 | &復制 |
| 22 | &粘貼 | &粘貼 |
| 21437 | 特殊黏貼... | 特殊黏貼... |
| 3624 | 粘貼表 (&P) | 粘貼表 (&P) |
| 32713 | 資料型別 | |
| 3183 | &插入 | 插入單元格 |
| 293 | &洗掉 | &洗掉 |
| 3125 | 清除內容(&N) | 清除內容(&N) |
| 855 | 格式化單元格 (&A)... | 格式化單元格 (&A)... |
| 541 | 行高(&R)... | 行高(&R)... |
| 883 | &隱藏 | 隱藏(&H) (Ctrl 9) |
| 884 | 取消隱藏(&A) | &取消隱藏 (Ctrl Shift ( ) |
| 3626 | 洗掉超鏈接(&E) | 洗掉超鏈接(&E) |
| 1 | 洗掉行 | 洗掉行 |
| 1 | 插入行 | 插入行 |
不管 296 似乎被替換,而 293 仍然存在。我現在無法重現它,但在測驗時我看到了 ID 3181 而不是 3183,所以我不會依賴那個值。
我不知道它為什么會這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/405371.html
標籤:
上一篇:在VBA中清除內容后粘貼問題
