-2

タイムシートであるすべてのワークシートを取得し、それらを 1 つのワークシートに重ねて配置する vba コードがあります。名前、時間、パーセンテージの 3 つを取得する別のコードが必要です。最初の名前はセル「B6」で始まり、時間はセル「O47」、パーセンテージは「O48」です。名前、時間、パーセンテージの次の従業員情報はちょうど 100 行下にあるため、次の従業員情報は "B106"、"O147"、"O148" になります。ワークシートをループして Sheet1 と呼び、コードがセルが空白でリストの最後であることをコードが認識するまで、すべての従業員を取得するコードが必要です。

Sub Macro4()
'
' Macro4 Macro
'

'
    Sheets("Sheet1").Select

    For Counter = 0 To 40
    With ActiveCell
    .Offset(Counter, 0) = "="

    Range("A2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[4]C[1]"
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[45]C[13]*Sheet1!R[46]C[13]/100"
    Range("C2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[46]C[12]"


    Range("A3").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[103]C[1]"
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[144]C[13]*Sheet1!R[145]C[13]/100"
    Range("C3").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[145]C[12]"

End Sub

6行を約30回繰り返す代わりに、効率的な方法はありますか? 場所の違いは、行とその 99 だけです (つまり、行が 4 から 103 にジャンプするのがわかります。counter を使用しようとしましたが、混乱しました。

最終的な解決策ありがとうマイク

Sub Macro1()
a = 1
lastrow = Worksheets("Sheet1").Cells(Rows.Count, 15).End(xlUp).Row
For i = 6 To lastrow Step 100
    Worksheets("Sheet2").Cells(a, 1) = Worksheets("Sheet1").Cells(i, 2)
    Worksheets("Sheet2").Cells(a, 2) = Worksheets("Sheet1").Cells(i + 41, 15)
    Worksheets("Sheet2").Cells(a, 3) = Worksheets("Sheet1").Cells(i + 42, 15)
a = a + 1
Next i
End Sub
4

1 に答える 1

1

できることの 1 つは、次のコードを使用して、最初に列 O の情報の最後の行を探すことです。

lastrow = Worksheets("Sheet1").cells(rows.count,15).end(xlup).row

これにより、情報を含む行をループできます。

for i = 6 to lastrow step 100
     ' grab the name in worksheets("Sheet1").cells(i,2) 
     ' grab the hours in worksheets("Sheet1").cells(i+41,15)
     ' and grab the percentage in worksheets("Sheet1").cells(i+42,15)
     ' saving these in the cells you wish
next i

最後の行を最初に決定することにより、ループを通過するときに、情報を含む最後の行で終了することが保証されます。

お役に立てれば!

于 2013-10-10T17:24:21.007 に答える