2015-08-08 239 views
0

我认为这是更多的问题与Excel选项和东西,但我不知道。我的代码的描述:它需要在工作表中的前8-9个选项卡中写入时间序列数据(每个选项卡都是不同的指示符),并将其显示在一行中,以便不像时间序列格式那样写入数据(每个指标1-1-2000至1-1-2015)所有指标(有三个滞后以及GGR选项卡的7个正向滞后)是针对给定日期连续写的这里是我的代码:我的代码立即退出

Sub stuff() 

    Dim rng1 As Range, rng2 As Range, rng3 As Range, rng4 As Range, rng5 As Range, rng6 As Range, rng7 As Range, rng8 As Range 
    Dim datenum As Long, Row As Integer, sorteddate As Variant, loc As Integer 

    Row = 2 

    For j = 2 To 53 
     For i = 8 To 275 
      If Not (IsEmpty(Cells(i, j).Value)) Then 
       Sheets("Sheet1").Cells(Row, 8) = Sheets("GGR").Cells(i - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 9) = Sheets("GGR").Cells(i - 2, j).Value 
       Sheets("Sheet1").Cells(Row, 10) = Sheets("GGR").Cells(i - 3, j).Value 
       Sheets("Sheet1").Cells(Row, 29) = Sheets("GGR").Cells(i, j).Value 
       Sheets("Sheet1").Cells(Row, 30) = Sheets("GGR").Cells(i + 1, j).Value 
       Sheets("Sheet1").Cells(Row, 31) = Sheets("GGR").Cells(i + 2, j).Value 
       Sheets("Sheet1").Cells(Row, 32) = Sheets("GGR").Cells(i + 3, j).Value 
       Sheets("Sheet1").Cells(Row, 33) = Sheets("GGR").Cells(i + 4, j).Value 
       Sheets("Sheet1").Cells(Row, 34) = Sheets("GGR").Cells(i + 5, j).Value 
       Sheets("Sheet1").Cells(Row, 35) = Sheets("GGR").Cells(i + 6, j).Value 
       Sheets("Sheet1").Cells(Row, 36) = Sheets("GGR").Cells(i + 7, j).Value 
       datenum = Sheets("GGR").Cells(i, 1).Value 
       Sheets("Sheet1").Cells(Row, 1).Value = datenum 
       Set rng1 = Sheets("CPIC").Range("A1:A408") 
       sorteddate = rng1.Value 
       loc = BinarySearch(rng1, datenum) 
       Sheets("Sheet1").Cells(Row, 2) = Sheets("CPIC").Cells(loc, j).Value 
       Sheets("Sheet1").Cells(Row, 3) = Sheets("CPIC").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 4) = Sheets("CPIC").Cells(loc - 2, j).Value 

       Set rng2 = Sheets("GBGT").Range("A1:A71") 
       sorteddate = rng2.Value 
       loc = BinarySearch(rng2, datenum) 
       Sheets("Sheet1").Cells(Row, 5) = Sheets("GBGT").Cells(loc, j).Value 
       Sheets("Sheet1").Cells(Row, 6) = Sheets("GBGT").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 7) = Sheets("GBGT").Cells(loc - 2, j).Value 

       Set rng3 = Sheets("GFCF").Range("A5:A264") 
       sorteddate = rng3.Value 
       loc = BinarySearch(rng3, datenum) 
       Sheets("Sheet1").Cells(Row, 11) = Sheets("GFCF").Cells(loc, j).Value 
       Sheets("testsheet").Cells(1, 1).Value = loc 
       Sheets("Sheet1").Cells(Row, 12).Value = Sheets("GFCF").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 13).Value = Sheets("GFCF").Cells(loc - 2, j).Value 

       Set rng4 = Sheets("M1").Range("A1:A700") 
       sorteddate = rng4.Value 
       loc = BinarySearch(rng4, datenum) 
       Sheets("Sheet1").Cells(Row, 14) = Sheets("M1").Cells(loc, j).Value 
       Sheets("Sheet1").Cells(Row, 15) = Sheets("M1").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 16) = Sheets("M1").Cells(loc - 2, j).Value 

       Set rng5 = Sheets("M2").Range("A1:A676") 
       sorteddate = rng5.Value 
       loc = BinarySearch(rng5, datenum) 
       Sheets("Sheet1").Cells(Row, 17) = Sheets("M2").Cells(loc, j).Value 
       Sheets("Sheet1").Cells(Row, 18) = Sheets("M2").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 19) = Sheets("M2").Cells(loc - 2, j).Value 

       Set rng6 = Sheets("CSP").Range("A1:A264") 
       sorteddate = rng6.Value 
       loc = BinarySearch(rng6, datenum) 
       Sheets("Sheet1").Cells(Row, 20) = Sheets("CSP").Cells(loc, j).Value 
       Sheets("Sheet1").Cells(Row, 21) = Sheets("CSP").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 22) = Sheets("CSP").Cells(loc - 2, j).Value 

       Set rng7 = Sheets("UNR").Range("A1:A272") 
       sorteddate = rng7.Value 
       loc = BinarySearch(rng7, datenum) 
       Sheets("Sheet1").Cells(Row, 23) = Sheets("UNR").Cells(loc, j).Value 
       Sheets("Sheet1").Cells(Row, 24) = Sheets("UNR").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 25) = Sheets("UNR").Cells(loc - 2, j).Value 

       Set rng8 = Sheets("MKT").Range("A1:A223") 
       sorteddate = rng8.Value 
       loc = BinarySearch(rng8, datenum) 
       Sheets("Sheet1").Cells(Row, 26) = Sheets("MKT").Cells(loc, j).Value 
       Sheets("Sheet1").Cells(Row, 27) = Sheets("MKT").Cells(loc - 1, j).Value 
       Sheets("Sheet1").Cells(Row, 28) = Sheets("MKT").Cells(loc - 2, j).Value 
       Row = Row + 1 
      End If 
     Next i 
    Next j 
