关于本文
本文是通过利用生成式AI的自动生成流程创建的。本文由ChatGPT编写,并通过同一执行过程中的五角色自检QA(结构、新手UX、官方出处与技术事实、隐私安全、编辑质量与重复性)进行确认。我们确认了微软官方的Range.Find/FindNext规范与Microsoft Copilot Chat的使用条件,并整理成能够通过虚拟订单号进行核算的形式。未进行其他AI的独立审查、Excel实机测试以及Copilot Chat实际操作。
验证状态:📘 已确认官方信息・未通过Excel/Copilot实机验证
官方规范确认日期:2026年10月29日(日本标准时间)
适用环境、入口与限制事项
| 项目 | 本次条件与注意事项 |
|---|---|
| Excel | 在Windows版Excel桌面应用中使用VBA/并非在Excel网页版中执行VBA的步骤。宏策略需按各组织进行确认 |
| VBA入口 | Alt+F11打开VBE并粘贴至标准模块/使用新建的测试工作簿而非实际数据。请勿勉强绕过宏启用 |
| AI产品 | 区分工作用Microsoft Copilot Chat/个人版Copilot、Excel内Copilot以及Microsoft Copilot附加许可证的体验 |
| 账户 | 需要Microsoft Entra ID的工作或学校账户/可使用Copilot Chat的目标Microsoft 365订阅、租户设置以及网络权限。数据与保护应与个人账户分开 |
| Copilot入口 | copilot.cloud.microsoft等组织允许的入口/界面、模型、引用以及是否可进行网页搜索会因订阅、租户和时期而异 |
| 本次传递给AI的信息 | 仅发送下列虚拟代码和虚拟订单号/不发送真实客户名、真实订单号、公司信息、工作簿和机密信息 |
| 执行状态 | 基于官方规范制定的验证计划/VBA输出、与搜索对话框的交互以及Copilot的回答尚未实际测量 |
首先尝试:查找 A-102
在新测试工作簿的
Sheet1中输入后文所述的虚拟订单表。FindOrderIdSafely将其粘贴到标准模块中并运行。Ctrl+G打开立即窗口,并一致: A3进行确认(尚未在实机上确认的预期值)。
看这里: LookAt:=xlWhole是与A3完全匹配,xlPart则A3和A4都会成为候选。我们将在后半部分确认修改前后的差异。
由于VBA的Range.Find可以写得很简短,因此当向Copilot请求“写一段从A列查找订单号的代码”时,What有时会返回仅指定了该项的示例。问题在于,简短的代码并不一定总是在相同的条件下进行搜索。
根据Microsoft Learn,LookIn、LookAt、SearchOrder、MatchByte的设置会被保存。如果在VBA侧省略,将会使用保存的值,并且如果在搜索对话框中更改了设置,也会受到该值的影响。在将昨天还能找到的字符串突然变成Nothing这一现象归咎于数据损坏或电脑差异之前,必须先检查是否省略了搜索条件。
结论:搜索条件应在代码侧明确指定
提高复现性的要点有以下3个。
LookIn、LookAt、SearchOrder、MatchByte不要省略。After、SearchDirection、MatchCase、SearchFormat也要根据目的明确指定。查找多条记录时,请保存第一个地址,
FindNext当回到开头时停止。
特别是LookAt:=xlWhole是单元格内容的完全匹配,LookAt:=xlPart是部分匹配。如果不经意间切换这两者,即使是相同的搜索值,结果条数也会发生变化。
准备虚拟的订单列表
在新工作簿的Sheet1中输入以下值。全部为虚拟数据。
| 单元格 | 订单编号 |
|---|---|
| A1 | 订单编号 |
| A2 | A-101 |
| A3 | A-102 |
| A4 | XA-102 |
| A5 | A-103 |
完全一致でA-102如果查找,设计上会显示只有A3;如果是部分一致,则A3和A4都会成为候选。如果一开始就在业务工作簿中尝试,除了搜索条件外,还会混入公式、合并单元格、隐藏行、数据类型等因素。因此,请首先将其拆分到一个只有4行测试表格中。
最小示例:查找1个完全一致项
将以下代码粘贴到标准模块中。这是一段尚未运行的验证代码。
Option Explicit
Public Sub FindOrderIdSafely()
Dim ws As Worksheet
Dim area As Range
Dim hit As Range
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set area = ws.Range("A2:A5")
' 検索ダイアログの保存値に依存しないよう、条件を明示する。
Set hit = area.Find( _
What:="A-102", _
After:=area.Cells(area.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False, _
SearchFormat:=False)
If hit Is Nothing Then
Debug.Print "一致なし"
Else
Debug.Print "一致: " & hit.Address(False, False)
End If
End Sub
预期的观察结果是一致: A3。After表示“从该单元格的下一个开始搜索”的位置。通过指定范围末尾并使用xlNext推进,代码中保留了从第一个候选开始检查的意图。但是,这是根据规范构建的预期值,在撰写本文时尚未在Excel中实际测量。
hit Is Nothing优先判断A-999也很重要。当更改为不匹配的hit.Address时,如果直接引用
将导致运行时错误。“无匹配”可能是正常的业务结果,因此不作为异常,而是作为分支处理。
仅更改一个条件:将完全一致更改为部分一致
LookAt:=xlPart
在保持相同数据和相同搜索值的情况下,仅更改以下一处。A-102预期的候选是A3的XA-102和A4的
。此时如果数量从1变为2,就可以观察到改变结果的不是数据或电脑的差异,而是完全一致/部分一致这样的条件差异。LookAt省略。在这种情况下,它可能会使用上次保存的设置,导致结果并非作者预期的部分匹配。这就是微软官方建议“为避免问题,每次都显式指定”的原因。
处理多条记录时停止 FindNext 的循环
FindNext到达搜索范围的末尾时会返回头部。如果没有停止条件,Do循环可能会重复处理同一个单元格而无法结束。
Public Sub FindAllOrderFragments()
Dim area As Range
Dim hit As Range
Dim firstAddress As String
Dim foundCount As Long
Set area = ThisWorkbook.Worksheets("Sheet1").Range("A2:A5")
Set hit = area.Find( _
What:="A-102", _
After:=area.Cells(area.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False, _
SearchFormat:=False)
If hit Is Nothing Then
Debug.Print "一致なし"
Exit Sub
End If
firstAddress = hit.Address
Do
Debug.Print hit.Address(False, False)
foundCount = foundCount + 1
Set hit = area.FindNext(After:=hit)
If hit Is Nothing Then Exit Do
Loop While hit.Address <> firstAddress
Debug.Print "件数: " & foundCount
End Sub
期望观察到的结果是 A3、A4、件数: 2等。微软官方文档 (Microsoft Learn) 解释说,为了停止循环搜索,应保存第一次找到的单元格地址,并将其与后续地址进行比较。
在实际业务代码中,如果在搜索过程中改写单元格的值,也需要注意。更改目标范围可能会改变下一个匹配位置。最好先仅通过读取确认所有条目,然后将修改处理分到不同的阶段,这样更容易排查问题。
用于粘贴到 Copilot Chat 的核算提示词
以下是仅使用虚拟代码的提问示例。
次の架空Excel VBAコードをレビューしてください。 Range.Findの引数を省略すると結果が変わり得る理由を、Microsoft Learnの Range.FindとFindNextを根拠に説明してください。 確認項目: - LookIn、LookAt、SearchOrder、MatchByteの保存仕様 - 検索ダイアログとの相互作用 - Afterの意味 - Nothingの安全な処理 - FindNextが先頭へ戻ったときの停止条件 コードを実行したとは書かず、未確認の部分は未確認と明記してください。 回答には一次資料URLを付け、確定仕様・推測・追加検証を分けてください。 実顧客データや実ファイルはありません。
在 Copilot 的回答中,LookAt是否不仅仅解释了这一点就结束了,是否能够列举出四个保存设置,FindNext是否意识到了循环检索。即使附带了网址,也要自己打开内容进行核对。如果回答断言“这段代码绝对安全”,则应驳回,指出其未在 Excel 中运行,且未确认合并单元格、多重范围或搜索过程中的更改。
常见错误与原因
省略参数会更短、更容易阅读
即使很短,已保存的设置也会变成隐藏输入。根据负责人或前一个操作的不同而改变结果的代码,在例行业务中很难进行维护。显式包含参数名称可以在审查时确认完全一致、搜索方向以及大小写处理。
忘记设置 SearchFormat
如果不打算进行格式搜索,则应显式指定SearchFormat:=False。如果将格式也包含在搜索条件中,请单独管理准备了哪些格式。在这次的订单号搜索中,不将格式作为条件。
明明要求完全一致,却还是找到了 A4
LookAt:=xlPart请检查是否设置成了该状态。A-102是XA-102的一部分,因此在部分匹配时两者都会成为候选。不要删除数据来凑合,而是应该重新确定搜索需求。
FindNext 无法结束
搜索具有返回开头的特性。如果不保存第一个地址,仅将Nothing作为结束条件,则可能会不断循环相同的匹配项。请测试循环停止条件。
因为是 Copilot 编写的所以无需验证
Copilot 可用于草稿和整理审查视角,但无法自动保证 Excel 的状态或业务需求。请在虚拟的最小表格中分别执行完全匹配、部分匹配、无匹配以及多匹配,然后再迁移到业务工作簿中。
实务中的采用判断
如果只查找 1 条数据,请使用明确指定了参数的Find与Nothing分支。如果是多条数据,则保存第一个地址以停止循环。如果搜索对象是表格的键且需要多次引用相同的值,则使用 Dictionary 或工作表函数可能更符合目的。
采用前的确认事项包括:目标范围、查看值还是公式、完全匹配还是部分匹配、大小写、多匹配时的处理以及无匹配时的业务处理。切勿仅凭速度决定手段,应先确认相同输入能够重现相同结果。
在公开网站的限定搜索中,Range.Find虽然找到了提及 Dictionary 加速的文章、Range 对象解说以及 XLOOKUP 与 VBA 搜索概论,但未能确认以“保存的搜索条件与搜索对话框”、“FindNext 的循环停止”为中心的相同搜索意图。本文判断这是一篇聚焦于此限定技术故障的新文章。不过,这并不记录为已通过带身份验证的方式全量核对过公开文章、非公开文章以及翻译版。
总结
Range.Find的结果如果突然发生变化,首先应怀疑是否省略了搜索条件。LookIn、LookAt、SearchOrder、MatchByte会被保存,并且还会与搜索对话框产生相互影响。应在代码端明确条件、安全处理无匹配情况,并且在FindNext中,在返回第一个地址的时点停止。
在向 Copilot 咨询时也不要传递实际数据,而是使用虚拟代码核算“明确了哪些条件”。将 AI 的说明、Microsoft 官方规范以及 Excel 的实际测量结果分离开来进行记录,是通往具备可重现性的业务宏的捷径。
官方信息与一手信息
Microsoft Learn — Range.Find 方法 (Excel) — 保存的 4 个设置、与查找对话框的交互、
After、Nothing的规范。Microsoft Learn — Range.FindNext 方法 (Excel) — 搜索的循环以及通过初始地址停止的方法。
Microsoft Learn — Microsoft Copilot requirements — 适用合同、Microsoft Entra ID 账户、应用与网络条件。
Microsoft Learn — Manage Copilot Chat — 工作/个人账户的区别、入口、租户管理。
Microsoft Learn — What is Microsoft Copilot? — Copilot Chat 与附加许可证、应用内体验的区分。
GitHub 示例
示例包含不覆盖现有工作表的虚拟数据创建、完全匹配、部分匹配、0 条结果、FindNext的循环停止以及预期日志。已与 Microsoft 官方规范进行静态核对,但未在 Excel/VBA 实际设备上运行。
