Excel VBA 查找方法将搜索框 "Within" 从工作簿重置为 sheet
Excel VBA find method resets search box "Within" from workbook to sheet
我在 Excel 中经常使用 Ctrl-F 在多张工作簿中查找内容,因此“范围内”字段通常设置为“工作簿”。我还 运行 宏并发现 运行 对它们的副作用是当从 Excel 中执行 Ctrl-F 时,“Within”字段被重置回“Sheet" 之前是 "Workbook"。我追踪到 find 方法是此重置发生的地方,并且想知道如何确保“Within”设置恢复到宏 运行 之前的状态。我的宏具有以下内容:
lastCol = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByColumns, xlPrevious).Column
lastRow = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByRows, xlPrevious).row
我没有看到哪个参数正在为 Ctrl-F 重置 Excel 中的内容。有没有办法在执行 find 方法之前停止副作用或测试“Within”设置是什么,以便我可以在之后将其设置回去?
我知道在 VBA 中使用 SendKeys 方法完成某些事情通常是不可接受的,但我认为这是适合您的情况的唯一解决方案。
创建此子并在获取最后一行和最后一列后调用它。
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++ 找到控件的名称 (window),也许可以完成?
或者像你说的那样 - 也许你可以满足于它是一个小烦恼?
基于@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
我在 Excel 中经常使用 Ctrl-F 在多张工作簿中查找内容,因此“范围内”字段通常设置为“工作簿”。我还 运行 宏并发现 运行 对它们的副作用是当从 Excel 中执行 Ctrl-F 时,“Within”字段被重置回“Sheet" 之前是 "Workbook"。我追踪到 find 方法是此重置发生的地方,并且想知道如何确保“Within”设置恢复到宏 运行 之前的状态。我的宏具有以下内容:
lastCol = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByColumns, xlPrevious).Column
lastRow = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByRows, xlPrevious).row
我没有看到哪个参数正在为 Ctrl-F 重置 Excel 中的内容。有没有办法在执行 find 方法之前停止副作用或测试“Within”设置是什么,以便我可以在之后将其设置回去?
我知道在 VBA 中使用 SendKeys 方法完成某些事情通常是不可接受的,但我认为这是适合您的情况的唯一解决方案。
创建此子并在获取最后一行和最后一列后调用它。
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++ 找到控件的名称 (window),也许可以完成?
或者像你说的那样 - 也许你可以满足于它是一个小烦恼?
基于@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