2016-07-16 11 views
1

私は現在、どのタイムスロットでスケジュールされているかを決定し、そのタイムスロットを別のシートに記録する簡単なマクロを作成しています。最後のタイムスロットにいる人の名前が最後のタイムスロットと比較されるまで、すべてがうまく動作します。この時点で、forループ "j"は-1になり、マクロはエラーになります。単純な入れ子ループfor 1004 error

私は以下の私の全体のコードが含まれているが、これは watchStation = ActiveSheet.Cells(j、k)があると、デバッガポイントというラインです.Valueの誰でも提供することができます任意の助け

Dim mySheet As Worksheet, masterSheet As Worksheet, myBook As Workbook 'Define your workbooks and worksheets as variables 

    Option Compare Text 'Makes string comparisons case IN-sensitive 

    Sub Watch_Bill() 

    Set myBook = Excel.ActiveWorkbook 
    Set masterSheet = Sheets("Musters") 
    MsgBox masterSheet.Name 

    Dim memberName, memberFirstWatch, memberSecondWatch As String 
    Dim lastRow As Integer 
    Dim watchStation, watch As String 

    lastRow = masterSheet.Range("A1").CurrentRegion.Rows.Count 
    'lastColumn = ActiveSheet.Range("A1").CurrentRegion.Columns.Count 

    'Cycle through each member of the duty section 
    For i = 2 To lastRow 
     memberName = masterSheet.Cells(i, 2).Value 

     'Cycle through watch bill to find member's watches 
     For j = 9 To 18  'Row 9 starts the section of the watchbill that contains watches 
      'MsgBox j 
      For k = 2 To 9 'Column 2 through 9 contain watches 
       watchStation = ActiveSheet.Cells(j, k).Value 

       'MsgBox watchStation 
       If InStr(watchStation, memberName) <> 0 Then 

        'Determine what watch station member is on 
        If j = 9 Or j = 10 Then 
         watch = "0700-1200" 
        ElseIf j = 11 Or j = 12 Then 
         watch = "1200-1700" 
        ElseIf j = 13 Or j = 14 Then 
         watch = "1700-2200" 
        ElseIf j = 15 Or j = 16 Then 
         watch = "2200-0200" 
        Else: j = 17 Or j = 18 
         watch = "0200-0700" 
        End If 
        'MsgBox "Found member" 

        'Check if member already had watch 
        If memberFirstWatch = "" Then 
         'MsgBox "member's first watch" 
         memberFirstWatch = watch 
        Else 
         'MsgBox "member's second watch" 
         memberSecondWatch = watch 
        End If 

        'Fill in member's watch times on muster sheet 
        masterSheet.Cells(i, 11).Value = memberFirstWatch 
        masterSheet.Cells(i, 12).Value = memberSecondWatch 
       End If 
      Next k 
     Next j 

     memberFirstWatch = "" 
     memberSecondWatch = "" 

    Next i 

    End Sub 

感謝。これは私をナットに押しつけているので、今何時間もそれを把握することはできませんでした。

+0

私は最後にElseを別のElseIfに変更する必要があると思います。今のようにjをTrueに設定しています(17 OR j = 18)。 –

答えて

1

ダグが正しい。私は何が起こっているのか説明しようとします。誰でも私を訂正してください。

ダグが指摘したように何Ifがないので、問題はライン

j = 17 Or j = 18 

で、VBAは今17 Or j = 18は何であるj

j = (17 Or j = 18) 

の割り当てとしてそれを評価しようとすると?その時点でjが18であるため、右側のj = 18Trueです。だから我々は

j = (17 Or True) 

今、私たちはanything Or Trueは常に真であると言うことができているが、我々は少し深く行くことができます。数字でOrをどのように使用しますか? 2進数のビット単位の比較を使用します。

00001011 
Or 00010010 
----------- 
= 00011011 

数字とブール値を扱うときも同様です。 Falseがすべて0として格納され、Trueがすべて1として格納され、NotAndOrXOrで必要な動作が得られます。例えば。 anything Or Trueは次のようになります。

1ビットのみを使用して、もちろん
xxxxxxxx 
Or 11111111 
----------- 
= 11111111 

も同じ挙動を示すだろうが、我々は1ビットのデータ・タイプを持っていません。したがって、17 Or j = 18Trueであり、これは11...11として格納され、整数として読み取ると-1となります。

データ型の異なるバイトサイズは無視されています。

VBAは暗黙的に変換されますが、特に数字の場合は<->文字列の方がいいかもしれませんが、コードの後半で明らかになる問題が発生する可能性があります。 例えば、誤って数字を文字列として保存し、それを実際の数字に追加すると文字列が変換されます。ただし、2つの数値文字列を追加するとそれらを連結します。

+1

これは私があなたを愛する理由です。あなたは正解を非常に迅速に提供するだけでなく、それがなぜそれなのかを説明する時間も費やします。スーパーシンプルな修正を私は行くつもりはないだろう。ありがとうございました! –

関連する問題