2016-04-20 2 views
3

То, что я пытаюсь сделать
Найдите столбец, чья ячейка заголовка содержит уникальную строку. Другими словами, я знаю текст ячейки, и я знаю, что ячейка находится в строке 1, но я не знаю, какой столбец. ПРИМЕЧАНИЕ. Я хочу найти текст всего текста, а не только его часть. ПРИМЕЧАНИЕ2: Текст может меняться, поэтому я не могу задать код в свой код. Скорее мне нужно использовать переменную , в которой значение сохраняется.Range.Find() текст с возвратом каретки Excel VBA

Проблема
Когда нет возврата каретки в тексте заголовка, простой newCol = Range("1:1").Find(headerText).Columnработает отлично. Однако, если есть возврат каретки, это не сработает. Он выдает ошибку «Объектная переменная или с переменной блока не задана». Вот моя точная строка заголовка:

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 

Спасибо!

+1

Что делать, если вы попробуете 'Range (" 1: 1 "). Найти (" * "и headerText &" * "). Столбец – BruceWayne

+0

Не повезло. Та же проблема –

+0

Как вы объявили 'newCol'? Я положил «Test [alt-enter] Test» и запустил 'newCol = Range (« 1: 1 »). Найти (« Тест »). Столбец', и он сработал. – BruceWayne

ответ

1

пожалуйста попробуйте ниже код

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 
+0

См. Комментарий BruceWayne выше. Это не работает. Имеет смысл, что это не так, поскольку у меня есть целая строка, поэтому групповые символы «*» на самом деле не так много делают. –

+0

вы можете показать строку заголовка? –

+0

См. Обновленный вопрос выше. –

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


Это потому, что использование Найти() не требует соответствия содержимому ячейки WHOLE.

EDIT # 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

+0

Вы ищете часть текста заголовка, а не все. –

+0

Попробуйте найти диапазон («H1»). Значение или где бы вы не сохранили этот текст. Это не должно работать. –

+0

@AlexSilverman Вы правы ..... см. Мой ** РЕДАКТИРОВАТЬ # 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 

Успехов!

Edit: Ссылка на Microsoft VBScript регулярных выражений 5.5 требуется

Edit2: Edited для переменной использования. Объяснение: Замените место в переменном значении с помощью опционального пространства/разрыва строки, скобки для сопоставления шаблонов.

+0

Спасибо. К сожалению, как я уже упоминал выше, мне нужно найти переменную, потому что точная строка может отличаться. Можете ли вы использовать RegEx с переменной? –

+0

Предоставленные перерывы могут произойти только между словами значения переменной, да. См. Edit2. – LocEngineer

+0

Это кажется более интуитивным, но также более неуклюжим, чем решение Karthick выше. –

Смежные вопросы