2016-07-29 3 views
0

이 코드를 실행할 때마다 계속 오류가 발생합니다. 오류는 1004 런타임 오류입니다. 내 코드가 잘못 된 부분을 찾아 내도록 도와주세요. 나는 VBA 완전히 새로운 오전하지만 난 파이썬과 C.VBA 프로젝트의 런타임 오류

Option Explicit 

Sub Experiment() 

    Dim m1 As Worksheet 
    Set m1 = ThisWorkbook.Worksheets("Sheet1") 

    Dim col As Integer 
    Dim row As Integer 

    Dim initial As Double 

    Dim s1 As Double 
    Dim s1_pos As Integer 
    Dim s2 As Double 
    Dim s2_pos As Integer 

    Dim min As Double 
    Dim candidate As Double 
    Dim temp_swap As Double 

    Dim r As Integer 

    col = 2 
    'For col = 2 To 18 Step 3 
    For row = 5 To 47 Step 2 
     initial = m1.Cells(row, col).Value 
     s1 = m1.Cells(row + 1, col).Value 
     s1_pos = row + 1 
     min = Abs(36 - (initial + s1)) 
     r = row + 1 

     Do While r < 49 
      s2 = m1.Cells(r, col).Value 
      candidate = Abs(36 - (initial + s2)) 
      If candidate < min Then 
       min = candidate 
       s2_pos = r 
      End If 
      r = r + 1 
     Loop 

     temp_swap = s1 
     m1.Cells(s1_pos, col).Value = s2 
     m1.Cells(s2_pos, col).Value = temp_swap 

    Next row 

End Sub 
+0

@ 줄 오류가 발생했는지 지정하십시오. 당신도 시트 샷을 Excel에서 공유 할 수 있다면 좋을까요 – Siva

+0

@Kurst 달성하려는 것은 무엇입니까? 왜냐하면 당신의'While' 루프가 이상적이지 않은 것처럼 보이기 때문에 동적 범위에 의존하는 최소값을 찾고 있습니까? 이 경우에는 'Min'과'Match '를 사용할 수 있습니다. –

+0

@Siva m1.Cells (s2_pos, col) .Value = temp_swap, snippet 도구가 작동하지 않습니다.'( – Kurst

답변

1
을 사용하는 방법을 알고

나는 candidate < min이 결코없는 경우이 발생할 수있는 코드에서 0으로 하나 s2_pos 또는 col를 설정하여 문제를 복제 할 수 있었다 사실, 결과적으로 s2_pos은 결코 설정되지 않습니다.

F8을 사용하여 코드를 단계별 실행하여 데이터에서이 시나리오에 어떻게 도달하는지 이해하는 것이 좋습니다.

해결 방법으로 앞에 s2_pos = 0을 입력 한 다음 아래 문장에 마지막 몇 줄을 두십시오.

If s2_pos <> 0 then 
    temp_swap = s1 
    m1.Cells(s1_pos, col).Value = s2 
    m1.Cells(s2_pos, col).Value = temp_swap 
End If 
+0

피드백에 감사드립니다 게리! :) – Kurst

0

(I 테스트) 아래의 코드는, 5 ~ 48 (코드처럼) 행을 통해 루프, 그리고 (행 당) 가장 적합한 커패시터 (함께 그들이 36에 가장 가까운 값이) 찾습니다. 코드를 약간 수정하여 실행 속도를 높이고 쉽게 따라갈 수 있다고 생각합니다.

아래의 스크린 샷은 내 데모에있어 결과를 보여줍니다 여기에 enter image description here

(열 C 가장 일치와 커패시터의 행 번호를 가져옵니다을 열 D는 커패시터 값을 보여줍니다) 코드는

Option Explicit 

Sub Experiment() 

Dim m1 As Worksheet 
Set m1 = ThisWorkbook.Worksheets("Sheet1") 

Dim col As Integer 
Dim row As Integer 
Dim i As Integer 

Dim Capacitor_Val   As Double 
Dim Current_Rng    As Range 
Dim Row_Found    As Long 
Dim Minimum_Gap    As Double 

col = 2 

For row = 5 To 47 
    ' just a high value to reset this flag 
    Minimum_Gap = 3 
    For i = row + 1 To 48 
     If Abs(36 - (m1.Cells(i, col) + m1.Cells(row, col))) < Minimum_Gap Then 
      Minimum_Gap = Abs(36 - (m1.Cells(i, col) + m1.Cells(row, col))) 
      Row_Found = i 
      Capacitor_Val = m1.Cells(i, col) 
     End If 
    Next i  

    m1.Cells(row, col + 1).Value = Row_Found 
    m1.Cells(row, col + 2).Value = Capacitor_Val 

Next row 

End Sub 
+0

헤이 샤이, 후속 조치에 정말 고마워.정말 도움이 :) – Kurst

+0

@ Kurst 당신을 환영합니다, 당신을 도운다면 upvote 자유롭게 –