我經常在 Excel 中使用 Ctrl-F 來跨多個作業表在作業簿中查找內容,因此“內部”欄位通常設定為“作業簿”。我還運行宏,發現運行它們的副作用是,當在 Excel 中執行 Ctrl-F 時,“Within”欄位在之前是“Workbook”時被重置回“Sheet”。我追查到 find 方法是重置發生的地方,我想知道如何確保“內部”設定恢復到宏運行之前的狀態。我的宏有以下內容:
lastCol = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByColumns, xlPrevious).Column
lastRow = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByRows, xlPrevious).row
我沒有看到哪個引數正在為 Ctrl-F 重置 Excel 中的內容。有沒有辦法在執行 find 方法之前停止副作用或測驗“Within”設定是什么,以便我可以在之后將其設定回來?
uj5u.com熱心網友回復:
我知道使用 SendKeys 方法在 VBA 中完成某些事情通常是不可接受的,但我認為這是您場景的唯一解決方案。
創建此子程式并在獲得最后一行和最后一列后呼叫它。
Public Sub ResetFind()
' Open Find/Replace dialog
Application.CommandBars("Edit").Controls("Find...").Execute
DoEvents
'reset "Within:" entry using <Alt>-H
Application.SendKeys ("%H{DOWN}") ' use Up Arrow to choose Sheet, Down arrow to choose Workbook
DoEvents
' Set Focus to Find box (using <Shift><Tab>
Application.SendKeys (" {TAB} {TAB}")
DoEvents
' Clear out previous entry
Application.SendKeys ("{BACKSPACE}")
DoEvents
' Set Focus to Close button (using <Shift><Tab>
Application.SendKeys (" {TAB} {TAB}")
DoEvents
' Close Find box
Application.SendKeys ("{ENTER}")
DoEvents
End Sub
然后在您的代碼之后呼叫它:
lastCol = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByColumns, xlPrevious).Column
lastRow = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByRows, xlPrevious).row
ResetFind()
筆記:
我知道它沒有找到或使用實際的最后一個值 - 我不確定如何做到這一點 - 也許使用 FindWindow API 呼叫并以這種方式獲取先前的值。如果您可以使用 SPY 找到控制元件(視窗)的名稱,也許可以完成?
或者就像你說的那樣——也許你可以對這是一個小煩惱感到滿意?
uj5u.com熱心網友回復:
基于@dbmitch,我使用了以下代碼。它假定“查找和替換”框中的“選項”已被擴展。
Public Sub ResetFind()
' Open Find/Replace dialog
Application.CommandBars("Edit").Controls("Find...").Execute
DoEvents
'reset "Within:" entry using <Alt>-H
Application.SendKeys ("%H{DOWN}") ' use Up Arrow to choose Sheet, Down arrow to choose Workbook
DoEvents
' Set Focus to Find box (using <Alt>-N
Application.SendKeys ("%N{DOWN}") ' use Down Arrow to choose last search value
DoEvents
' Close Find box
Application.SendKeys ("{ESC}{ESC}")
DoEvents
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/467233.html
