2015-10-31 2 views
0

Я установил диапазон. Несколько ячеек в этом диапазоне имеют значения, а количество ячеек не имеет значений, они пусты. У меня есть петля диапазона, которая занимает время, потому что она обрабатывает каждую ячейку:Петля диапазона, где значение ячейки пуста

For Each cel1 In rngsh1 

Вышеописанные процессы обрабатывают все ячейки в диапазоне.

Каков точный синтаксис, когда цикл диапазона обрабатывает только непустые ячейки?

Что-то вроде For Each cel11 in rngsh1 and not nothing Я знаю, что этот синтаксис неверен, но я ищу правильный.

+0

'Для каждого cel11 в rngsh1', а затем' If Len (Cel1.Value)> 0 затем' –

+0

Спасибо ... дайте мне попробовать это – Sabha

+1

'Если не IsEmpty (cel1.Value) затем': P –

ответ

1

что-то вроде этого:

Dim cel11 As Range 
Dim rngsh1 As Range 

'Function MultiOr(str As String, ParamArray arr() As Variant) As Boolean 
' Dim holder, runner 
' MultiOr = True 
' For Each holder In arr 'look for everything in arr 
' If IsArray(holder) Then 'if what you found is an array 
'  For Each runner In holder 'for everything in that array 
'  If MultiOr(str, runner) Then Exit Function 
'  Next 
' Else 'if its no array 
'  If Not IsMissing(holder) Then If holder = str Then Exit Function 
' End If 
' Next 
' MultiOr = False 
'End Function 

Sub MySub() 
    For Each cel1 In Range 
' If Not IsEmpty(cel1.Value) Then 'see EEM's answer 
    If Len(cel1.Value) > 0 Then 
'  If MultiOr(cel1.Value, condi) Then 'no need for this function 
     If Not IsError(Application.Match(cel1.Value, Range("I1:BJ1"), 0)) Then 
     'your code here 
     End If 
    End If 
    Next 
End Sub 

'`condi` can be a range with all the conditions or an array or simply a value... 
+0

Упс! для меня это слишком сложно понять. Если у меня есть строки в 'I1: BJ1', тогда строка будет' If MultiOr (cel1.Value, I1: BJ1) Then' – Sabha

+0

Как я уже сказал в своем предыдущем комментарии, например, у меня есть все мои строки "center1" center5 "" center8 "и т. д. ... в определенном диапазоне I1: BJ1, если значение cel1 является одним из этих 54 значений, тогда только вперед. как написать синтаксис для этого? Эта функция поможет мне? – Sabha

+0

'MultioOr (value, array)' просто проверяет, что-либо в 'array' равно' value' ... поэтому просто измените 'If MultiOr (cel1.Value, condi) Then' to' If MultiOr (cel1.Value, Range («I1: BJ1»)) Тогда « ... он проверит все в I1: BJ1 = cel1.Value –

1

Чтобы действительно искать через не-пустые ячейки необходимо использовать SpecialCells метод Range (см Range.SpecialCells Method (Excel)

Эта процедура процесса только непустые ячейки

Как некоторые из ресурсов, используемых в процедуре, могут быть новыми для пользователя, поэтому я предлагаю посетить Select Case Statement, тем не менее, дайте мне знать о любом вопросе, который может возникнуть в отношении кода.

Sub Search_NonBlank_Cells() 
Dim Rng As Range 
Dim rCll As Range 

    Rem Set Range 
    Set Rng = ActiveSheet.Range(kRng) 

    Rem Ensure blank intended cells are actually blank 
    Rng.Value = Rng.Value2 

    Rem Loop Through Non-Blank Cells Only 
    For Each rCll In Rng.SpecialCells(xlCellTypeConstants, _ 
     xlErrors + xlLogical + xlNumbers + xlTextValues) 

     Rem Validate if cell value starts with "center" 
     If Left(rCll.Value2, 6) = "center" Then 
      Rem Validate if remaining cell value is between 1 to 54 
      Select Case Application.Substitute(rCll.Value2, "center", "") 
      Case 1 To 54 
       Rem Process Cell Found 
       rCll.Interior.Color = RGB(255, 255, 0) 

    End Select: End If: Next 

End Sub 

Это та же процедура, что и некоторые строки, которые помогут вам отлаживать и понимать процесс, а также создает журнал в непосредственном окне.

Sub Search_NonBlank_Cells_Debug() 
Dim Rng As Range 
Dim rCll As Range 

: SendKeys "^g^a{DEL}": Stop 
: Debug.Print vbLf; Now 
: Debug.Print "Address"; Tab(11); "Cll.Value"; Tab(31); "Status" 

    Rem Set Range 
    Set Rng = ActiveSheet.Range(kRng) 

    Rem Ensure blank intended cells are actually blank 
    'i.e. Cells with formulas results as "" are not blank cell this makes then blank cells 
    Rng.Value = Rng.Value2 

    Rem Loop Through Non-Blank Cells Only 
    For Each rCll In Rng.SpecialCells(xlCellTypeConstants, _ 
     xlErrors + xlLogical + xlNumbers + xlTextValues) 

: Debug.Print rCll.Address; Tab(11); rCll.Value2; 

     Rem Validate if cell value starts with "center" 
     If Left(rCll.Value2, 6) = "center" Then 
      Rem Validate if remaining cell value is between 1 to 54 
      Select Case Application.Substitute(rCll.Value2, "center", "") 

      Case 1 To 54 
       Rem Process Cell Found 
: Debug.Print Tab(31); "Processed" 
       rCll.Interior.Color = RGB(255, 255, 0) 

      Case Else 
: Debug.Print Tab(31); "Skipped" 

      End Select 
     Else 
: Debug.Print Tab(31); "Skipped" 

    End If: Next 

End Sub 
+0

Я не думаю, что это просто Center1 to Center54 ... –

+1

Спасибо @DirkReichel. Я получил это из комментариев OP. Если это так, то будет более эффективно иметь ожидаемые значения, перечисленные в листах, и сравнить их с этим диапазоном. Также требуется знать, нужно ли искать целые или частичные значения в ячейках. Op просто сообщит нам, чтобы настроить процедуру. – EEM

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