我经常在Excel中使用Ctrl在多个工作表中查找工作簿中的内容,因此“内部”字段通常设置为"Workbook“。我还运行宏,并发现运行它们的一个副作用是,当在Excel中执行Ctrl时,“is”字段被重置为"Sheet“,而在此之前它是"Workbook”。我追踪到find方法就是这种重置发生的地方,我想知道如何确保“内部”设置返回到运行宏之前的任何设置。我的宏有以下内容:
lastCol = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByColumns, xlPrevious).Column
lastRow = Sheets(sheetFocus).Cells.Find("*", [a1], , , xlByRows, xlPrevious).row我看不出哪个参数正在为Ctrl重置Excel中的内容。在执行find方法之前,是否有一种方法可以停止副作用或测试“内部”设置是什么,这样我就可以将其设置回原来的位置了吗?
发布于 2022-04-27 21:05:05
我知道使用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++找到控件(窗口)的名称,也许可以这样做?
或者就像你说的--也许你可以满足于这只是个小麻烦?
发布于 2022-04-28 19:56:08
基于@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 Subhttps://stackoverflow.com/questions/72034048
复制相似问题