2015-05-17 2 views
1

Я хочу найти все рабочие листы для даты, а при их замене заменить дату «да».Поиск даты (затемненной как строка) во всей книге

У меня есть код ниже:

Sub Aftekenen() 

Dim Sh As Worksheet 
Dim Loc As Range 
Dim Datum As String 

Datum = "28-12-2015" 

For Each Sh In ThisWorkbook.Worksheets 
With Sh.UsedRange 

    Set Loc = .Cells.Find(What:=Datum) 

    If Not Loc Is Nothing Then 
     Do Until Loc Is Nothing 
      Loc.Value = "Yes" 
      Set Loc = .FindNext(Loc) 
     Loop 
    End If 
End With 
Set Loc = Nothing 
Next 

End Sub 

Однако код работает, однако она никогда не достигнет Для каждого цикла. Когда я удаляю «-», значит, дата станет номером, который он найдет. Однако, когда тире присутствуют, код не находит подходящего значения, однако они присутствуют.

+1

Не удается воспроизвести. Является ли дата, когда вы ищете строку в листе, или это дата? – Comintern

+0

Вы должны явно указать другие параметры в свой оператор Find. Как написано, Find будет использовать любые настройки, используемые последним, которые были использованы, будь то кодом или пользователем. –

ответ

0

попробовать это, for each ... next метод с сравнением .Text (не значение, так как значения ячейки для "28-12-2015" является 42366), она работает хорошо, но некоторые пользователи имеют возражения против этого метода по некоторым причинам, как и для меня меньше кодирования лучше чтение

Sub Aftekenen() 
    Dim Sh As Worksheet, Loc As Range, Datum As String 
    Application.ScreenUpdating = 0 
    Datum = "28-12-2015" 
    For Each Sh In ThisWorkbook.Worksheets 
     For Each Loc In Sh.UsedRange 
      If Loc.Text = Datum Then Loc.Value = "Yes" 
     Next Loc 
    Next Sh 
    Application.ScreenUpdating = 1 
End Sub 

обновление

если вы предпочитаете .find метод, то для поиска из дат требуется для переключения Application.FindFormat.NumberFormat в формат ячеек с г Атес, в связи с датой в .text является 18-05-2015, но .value является 42142

ниже Ваш обновленный вариант

Sub Aftekenen() 

Dim Sh As Worksheet 
Dim Loc As Range 
Dim Datum As String 

Application.FindFormat.NumberFormat = "dd-mm-yyyy" 

Datum = "28-12-2015" 

For Each Sh In ThisWorkbook.Worksheets 
With Sh.UsedRange 

    Set Loc = .Cells.Find(Datum, , xlValues, , , , True, , True) 

    If Not Loc Is Nothing Then 
     Do Until Loc Is Nothing 
      Loc.Value = "Yes" 
      Set Loc = .FindNext(Loc) 
     Loop 
    End If 
End With 
Set Loc = Nothing 
Next 
+0

Я не знаю, почему кто-то проголосовал без комментариев, код отлично работает:) – Vasily

+0

Вы понимаете, что ваш код сравнивает каждую используемую ячейку во всей книге? Исходный код не был, и не зря. Мало того, что это плохой совет, но вы не коснулись основной проблемы: разница между датой и строковым значением. – user1016274

+0

@ user1016274, конечно, я понимаю, что код будет сравнивать каждую ячейку в usedrange для каждого рабочего листа, и это будет не намного медленнее, потому что это не первый метод '.select'. во-вторых, я уловил основную проблему, поскольку вы уже упоминали << разницу между датой и строковым значением >>, и поэтому сравнение идет с текстом ячейки, а не значением ячейки. а также «Application.ScreenUpdating» можно изменить для ускорения кода. И именно поэтому я не видел причин, по которым был отклонен ответ, потому что решение хорошо подходит для таких целей. – Vasily

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