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

时间:2016-04-20 14:44:22

标签: excel vba excel-vba find carriage-return

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

问题
如果标题文字中没有回车符,则简单的newCol = Range("1:1").Find(headerText).Column 可以正常工作。但是,如果有回车,这不起作用。它会抛出错误"对象变量或With块变量未设置"。这是我的确切标题字符串:

Incomplete Email
(more text)

我已尝试过的内容
我也尝试使用WorksheetFunction.Match(headerText, Range("1:1"), 0),但遇到了同样的问题。

附加说明和要求
这是插件的一部分,所以我不想在用户的Excel工作表中更改任何内容(如果我不需要)(即,我不要想要删除回车符。)

从技术上讲,我在一个函数中执行此操作:

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

谢谢!

3 个答案:

答案 0 :(得分:1)

请尝试使用以下代码

get()

答案 1 :(得分:1)

这就是:带有和不带换行符的文本不是同一个文本,因此.Find失败。你应该做的是模式查找。我刚刚测试了它并且它可以工作,前提是如果没有换行符,那么应该有一个空格:

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
祝你好运!

编辑:需要参考Microsoft VBScript正则表达式5.5

编辑2:已编辑以供变量使用。说明:使用optionel空格/换行符替换变量值中的空格,使用转义括号进行模式匹配。

答案 2 :(得分:0)

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

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

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

enter image description here


这是因为您使用 Find()并不需要匹配单元格的WHOLE内容。

修改#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

enter image description here