2014-07-05 32 views
0

我想知道是否有人会在下面的脚本中建议对指定行进行一些更正。 这是投掷“对象变量或块变量未设置”警报。 我只能猜测这意味着“CellFound”范围没有被设置,并且问题在于该行。 “CellFound”变量旨在查找并存储DateRng中的cell.value < = 25的位置,以供下列条件使用查找并存储单元格地址值<= x

要重新迭代,整个脚本将执行以下任务:

  1. 找到位于该范围内的细胞(ⅰ)内包含的特定字符串2个细胞(DateRng)

  2. 环路之间的范围内具有一个值< = 25

  3. 比较两个与“i”偏移的其他单元格

  4. 将以“i”为中心的行的范围导出到不同的工作表,以等待上述条件的结果。

谢谢你的时间。

Sub ReportCells() 

Dim LR As Long, i As Long 
Dim j, k As Long 
Dim StartDate, FinishDate As String 
Dim Sh As Worksheet: Set Sh = Sheets("Full chart and primary cals") 
Dim CellFound As Range 

'Range Extraction Script 
'Search location and values 
LookupColumn = "B" 
StartDate = "2013.01.02 20:00" 
FinishDate = "2013.01.09 20:00" 
'Find Lower Limit 
For j = 1 To 30000 
    If Sh.Range(LookupColumn & j).Value = FinishDate Then FinishDateRow = j 
    Next j 
'Find Upper Limit 
For k = FinishDateRow To 1 Step -1 
    If Sh.Range(LookupColumn & k).Value = StartDate Then StartDateRow = k - 1 
    Next k 
'Set Range once located 
Dim DateRng As Range: Set DateRng = Sh.Range(LookupColumn & StartDateRow & ":" & LookupColumn & FinishDateRow) 
MsgBox DateRng.Address 

'Find Cell 
With DateRng 
    LR = Range("B" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     ** Set CellFound = .Find(Sh.Range("M:M").Value <= 25, LookIn:=xlValues) ** 
     MsgBox CellFound.Address 
     If Not CellFound Is Nothing And CellFound.Offset(0, -5).Value < CellFound.Offset(-1, -5).Value Then .Offset(-3, 0).Resize(10, 1).EntireRow.Copy Destination:=Sheets("DownT").Range("A" & Rows.Count).End(xlUp).Offset(2) 
     If Not CellFound Is Nothing And CellFound.Offset(0, -5).Value > CellFound.Offset(-1, -5).Value Then .Offset(-3, 0).Resize(10, 1).EntireRow.Copy Destination:=Sheets("UpT").Range("A" & Rows.Count).End(xlUp).Offset(2) 
    Next i 
End With 
End Sub 

编辑:单元格选择和复制块已被修改为下面的代码。看起来值< = 25设置范围命令没有执行,因为它们应该是。他们肯定会过滤数据,但是我不确定哪一列。该块返回正确大小的一系列单元格。但只有一个范围(而不是20左右)。而错行范围的:SI猜的任何进展都是进步,无论它是否是正确的或错误的

With Sheets("Full chart and primary cals") 
    LR = Range("B" & Rows.Count).End(xlUp).Row 
    'For i = Range("M" & Rows.Count).End(xlUp).Row To 1 Step -1 
    For i = 1 To LR 
     With DateRng.Range("M" & i) 
      If Range("M" & i).Value <= 25 Then Set CellFound = Sh.Range("M" & i) 
      If Not CellFound Is Nothing Then .Offset(-5, 0).Resize(10, 1).EntireRow.Copy Destination:=Sheets("DownT").Range("A" & Rows.Count).End(xlUp).Offset(2) 
    End With 
    Next i 
End With 
+0

哪条线特别竟然放弃了错误? – hnk

+0

对不起,我标记了它。今天必须一直在看屏幕太长:S 修改后的文章:行标为**** – user3180258

+0

嗨。 V.对于这个答案感到抱歉。巨大的错误理解。请忽略较早的'解决方案'并恢复原来的.Find()代码。我会稍后尝试发布修订后的解决方案。对不起,那 – hnk

回答

0

的解决问题的办法........

'Loop through sheet looking for cells 
    LR = .Range("B" & Rows.Count).End(xlUp).Row 
    For i = 10 To LR 
     'Find cells in "M" and store thier reference in Cellref 
     If .Range("M" & i).Value <= 25 Then Set Cellref = .Range("M" & i) Else Set Cellref = .Range("Z15") 
     'Find if Cell ref is contained within DateRange and store result as bool 
     If Not Application.Intersect(DateRange, Cellref) Is Nothing Then iSect = True Else iSect = False 
     'Output cell ranges to the appropriate sheets 
     If iSect = True And Cellref.Offset(0, -5) < Cellref.Offset(-10, -5) Then _ 
     Cellref.Offset(-3, 0).Resize(10, 1).EntireRow.Copy Destination:=Sheets("DownT").Range("A" & Rows.Count).End(xlUp).Offset(2) 
     If iSect = True And Cellref.Offset(0, -5) > Cellref.Offset(-10, -5) Then _ 
     Cellref.Offset(-3, 0).Resize(10, 1).EntireRow.Copy Destination:=Sheets("UpT").Range("A" & Rows.Count).End(xlUp).Offset(2) 
    Next i 
0

从我可以从你的代码告诉你滥用Range.Find()功能,这将很可能导致它返回Nothing而不是有意义的范围。

  • Sh.Range("M:M").Value将抛出一个类型不匹配错误,你不能使用Range包含多个小区的.Value财产。由于此错误包含在.Find函数的参数中,因此完全可能只是被忽略,但它仍然会导致.Find返回Nothing
  • 即使是该情况并非如此Sh.Range("A1") <= 25计算结果为TrueFalse(根据A1的值)和Find函数然后将搜索DateRng用于TrueFalse该范围内的第一个实例。

我推荐一些further reading关于Range.Find函数如何工作,因为它可能不适合您的任务。

+0

我不知道Find返回一个真/假值。我的印象是它会返回一个参考/范围。或者那是什么范围。 Range.find的一部分用于?无论如何,我解决了这个问题(以及周末后的一些问题),最终的解决方案粘贴在下面(没有任何.Find命令) – user3180258

+0

这不是说'Find'返回一个真或假的值,它是' <='是一个比较运算符,因此'Range(“”).Value <= 25'根据指定范围的值是否小于或等于25来计算真或假。因此'Find(Range “A1”)<= 25,...)如果A1的值小于或等于25,则将与“Find(True,...)”相同。 – Aiken

+0

感谢您花时间解释。你不仅改进了对VB函数和语法的基本理解,而且还了解了我发现的解决方案实际工作的原因。 – user3180258

相关问题