2017-01-27 9 views
0

私はかなりシンプルなはずだと感じている問題を抱えていますが、それはうまく動作しません。私はそれが私がやっていることだと確信していますが、私はあなたの専門家の助けが必要です。私は単にデータテーブルを循環し、データテーブルの別の列に値が再び現れているかどうかを確認しています。何らかの理由でBOTHステートメントが実行され、elseステートメントがIfステートメントを上書きしています。ブロックがIfとElseステートメントの両方を実行している場合

For i = 0 To length - 1 
     For j = 0 To length - 1 
      If Trim(dt.Rows(i)(0)) = Trim(dt.Rows(j)(6)) Then 
       need_dt.Rows(i)(9) = "COMP" 
       need_dt.Rows(i)(10) = Format(resource.AddWorkingDays(need_dt.Rows(i)(2), -5), "MM/dd/yy") 
      Else 
       need_dt.Rows(i)(9) = "TOP" 
       need_dt.Rows(i)(10) = Format(resource.AddWorkingDays(need_dt.Rows(i)(2), -16), "MM/dd/yy") 
      End If 
      If Year(need_dt.Rows(i)(10)) = 2029 Then need_dt.Rows(i)(10) = Format(resource.AddWorkingDays(Now, 14), "MM/dd/yyyy") 
     Next 
    Next 
+0

ようこそ!サンプルデータも投稿できますか?できるだけループごとに読みやすくするために、インデックスを使用して列にアクセスする代わりに、列名を使用します。たとえば、myRow( "myColumn")です。データテーブル内の行を検索するには、[select-method](https://msdn.microsoft.com/en-us/library/det4aw50(v = vs.110).aspx)またはLinq。 – Esko

+0

私が最初に推測したのは、 'j 'の反復の1つで、' Trim(dt.Rows(i)(0)) '<>' Trim(dt.Rows(j)(6)) 'もう一方は両方とも "発火"するように見える – OSKM

+0

内側のループをFor j = i + 1のようにしてみてください。長さ-1にしてください。 –

答えて

0

いずれの行の列6にも列0の値が存在する場合は、列番号9 = "COMP"を設定することを理解しています。

あなたの問題がある。この場合

- >最後の行の列6の最後の値が列1の値と等しくない場合 - 9欄の値が「TOP」で上書きされます、あなたが必要とするあなたのコードで

等しい値を見つけたらループから抜けてください。

しかし、私は

For Each row As DataRow in need_dt.Rows 
    Dim firstColumnValue As String = row.Field(Of String)("0ColumnName").Trim() 

    Dim is6ColumnContainValue As Func(Of DataRow, Boolean) = 
     Function(dtRow) dtRow.Field(Of String)("6ColumnName").Trim() = firstColumnValue 

    Dim isValueFound = need_dt.AsEnumerable().Any(is6ColumnContainValue) 

    Dim tenthColumnValue AS Date = row.Field(Of Date)("10ColumnName") 
    Dim workingDaysToAdd As Integer 

    If IsValueFound = True Then 
     row.SetField("9ColumnName", "COMP") 
     workingDaysToAdd = -5 
    Else 
     row.SetField("9ColumnName", "COMP") 
     workingDaysToAdd = -16 
    End If   

    If TenthColumnValue.Year = 2029 Then 
     tenthColumnValue = resource.AddWorkingDays(Date.Now, 14) 
    Else 
     tenthColumnValue = resource.AddWorkingDays(tenthColumnValue, workingDaysToAdd) 
    End If 

    row.SetField("10ColumnName", tenthColumnValue) 
Next 

少し落札より読みやすいアプローチを使用することをお勧めまた、else文は、そのすべての行で実行される可能型変換エラーに関する時間フィードバックをコンパイルするに

+0

ありがとうございました。私はそれが私には明らかな何かを見逃していたことは分かっていた応答する時間をとっていただきありがとうございます。 – Jmoran

2

を与えるOption Strict Onを設定することをお勧めが見つかりません。結果を変数に保存し、最後に必要なアクションを実行する必要があります。他のIf文はjを使用しないので、jごとに実行する必要はありません。

For i = 0 To length - 1 
     Dim isFound As Boolean = False 

     For j = 0 To length - 1 
      If Trim(dt.Rows(i)(0)) = Trim(dt.Rows(j)(6)) Then 
       isFound = True 
       Exit For 
      End If 
     Next 

     If isFound Then 
      need_dt.Rows(i)(9) = "COMP" 
      need_dt.Rows(i)(10) = Format(resource.AddWorkingDays(need_dt.Rows(i)(2), -5), "MM/dd/yy") 
     Else 
      need_dt.Rows(i)(9) = "TOP" 
      need_dt.Rows(i)(10) = Format(resource.AddWorkingDays(need_dt.Rows(i)(2), -16), "MM/dd/yy") 
     End If 


     If Year(need_dt.Rows(i)(10)) = 2029 Then need_dt.Rows(i)(10) = Format(resource.AddWorkingDays(Now, 14), "MM/dd/yyyy") 
    Next 
関連する問題