よくできました! を処理するコードを書いた月のシート!
さて、そのチャンクを取り、それをコピーする - そのように下にそれを貼り付けて"Feb"
で"Jan"
を交換しての... 12回....これを行う:
Private Sub UpdateMonthlyData(ByVal target As Worksheet)
End Sub
そして、そこにそれを貼り付け、 Sheets("Jan")
をtarget
に置き換えてください。あなたがこれを左にしている:
Private Sub UpdateMonthlyData(ByVal target As Worksheet)
Dim i, LastRow
LastRow = Sheets("Mainsheet").Range("A" & Rows.Count).End(xlUp).Row
For i = 5 To LastRow
If Sheets("Mainsheet").Cells(i, "E").Value = "1/20/2017" Then
Sheets("Mainsheet").Cells(i, "A").EntireRow.Copy
Destination:=target.Range("A" & target.Rows.Count).End(xlUp).Offset(1)
End If
Next i
End Sub
は
のは、少しこれをクリーンアップしてみましょう - プロジェクトエクスプローラます(Ctrl + R - Rubberduckとコードエクスプローラが表示されます)にMainsheet (Sheet1)
オブジェクトをダブルクリックして、 F4キーを押してプロパティを表示します。 (Name)
プロパティをSheet1
からMainSheet
に変更します。 - VBAは、それにちなんで名付けられたグローバルスコープのオブジェクトを作成し、あなたはそれを使用することができます
Private Sub UpdateMonthlyData(ByVal target As Worksheet)
With MainSheet
Dim lastRow As Long
lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
Dim i As Long
For i = 5 To lastRow
If .Cells(i, "E").Value = #1/20/2017# Then
.Cells(i, "A").EntireRow.Copy target.Range("A" & target.Rows.Count).End(xlUp).Offset(1)
End If
Next
End With
End Sub
MainSheet
はあなたがMainSheet
にその(Name)
プロパティを設定することにより得た「自由」のグローバルスコープのオブジェクト変数です:今、あなたはこれを行うことができますどこでもを参照するコードでシート。
ここには何がありますか? monthSheet
というパラメータが、コピー先のシートになります。それは、それ自体の別の問題であることを認識しており、それを気にする必要はありません。宣言を使用する場所に近づけ、宣言に明示的な型を与えました。.
を使用するものはWith MainSheet
命令で修飾され、というオブジェクトのオブジェクトがすべて修飾されます。それは、明示的なワークシートの参照が先行していない場合は、Range
、Cells
、Rows
、Columns
、...それらはすべて暗黙的にActiveSheet
を参照してください - あなたはではありません任意のシートで作業しているとき:
予選ものが重要ですアクティブなシートを呼び出すと、アクティブなシートを暗黙的に呼び出すと問題が発生します。
私は#
の代わり"
で#date literal#
を同封 - 文字列リテラルのためだという。 #date literal#
を使用すると、String
からDate
への暗黙的な変換は避けられます。.Cells(i, "E").Value
はVariant/Date
である必要があります。
次は月パラメータ化し、ワークシートを推測:
Private Sub UpdateMonthlyData(ByVal monthIndex As Long)
With MainSheet
On Error GoTo ErrHandler
Dim name As String
name = MonthName(monthIndex, True)
Dim target As Worksheet
target = ThisWorkbook.Worksheets(name)
On Error GoTo 0 'from this point onward any error bubbles up to the caller
Dim lastRow As Long
lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
Dim i As Long
For i = 5 To lastRow
Dim monthCell As Range
monthCell = .Cells(i, "E")
If Not IsError(monthCell.Value) Then
If CStr(monthCell.Value) = name Then
.Cells(i, "A").EntireRow.Copy target.Range("A" & target.Rows.Count).End(xlUp).Offset(1)
End If
Else
Debug.Print "Cell " & monthCell.Address & " contains an error value and cannot be processed."
End If
Next
End With
Exit Sub
ErrHandler:
Debug.Print "Could not find a worksheet for month " & monthIndex & "."
End Sub
今、呼び出し側は、すべてのシートを処理するために、1から12までのループを実行する必要があります:
For i = 1 To 12
UpdateMonthlyData i
Next
それはありません私よりもはるかにクリーンになります:)
今、その.Copy
操作はまだあなたがしたいことをしません - しかし、悲しいかな、この答えはすでに十分です!がんばろう!
マットのマグ、お時間をいただきありがとうございます。説明はすべて完璧に機能しました!素晴らしい! – Tom
@Tom Pleasure!上/下の投票ボタンのすぐ下にある回答の隣にある緑のチェックマークをチェックしてください。 –
@Tom https://meta.stackexchange.com/a/5235/289619を参照してください – 0m3r