2016-05-23 2 views
0

Я пытаюсь создать vba формулу для двух диапазонов в одном наборе данных, как входные переменные lastRow и lastRow2. Однако, когда я пытаюсь создать и вычислить формулу, вместо того, чтобы получить значение последней ячейки, я получаю нуль. Оскорблять код ниже:Excel VBA- Динамическая формула, возвращающая нулевое значение для диапазона

Dim lastRow As Long 
Dim lastRow2 As Long 
    lastRow = Range("A" & Rows.Count).End(xlUp).Row 
    lastRow2 = Range("M" & Rows.Count).End(xlUp).Row 


... 



    'Calculate ATRT 2014 at cell B4 
    Range("B6").Formula = "=(SUM(J11:J" & lastRow & ")/ SUM(I11:I" & lastRow & "))" 
    Range("E6").Formula = "=(SUM(U11:U" & lastRow2 & ")/ SUM(T11:T" & lastRow2 & "))" 
    Range("H6").Formula = "=E6-B6" 

Запуск этого получает две формулы: = (SUM (J11: J0)/сумма (I11: I0)) и = (SUM (U11: U0)/SUM (T11: T0)) , Почему конец диапазона равен нулю ???

+1

Хе-хе, вот что я задал в другом вопросе. Все ли диапазоны на одном листе? – findwindow

+0

Да, диапазоны находятся на одном листе, в той же таблице. 1 таблица, но два разных диапазона –

+0

Хм, вы работаете с макросом, пока активна личность? Если так, то я в тупике. Если вы на самом деле не имели в виду столбцы A/M ... Edit: huh. Даже если столбец пуст, он все равно должен быть не менее 1 .... нам нужно больше кода. – findwindow

ответ

0

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

Dim lastRow As Long 
Dim lastRow2 As Long 
Dim ws As Worksheet 

Set ws = ActiveSheet 
lastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row 
lastRow2 = ws.Range("M" & ws.Rows.Count).End(xlUp).Row 


'... 



'Calculate ATRT 2014 at cell B4 
ws.Range("B6").Formula = "=(SUM(J11:J" & lastRow & ")/ SUM(I11:I" & lastRow & "))" 
ws.Range("E6").Formula = "=(SUM(U11:U" & lastRow2 & ")/ SUM(T11:T" & lastRow2 & "))" 
ws.Range("H6").Formula = "=E6-B6" 
+0

Вот что я подумал, прежде чем я понял, что это должно закончиться хотя бы 1. Что-то еще происходит. – findwindow

+1

Да, я думал, что 0 тоже странно. Но когда я действительно запускал этот код, он возвращался правильно. Не имея реальной книги, трудно сказать, что происходит. Один из вариантов, который может попросить обследователю, - посмотреть, что этот диапазон считает родительским: 'debug.print Range (« M »& Rows.Count) .End (xlUp) .parent.name' и посмотреть, действительно ли это тот рабочий лист, который они считают должен быть. –

+0

Только что проверено, это тот же рабочий лист. Я попробовал запустить его обратно назад со старым кодом (не внося изменения, перечисленные выше), и первая формула (выводящая на B6) работает, но вторая формула (выводящая на E6) не имела и имеет ту же ошибку. Проблема, похоже, связана с lastRow2, так как попытка автозаполнения к ней ведет вверх. –

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