2015-08-08 7 views
0

Я думаю, что это больше проблема с опциями и другими вещами, но я не уверен. Описание моего кода: для получения временных рядов данных, записанных на первых вкладках 8-9 на листе (каждая вкладка - это другой индикатор) и отображает ее в строке так, чтобы вместо данных, которые записывались как в формате временного ряда (От 1-1-2000 до 1-1-2015 для каждого индикатора) все индикаторы (с тремя задержками, а также 7 задержек вперед для вкладки GGR) записываются на определенную дату подряд. Вот мой код:Мой код выходит сразу

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. Я запустил другие простые простые операторы печати строк, и это работает. Я также попытался скопировать и вставить его в другое превосходство, и это не имело никакого значения. Спасибо за вашу помощь,

Cameron

+0

К сожалению, по-видимому, я ужасно форматированием для переполнения стека (мой первый пост, хотя я посещаю сайт часто) Это часть кода: Sub материал () 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, отсортированный как Variant, loc As Целое число Строка = 2 И нет >>> после rng5 Как – 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», он работает по какой-то причине. Теперь все еще есть ошибки с линейным поиском, возвращающим нуль, как кто-то упоминал, хотя он не должен, потому что значения, которые он ищет во всех, являются датами, и я буферизую все начальные строки нулями, но это ошибка, с которой я могу справиться. Спасибо за помощь каждого,

Cameron

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