2013-09-24 2 views
0

G'day에 변형 배열을 사용하여이런타임 오류, 엑셀 2010 VBA

그래서 희망 누군가가 여기에 무슨 일이 일어나고 있는지 알 방법이 문제에 대한 해결책에 대한 높고 낮은 검색했습니다!

코드는 다음과 같습니다. 내 이해는 배열 variant를 사용하기 때문에 long으로 i와 n을 정의해야한다는 것입니다. 지금이 순간, 내가받을거야 "런타임 오류 '1004': 응용 프로그램 정의 또는 개체 정의 오류"오류를 줄 뒤에 : 내가 가진 i와 m 변수를 대체하려고했습니다

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'오류를 생성합니다. 한가지 고려해야 할 점은 당신이 정말로 Variants가되기를 원할 때, 당신이'Variants'의 배열로서'Increasing'과'Decreasing'을 선언하고 있다는 것입니다. 그리고 호기심에서 벗어나 런타임 오류를 피하기위한 계획은 무엇입니까? –

+0

나는 Lower Band of Decreasing에서 시작합니다.이 경우 10입니다. 따라서 0으로 읽지 않아야합니까? 나는 haha의 년의 처음 4 달만큼 먼 앞서 생각하지 않고 있었다! 저는 동료를 위해 기존 스프레드 시트를 적용하고 있습니다. 그녀는 9 월에 열 F에 있습니다 ... – jars121

+1

0이 0입니다. 그것은 갚을 것이다. –

답변

0

LBound (감소)는 0입니다. 인덱스가 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

배열 색인은 0부터 시작합니다. Option Explicit 아래에 Option Base 1 문을 추가합니다.

다음으로, Excel은 셀을 이해하지 못합니다. 그것은 worksheet.cells 또는 range.cells를 이해합니다. 셀을 사용하여 작업하려면 워크 시트 또는 범위 개체 변수를 선언하고 값을 할당합니다. 예를 들어, 워크 시트로 Dim wks. wks = thisworkbook.worksheets ("Sheet1")을 설정하십시오.

배열을 사용할 때 크기를 초기화 할 때 항상 Redim 문을 사용합니다. 배열 중 하나에 대한 코드가 감소하고 있습니다 = array(). 내 말은 Redim reduce() = array()라고 말할 것입니다.

코딩 한 방법을 사용하여 그림을 가져올 수 있지만 원하는 특정 셀에 끝나지는 않습니다.

따라서 가능한 경우 접근법을 재평가하고 원하는 결과를 얻기위한 다른 방법이 없는지 고려하십시오.

+0

조언을 주셔서 감사합니다 :) 이미지를 가져 오는 것이 옳았습니다. 원하는 셀에 전혀 들어 있지 않습니다. 이 일을하는 더 좋은 방법을 알고 있습니까? 코드에서 배열을 제거하고 If Then ElseIf 루프를 정수 (예 : i = 10에서 20)로 반복하면 이미지에 올바른 셀이 채워집니다. – jars121