2013-09-24 4 views
0

G'day,Ошибка выполнения при использовании варианта массива в Excel 2010 VBA

Я искал высоко и низко для решения этой проблемы, так что надеюсь, кто-то здесь будет знать, что происходит!

Код, который у меня есть, приведен ниже. Я понимаю, что мне нужно определить i и n как Long, поскольку они используют вариант массива? На данный момент я получаю «Ошибка выполнения„1004“: Application или объекта определенные ошибки» Ошибка после строки:

If Cells(i, m) < Cells(i, (m-1)) Then 

Я попытался заменить я и м переменные целые числа, только для целей тестирования, но проблема сохраняется. Зная меня, я неправильно отложил: |

Option Explicit 

Public Sub Show_Arrows() 

Dim i As Integer 
Dim n As Integer 
Dim m As Integer 

Dim Increasing() As Variant 
Dim Decreasing() As Variant 

Decreasing = Array(10, 11, 16, 17, 18, 19) 

Increasing = Array(12, 13, 22, 25, 26, 31, 32, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 50, 51, 52, 55, 58) 

m = (Month(Date) - 4) 

For i = LBound(Decreasing) To UBound(Decreasing) 
    Cells(i, 16).Select 
    If Cells(i, m) < Cells(i, (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic Programming\Arrows - Vanessa\Green.png").Select 
    ElseIf Cells(i, m) > Cells(i, (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic Programming\Arrows - Vanessa\Red.png").Select 
    End If 
Next 

For n = LBound(Increasing) To UBound(Increasing) 
    Cells(n, 16).Select 
    If Cells(n, m) > Cells(n, (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic  Programming\Arrows - Vanessa\Green.png").Select 
    ElseIf Cells(n, m) < Cells(n, (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic Programming\Arrows - Vanessa\Red.png").Select 
    End If 
Next 

End Sub 
+0

Я не уверен, как вы даже дошли до этой строки, если вы не указали иначе, 'i' будет равно 0, поэтому' Cells (i, 16) 'даст ошибку 1004. Следует учитывать, что вы объявляете 'Increasing' и' Decreasing' как массивы 'Variants', когда вы действительно хотите, чтобы они просто были« Variants ». И, просто из любопытства, каков ваш план избежать ошибок времени выполнения в первые четыре месяца года :)? –

+0

i начинается с нижней границы уменьшения, которая в этом случае равна 10, поэтому она не должна считаться 0? Я не думал так далеко, как первые четыре месяца в году ха-ха! Я адаптирую существующую таблицу для коллеги, и она до сентября, которая находится в столбце F ... – jars121

+1

Lbound (Уменьшение) - 0. Уменьшение (0) равно 10. Вы должны сделать некоторое чтение об этом. Он окупится. –

ответ

0

LBound (Уменьшение) - 0. Вы не можете выбрать ячейку с нулевым индексом. Вот почему запустите цикл For от 1 или измените код, чтобы избежать строк с индексом 0. Попробуйте этот код:

Option Explicit 
Public Sub Show_Arrows() 

Dim i As Integer 
Dim n As Integer 
Dim m As Integer 

Dim Increasing() As Variant 
Dim Decreasing() As Variant 

Decreasing = Array(10, 11, 16, 17, 18, 19) 

Increasing = Array(12, 13, 22, 25, 26, 31, 32, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 50, 51, 52, 55, 58) 

m = (Month(Date) - 4) 

For i = 1 To UBound(Decreasing) + 1 
    Cells(Decreasing(i - 1), 16).Select 
    If Cells(Decreasing(i - 1), m) < Cells(Decreasing(i - 1), (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic Programming\Arrows - Vanessa\Green.png").Select 
    ElseIf Cells(Decreasing(i - 1), m) > Cells(Decreasing(i - 1), (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic Programming\Arrows - Vanessa\Red.png").Select 
    End If 
Next 

For n = 1 To UBound(Increasing) + 1 
    Cells(Increasing(n - 1), 16).Select 
    If Cells(Increasing(n - 1), m) > Cells(Increasing(n - 1), (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic Programming\Arrows - Vanessa\Green.png").Select 
    ElseIf Cells(Increasing(n - 1), m) < Cells(Increasing(n - 1), (m - 1)) Then 
     ActiveSheet.Pictures.Insert("C:\Users\jamie.rosssmith\Documents\Visual Basic Programming\Arrows - Vanessa\Red.png").Select 
    End If 
Next 


End Sub 
+0

Насколько я понял, LBound (Decreasing) равен 10, так как это самое низкое число в массиве? Я никогда раньше не использовал массивы в VB, поэтому мое понимание может быть полностью отключено ... – jars121

+0

Кажется, мое понимание было выключено. Имеются ли границы, относящиеся к содержимому массива, а не к их значениям? То есть. Уменьшение (0) = 10, уменьшение (1) = 11 и т. Д.? Если это так, то я могу понять, почему я получаю ошибку. Есть ли лучший способ добиться того, что мне нужно? Благодаря! – jars121

+0

Да, вы правы Уменьшение (0) = 10, Уменьшение (1) = 11. Я не вижу, где вы используете значения массива. Поэтому вы можете просто использовать для i = 1-6. Поправьте меня, если я вас неправильно понял. – user1429899

0

Если не указано вами индекс массива начинается с нуля. Чтобы гарантировать, что он начинается с 1, добавьте оператор Option Base 1 под Option Explicit.

Далее, несколько досадно, Excel не понимает ячейки. Он понимает рабочие листы или ячейки диапазона. Для работы с ячейками объявляйте переменную рабочего листа или диапазона и присваивайте ей значение. Например, Dim wks как рабочий лист. Установите wks = thisworkbook.worksheets ("Sheet1").

Когда вы используете массив, я всегда буду использовать оператор Redim при инициализации его размера. Ваш код для одного из ваших массивов уменьшается = array(). Мой сказал бы, что Redim убывает() = array().

Хотя вы можете импортировать изображение с использованием подхода, который вы закодировали, вряд ли он окажется в конкретной ячейке, которую вы желаете.

Таким образом, если вы можете, переоцените свой подход и подумайте, нет ли другого способа добиться желаемого результата.

+0

Спасибо за совет :) Вы абсолютно правы в импорте изображения, они совсем не находятся в желаемых ячейках. Вы знаете лучший способ сделать это? Если я удаляю массив из кода и просто перебираю цикл If Then ElseIf над целыми числами (т. Е. От i = 10 до 20), изображения заполняют правильные ячейки ... – jars121

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