You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用VBA .Find函数查找同行异列字符串时遇命名参数错误求助

VBA .Find函数查找双字符串报错问题及解决

问题描述

需使用VBA的.Find函数查找两个字符串并定位其所在行,调用示例为rowindex = getrowindex(sysnum, "Wavelength", "Test-Config")。原脚本在执行以下代码时报错**"Named Argument Not Found"**:

Set parameter_row = Worksheets(sysnum).Range("B:B").Find(What:=parametername, What:=routingname, Lookat:=xlWhole, LookIn:=xlFormulas, MatchCase:=True)

已确认可用引用中无Solver.xlam。


原完整VBA代码

Main 主过程

Public Sub Main()
Dim wb As Workbook, ws As Worksheet, i As Range, dict As Object, sysnum As Integer, sysrow As Integer, syscol As Integer, wsName As String 
Dim wbSrc As Workbook

Dim value As Long, colindex As Long, rowindex As Long

Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1") 

Set wbSrc = Workbooks.Open("Q:\Specification and Configuration Document.xlsx")
Set dict = CreateObject("scripting.dictionary")
    For Each i In ws.Range("E2:E15").Cells ' i = every WD number
      sysnum = i.value
      sysrow = i.Row
      syscol = i.Column

      If sysnum = "" Then
        On Error Resume Next
      End If
If Not dict.Exists(sysnum) Then ' 检查唯一值是否已存在,避免重复添加到字典
    dict.Add sysnum, True
    If Not SheetExists(sysnum, ThisWorkbook) Then
        wsName = i.EntireRow.Columns("D").value ' 待复制的工作表名称
        If SheetExists(wsName, wbSrc) Then ' 源工作簿中存在该工作表时执行复制
            wbSrc.Worksheets(wsName).Copy After:=ws ' 复制工作表
            wb.Worksheets(wsName).name = sysnum ' 重命名复制后的工作表
        End If
    Else
        MsgBox "Sheet " & sysnum & " already exists"
    End If
End If

Sheets(1).Select
' 波长调谐范围部分
' 在Sheet1中获取列索引
colindex = getcolumnindex(ws, "Tuning Range (nm)")
value = getjiradata(sysrow, colindex)

' 在SD工作表中获取行索引
rowindex = getrowindex(sysnum, "Wavelength Tuning Range", "Test-Config-OCT")

Next i
End Sub

SheetExists 函数

Function SheetExists(SheetName As String, wb As Workbook)
  On Error Resume Next
  SheetExists = Not wb.Sheets(SheetName) Is Nothing
End Function

getcolumnindex 函数

Function getcolumnindex(sht As Worksheet, colname As String) As Long 
Dim paramname As Object
Set sht = Worksheets("Sheet1")
Set paramname = sht.Range("A1:Z2").Find(What:=colname, Lookat:=xlWhole, LookIn:=xlFormulas, MatchCase:=True)
    If Not paramname Is Nothing Then
        getcolumnindex = paramname.Column
    End If
End Function

getjiradata 函数

Function getjiradata(WDrow As Integer, parametercol As Long) 
   Dim cell As Variant, ws As Worksheet
   cell = getcolumnindex(ws, "Tuning Range (nm)")
   getjiradata = Cells(WDrow, parametercol)
End Function

报错的 getrowindex 函数

Function getrowindex(WDnum As Variant, parametername As String, routingname As String) As Long 
   Dim parameter_row As Object
   Set parameter_row = Worksheets(sysnum).Range("B:B").Find(What:=parametername, What:=routingname, Lookat:=xlWhole, LookIn:=xlFormulas, MatchCase:=True)
      If Not parameter_row Is Nothing Then
          getrowindex = parameter_row.Row
      End If
End Function

报错原因

VBA的.Find方法仅允许传入一个What参数用于指定查找内容,原代码中重复设置What:=parametername, What:=routingname属于语法错误,触发"Named Argument Not Found"报错。


更新后的修正 getrowindex 函数

通过先查找第一个字符串,再遍历匹配结果并检查相邻单元格是否为第二个字符串的方式实现需求:

Function getrowindex(WDnum As Variant, parametername As String, routingname As String) As Long ' 定位SD工作表中参数所在行
Dim parameter_row As Range, ws As Worksheet, rowname As Range, addr As String

Set ws = ThisWorkbook.Sheets(WDnum)

Set rowname = ws.Columns("B").Find(What:=parametername, Lookat:=xlWhole, LookIn:=xlFormulas, MatchCase:=True)
    If Not rowname Is Nothing Then addr = rowname.Address ' 记录第一个匹配单元格地址,避免无限循环
    Do While Not rowname Is Nothing
        If rowname.Offset(0, 1).Value = routingname Then ' 检查右侧C列是否为目标routingname
            getrowindex = rowname.Row
            Exit Function
        End If
    Set rowname = ws.Columns("B").FindNext(after:=rowname)
        If rowname.Address = addr Then Exit Do ' 回到首个匹配单元格时退出循环
    Loop
 End Function 

内容的提问来源于stack exchange,提问作者user20114520

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:20:28