Range.Find()带回车符的文本Excel VBA

Range.Find()带回车符的文本Excel VBA,vba,excel,find,carriage-return,Vba,Excel,Find,Carriage Return,我想做的事 找到其标题单元格包含唯一字符串的列。换句话说,我知道单元格的文本,我知道单元格在第1行,但我不知道是哪列。注意:我想搜索整个文本,而不仅仅是其中的一部分。注2:文本可能会有所不同,因此我无法将值硬编码到代码中。相反,我需要使用存储值的变量 问题 当标题文本中没有回车符时,一个简单的newCol=Range(“1:1”).Find(headerText).Column工作正常。但是,如果有回车,则此操作不起作用。它抛出错误“对象变量或块变量未设置”。下面是我的确切标题字符串: Inco

我想做的事
找到其标题单元格包含唯一字符串的列。换句话说,我知道单元格的文本,我知道单元格在第1行,但我不知道是哪列。注意:我想搜索整个文本,而不仅仅是其中的一部分。注2:文本可能会有所不同,因此我无法将值硬编码到代码中。相反,我需要使用存储值的变量

问题
当标题文本中没有回车符时,一个简单的
newCol=Range(“1:1”).Find(headerText).Column
工作正常。但是,如果有回车,则此操作不起作用。它抛出错误“对象变量或块变量未设置”。下面是我的确切标题字符串:

Incomplete Email
(more text)
我已经尝试过的
我还尝试使用
工作表function.Match(headerText,Range(“1:1”),0)
,但遇到了同样的问题

附加说明和要求
这是外接程序的一部分,因此如果不必更改,我不想更改用户excel工作表中的任何内容(即,我不想删除回车符)

从技术上讲,我是在一个函数中这样做的:

Public Function getColumn(headerText As Variant)
    getColumn = Range("1:1").Find(headerText).Column
End Function

谢谢

请尝试使用以下代码

Public Function getColumn(headerText As String)
    str1 = Split(headerText, vbCrLf)
    str2 = UBound(str1)
    b = Range("1:1").Find(str1(0) & Chr(10) & str1(1)).Column
End Function

即使标题单元格包含回车符,代码也应有效:

Sub FindColumnWithTextInRowOne()
    Dim headerText As String, newCol As Long

    headerText = "whatever"
    newCol = Range("1:1").Find(headerText).Column
    MsgBox newCol
End Sub


这是因为使用Find()不需要与单元格的全部内容匹配

编辑#1:

如果标题单元格是使用公式构造的,则应使用稍微不同的
Find()

   Sub FindColumnWithTextInRowOne()
    Dim headerText As String, newCol As Long, r As Range
    headerText = Range("H1").Text
    newCol = Range("1:1").Find(What:=headerText, LookAt:=xlWhole, LookIn:=xlValues).Column
    MsgBox newCol
End Sub

问题是:带和不带换行符的文本不是同一文本,因此
。查找
失败。您应该做的是模式查找。我刚刚测试了这一点,如果没有断线,那么应该有一个空间:

Sub test()
Dim rex As RegExp, ran As Range
Dim col As Integer, headerText As String

'read you headerText here

Set rex = New RegExp
rex.Pattern = RegexIt(headerText)

For Each ran In Range("1:1")
    If rex.test(ran.Text) Then
        col = ran.Column
        Exit For
    End If
Next ran

MsgBox col

End Sub

Function RegexIt(what As String) As String

what = Replace(what, "(", "\(")
what = Replace(what, ")", "\)")
what = Replace(what, "[", "\[")
what = Replace(what, "]", "\]")
what = Replace(what, "<", "\<")
what = Replace(what, ">", "\>")
what = Replace(what, " ", "[\n ]?")
what = Replace(what, vbCrLf, "[\n ]?")

End Function
子测试()
Dim rex作为RegExp,作为范围运行
Dim col为整数,headerText为字符串
“读到你的头条了吗
Set rex=New RegExp
rex.Pattern=RegexIt(headerText)
对于每个运行范围(“1:1”)
如果是rex.test(ran.Text),那么
col=ran.Column
退出
如果结束
下一轮
MsgBox列
端接头
函数RegexIt(what As String)As String
what=替换(what,“(”,“\(”)
what=替换(what,“)”,“\”)
what=替换(what,“[”,“\[”)
what=替换(what,“]”,“\]”)
what=替换(what,“”)
what=替换(what,“,”[\n]?”)
what=替换(what,vbCrLf,[\n]?”)
端函数
祝你好运

编辑:需要引用Microsoft VBScript正则表达式5.5


Edit2:为变量使用而编辑。说明:将变量值中的空格替换为可选空格/换行符、转义括号以进行模式匹配。

如果尝试
范围(“1:1”)。查找(“*”&headerText&“*”)。列
没有运气。同样的问题您是如何声明
newCol
?我设置了“Test[alt enter]Test”并运行了
newCol=Range(“1:1”).Find(“Test”).Column
并成功了。您是否尝试了
Trim
CLEAN
函数???如果您绝对确定它在范围内(1:1),那么您可以尝试
Range(“1:1”).Find(What:=headerText,LookAt:=xlPart)。Column
见上面的BruceWayne评论。这是行不通的。从某种意义上讲,它不会,因为我有整个字符串,所以通配符“*”实际上没有什么作用。它对我来说不是一个完美的解决方案,但它可以作为备份。首先,我将确定是否有回车,并且有,我将使用此代码。谢谢您正在搜索标题文本的一部分,而不是全部。请尝试搜索范围(“H1”).Value,或者搜索存储该文本的任何位置。它不应该起作用。没有这样的运气,尽管情况略有不同。因为我使用的是表单,headerText实际上是传递给函数的下拉框/组合框的值。使用
LookAt:=xlWhole
Lookin:=xlValues
没有帮助。谢谢。不幸的是,正如我上面提到的,我需要搜索变量,因为确切的字符串可能会变化。您可以将正则表达式和变量一起使用吗?如果中断只能发生在变量值的字之间,则可以。参见edit2。这看起来更直观,但也比上面Karthick的解决方案更笨重。它看起来确实更笨重。但如果没有断线,凯西的就不行了。我上面的代码也包含错误。我对它做了一点修改,并且扩展了headertext中包含空格、换行符或需要转义的字符的情况。不过应该可以。