2016-07-29 19 views
0

このコードを実行するたびにエラーが発生します。エラーは1004ランタイムエラーです。私のコードがどこに間違っているのか理解してください。私はcandidate < minがなかった場合、これが発生するあなたのコードでは0にs2_posまたはcolのいずれかを設定することで、問題を再現することができました 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

どのような行エラーがスローされますかを指定してください。あなたが達成するためにしようとしている@ Kurst – Siva

+0

も同様にシートショットをExcelを共有することができれば素晴らしいだろうか?あなたの 'While'ループは理想的ではないようですが、ダイナミックレンジに依存する最小値を探していますか?その場合、 'Min'と' Match'を使用することができます –

+0

@Siva m1.Cells(s2_pos、col).Value = temp_swap、すみませんがスニペットツールが動作しません: '( – Kurst

答えて

1

私はVBAには完全に新しいですが、私は、Pythonを使用する方法を知っているかとC.実際、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

あなたが歓迎して、 –

関連する問題