2016-07-29 3 views
0

Я всегда получаю сообщение об ошибке при запуске этого кода. Ошибка - 1004 ошибка времени выполнения. Пожалуйста, помогите мне выяснить, где мой код поступил не так. Я новичок в VBA, но я знаю, как использовать Python и 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', кажется, не идеален, вы ищете минимальное значение, которое зависит от динамического диапазона? В этом случае вы можете использовать 'Match' с' Min' –

+0

@Siva m1.Cells (s2_pos, col) .Value = temp_swap, извините, что инструмент фрагмента не работает: '( – Kurst

ответ

1

Я был в состоянии воспроизвести проблему, установив либо s2_pos или col на 0. В коде это будет происходить, если candidate < min никогда не было true, так как результат будет таким, что s2_pos никогда не будет установлен.

Я бы предложил перейти через ваш код с помощью F8, чтобы понять, как вы добираетесь до этого сценария в своих данных.

В качестве обходного пути разместите s2_pos = 0 до Do While r < 49, а затем заверните последние несколько строк в приведенном ниже описании.

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

Приведенный ниже код (который я проверил), петли через ряды от 5 до 48 (например, в коде), и находит (для каждой строки) наиболее подходящий конденсатор (вместе они имеют значение ближе к 36). Я внес некоторые изменения в код, чтобы он работал быстрее, и я думаю, вам будет легче следовать.

скриншоте ниже показаны результаты, которые я получил на моем демонстрационном (Колонка C получает номер строки конденсатора с лучшим матчем Колонка D показывает, что значение конденсатора) enter image description here

Здесь является кодом:

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, которого вы приветствуете, не стесняйтесь, если это поможет вам –