Почему мой VBA SearchFormat работает в обратном направлении?

Хорошо, это меня ошеломило. Я установил для FindFormat значение Bold, а для SearchFormat значение False, поэтому будет выбран первый экземпляр строки поиска, не выделенный жирным шрифтом. Но когда я выхожу из строки Found.Select в Debug, выделяется именно жирный экземпляр! Я что-то упускаю? PS я ранее был заявлен ...

Range(Cells(3, 3).Address(), Cells(lRow, 3).Address()).Select

Dim cn(0 To 300) As String
Dim Found As Range
Application.FindFormat.Font.Bold = True
i = 0

With Selection

    For Each Drawing In dn
            Set Found = .Find(Drawing, SearchFormat:=False)
            Found.Select
            ActiveCell.Offset(0, 3).Select
            cn(i) = ActiveCell.Value
            i = i + 1
    Next

End With

Установка для SearchFormat значения False просто означает, что форматирование игнорируется. Он просто найдет первый экземпляр.

SJR 26.09.2018 16:32

Если вы хотите найти элементы, не выделенные жирным шрифтом, почему бы не установить такой формат !?

SJR 26.09.2018 16:39

Не знал, что сможешь. Спасибо за совет

user1925590 28.09.2018 16:45

Ваша проблема действительно решена?

SJR 28.09.2018 17:22
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
4
206
1

Ответы 1

Не передан правильный первый элемент, за которым нужно ухаживать. И VBA принимает значение по умолчанию, которое является первым, но начинает следить за ним.

Это пример данных при поиске числа в столбце B:

Sub TestMe()
    Dim myR     As Range
    Dim myS     As Range
    Set myS = Range("B1:B5") 'change the range to "C1:C5" correspondingly 
    With myS
        Set myR = .Find(1)
        Debug.Print myR.Row
        Set myR = .Find(1, after:=.Cells(.Cells.Count))
        Debug.Print myR.Row
    End With
End Sub

Это параметр «После» в MSDN.:

The cell after which you want the search to begin. This corresponds to the position of the active cell when a search is done from the user interface. Notice that After must be a single cell in the range. Remember that the search begins after this cell; the specified cell isn’t searched until the method wraps back around to this cell. If you do no specify this argument, the search starts after the cell in the upper-left corner of the range.

Таким образом, для начала вы даете последнюю возможную ячейку. Он знает, что он должен начаться после этого. Таким образом, ему теоретически нечем заняться, и он просто начинает с начала диапазона. Идея параметра After состоит в том, чтобы установить последнее значение, которое будет проверяться. Таким образом, если у нас есть только одно значение, оно всегда возвращается правильно, независимо от параметра After. Имея более одного значения, он возвращает первое найденное значение.

Таким образом, в приведенном выше коде из-за использования After Range.Find() выполняет поиск ячеек в следующей последовательности:

В1> В2> В3> В4> В5

Без After последовательность будет следующей:

В2> В3> В4> В5> В1

Код с примерами стоит прогнать пару раз. Действительно, параметр по умолчанию не установлен так, как можно было бы ожидать. Я имею в виду, что если я даю диапазон и смотрю на него, я ожидаю, что сначала проверю первую ячейку по умолчанию. И не проверять первую ячейку последней, потому что это параметр по умолчанию для After, когда он не установлен.

Спасибо, очень информативно. Я знал о After, но предполагал, что формат поиска пропустит жирную ячейку и вернется к началу. Не понимал, что SearchFormat работает таким образом. Полагаю, я мог бы поместить Found.Select в блок If и проверить полужирный шрифт ...

user1925590 26.09.2018 16:38

Другие вопросы по теме