End Sub 


Function BinarySearch(rng As Range, searchValue As Long) As Integer 

    'dimension these as long to avoid possible integer 
    'overflow errors for large lists 
    Dim curIndex As Long 
    Dim firstIndex As Integer 
    Dim lastIndex As Integer 

    Dim nextMiddle As Long 
    Dim strValue As Long 
    Dim MyCell As Variant 
    Dim i As Integer 

    i = 0 

    For Each MyCell In rng 
     If MyCell < searchValue Then 
      i = i + 1 
     End If 
    Next MyCell 

    BinarySearch = i 

End Function 

我知道我的代码不是最高效的,我很快编写代码,而且不是VBA中知识最丰富的代码。我也尝试二分搜索,而不是线性搜索,但我一直在获取错误,所以我只是使用线性搜索,因为速度不是问题。无论如何,当我尝试运行我的代码时,偶尔(即每20次尝试一次)就会运行并出现错误。这个错误并不是我所关心的。但是,当我通常运行它不会运行。我花了大约30分钟让调试器向我显示运行时错误。当我按下VBA上的运行按钮时,通常它会退出。我尝试了一下,它突出显示了第一行(sub stuff()),然后代码退出而不通过代码的其余部分。我已经尝试允许在Excel中使用宏。我已经运行其他代码简单的1行打印语句,并且工作。我也尝试复制并粘贴到不同的excel中,这没有什么区别。感谢您的帮助,

卡梅伦

+0

对不起显然我在格式化堆栈溢出可怕的(我的第一篇文章,虽然我经常访问的网站) 这是代码的一部分: 子的东西( ) Dim rng1 As Range,rng2 As Range,rng3 As Range,rng4 As Range,rng5 As Range,rng6 As Range,rng7 As Range,rng8 As Range Dim datenum As Long,Row As Integer,sorteddate As Variant,loc As整数 行= 2 并且在rng5之后没有>>> As – www3

+0

当y ou正在使用代码'If Not(IsEmpty(Cells(i,j).Value))''Cells(i,j)'是指什么工作表?几乎所有其他[Range.Cells属性](https://msdn.microsoft.com/en-us/library/office/ff196273.aspx)引用都有父级工作表,但是这不是。也许它引用了错误的工作表,并且每个单元都被认为是空的。 – Jeeped

+0

如果找不到项目BinarySearch正在返回您正在用作行号的零。因此,您需要测试BinarySearch是否在您将其用作行号之前返回零。 – jdweng

回答

0

我会Jeeped在这条线达成一致:

If Not (IsEmpty(Cells(i, j).Value)) Then 

您应该引用单元格中提及引用表。否则,Excel将默认为活动工作表,因此如果您在工作表之间切换,则参考将无法按预期工作。

+0

修正了很好的结果,可能有助于解决我遇到的错误,但仍然无法分辨,因为代码仍然无法运行。我应该补充,如果有语法错误,vba会捕获它并告诉我,但是一旦它运行语法错误,它就会立即退出。 – www3

0

是的我想通了,至少想出了一个解决方法。出于某种原因,当活动工作表是“Sheet1”时,我的代码将无法运行。当我制作活动工作表“MKT”时,出于某种原因起作用。现在仍然有线性搜索返回零的错误,正如某人提到的那样,尽管它不应该是因为它所搜索的值都是日期,而且我用零填充了所有的初始字符串,但这是一个我可以处理的错误。感谢大家的帮助,

卡梅伦