2017-01-12 14 views
1

私は仕事用のプロジェクトトラッカーを作成しており、コードを短縮する助けが必要です。各製造元にはそれぞれ独自のシートがあります。私はプロジェクトマネージャーがデータを入力するUserformを持っています。製造シートのそれぞれは同一であり、オフセットもユーザーフォームにリンクされています。オフセットコードを短縮する方法VBA

下記のコードをご覧ください。私はコーディングが初めてで、助けをいくつか使うことができます。

'A&R 5X9N 
If Me.CB7.Value = "A&R" And Me.CB23.Value = "5x9N" Then 
rowcount = Worksheets("A&R").Range("c3").CurrentRegion.Rows.Count 
With Worksheets("A&R").Range("c1") 

'PROJECT 
.Offset(rowcount, 0) = Me.CB1.Value 
.Offset(rowcount, 1) = Me.TB2.Value 
.Offset(rowcount, 2) = Me.TB3.Value 
.Offset(rowcount, 3) = Me.CB4.Value 
.Offset(rowcount, 4) = Me.CB7.Value 
.Offset(rowcount, 5) = Me.TB1.Value 
'FINISH DATES 
.Offset(rowcount, 7) = Me.TB23.Value 
.Offset(rowcount, 8) = Me.TB24.Value 
.Offset(rowcount, 9) = Me.TB25.Value 
.Offset(rowcount, 10) = Me.TB26.Value 
.Offset(rowcount, 11) = Me.TB27.Value 
.Offset(rowcount, 12) = Me.TB28.Value 
.Offset(rowcount, 13) = Me.TB29.Value 
'PRODUCTION 
.Offset(rowcount, 14) = Me.TB8.Value 
.Offset(rowcount, 15) = Me.TB9.Value 
.Offset(rowcount, 16) = Me.TB10.Value 
.Offset(rowcount, 17) = Me.TB11.Value 
.Offset(rowcount, 18) = Me.TB12.Value 
.Offset(rowcount, 19) = Me.TB13.Value 
.Offset(rowcount, 20) = Me.TB14.Value 
'ASSETS 
.Offset(rowcount, 21) = Me.TB16.Value 
.Offset(rowcount, 22) = Me.TB17.Value 
.Offset(rowcount, 23) = Me.TB18.Value 
.Offset(rowcount, 24) = Me.TB19.Value 
.Offset(rowcount, 25) = Me.TB20.Value 
.Offset(rowcount, 26) = Me.TB21.Value 
.Offset(rowcount, 27) = Me.TB22.Value 
.Offset(rowcount, 28) = Me.CB23.Value 
.Offset(rowcount, 29) = Me.CB24.Value 
.Offset(rowcount, 30) = Me.CB25.Value 
.Offset(rowcount, 31) = Me.CB26.Value 
.Offset(rowcount, 32) = Me.CB27.Value 

End With 
End If 

'A&R 5X10N 
If Me.CB7.Value = "A&R" And Me.CB23.Value = "5x10N" Then 
rowcount = Worksheets("A&R").Range("AM3").CurrentRegion.Rows.Count 
With Worksheets("A&R").Range("AM1") 

'PROJECT 
.Offset(rowcount, 0) = Me.CB1.Value 
.Offset(rowcount, 1) = Me.TB2.Value 
.Offset(rowcount, 2) = Me.TB3.Value 
.Offset(rowcount, 3) = Me.CB4.Value 
.Offset(rowcount, 4) = Me.CB7.Value 
.Offset(rowcount, 5) = Me.TB1.Value 
'FINISH DATES 
.Offset(rowcount, 7) = Me.TB23.Value 
.Offset(rowcount, 8) = Me.TB24.Value 
.Offset(rowcount, 9) = Me.TB25.Value 
.Offset(rowcount, 10) = Me.TB26.Value 
.Offset(rowcount, 11) = Me.TB27.Value 
.Offset(rowcount, 12) = Me.TB28.Value 
.Offset(rowcount, 13) = Me.TB29.Value 
'PRODUCTION 
.Offset(rowcount, 14) = Me.TB8.Value 
.Offset(rowcount, 15) = Me.TB9.Value 
.Offset(rowcount, 16) = Me.TB10.Value 
.Offset(rowcount, 17) = Me.TB11.Value 
.Offset(rowcount, 18) = Me.TB12.Value 
.Offset(rowcount, 19) = Me.TB13.Value 
.Offset(rowcount, 20) = Me.TB14.Value 
'ASSETS 
.Offset(rowcount, 21) = Me.TB16.Value 
.Offset(rowcount, 22) = Me.TB17.Value 
.Offset(rowcount, 23) = Me.TB18.Value 
.Offset(rowcount, 24) = Me.TB19.Value 
.Offset(rowcount, 25) = Me.TB20.Value 
.Offset(rowcount, 26) = Me.TB21.Value 
.Offset(rowcount, 27) = Me.TB22.Value 
.Offset(rowcount, 28) = Me.CB23.Value 
.Offset(rowcount, 29) = Me.CB24.Value 
.Offset(rowcount, 30) = Me.CB25.Value 
.Offset(rowcount, 31) = Me.CB26.Value 
.Offset(rowcount, 32) = Me.CB27.Value 

End With 
End If 
+0

だから、より効率的にしたいですか? – PMARINA

+1

[配列](https://msdn.microsoft.com/en-us/library/office/gg264224.aspx)と[ループ](https://www.tutorialspoint.com/vba/vba_for_loop.htm)を使用して最適化します。 )。これですべての問題は解決するわけではありませんが、コードを書くのに役立ちます。 – PMARINA

答えて

0

私は2つのサブに行くことをお勧めします。ボートを駆動するもの(ProcessRecord)とはたらきをするもの(WriteRecord)。これは少なくとも、それらのオフセットのすべてを繰り返すことを避けるのに役立ちます。

Private Sub ProcessRecord() 
    If Me.CB7.Value = "A&R" And Me.CB23.Value = "5x9N" Then WriteRecord "A&R", "C3" 
    If Me.CB7.Value = "A&R" And Me.CB23.Value = "5x10N" Then WriteRecord "A&R", "AM1" 
End Sub 

Private Sub WriteRecord(wks As String, rng As String) 
    Dim rowcount As Long 
    rowcount = Worksheets(wks).Range(rng).CurrentRegion.Rows.Count 
    With Worksheets(wks).Range(rng) 
     'PROJECT 
     .Offset(rowcount, 0) = Me.CB1.Value 
     .Offset(rowcount, 1) = Me.TB2.Value 
     .Offset(rowcount, 2) = Me.TB3.Value 
     .Offset(rowcount, 3) = Me.CB4.Value 
     .Offset(rowcount, 4) = Me.CB7.Value 
     .Offset(rowcount, 5) = Me.TB1.Value 
     'FINISH DATES 
     .Offset(rowcount, 7) = Me.TB23.Value 
     .Offset(rowcount, 8) = Me.TB24.Value 
     .Offset(rowcount, 9) = Me.TB25.Value 
     .Offset(rowcount, 10) = Me.TB26.Value 
     .Offset(rowcount, 11) = Me.TB27.Value 
     .Offset(rowcount, 12) = Me.TB28.Value 
     .Offset(rowcount, 13) = Me.TB29.Value 
     'PRODUCTION 
     .Offset(rowcount, 14) = Me.TB8.Value 
     .Offset(rowcount, 15) = Me.TB9.Value 
     .Offset(rowcount, 16) = Me.TB10.Value 
     .Offset(rowcount, 17) = Me.TB11.Value 
     .Offset(rowcount, 18) = Me.TB12.Value 
     .Offset(rowcount, 19) = Me.TB13.Value 
     .Offset(rowcount, 20) = Me.TB14.Value 
     'ASSETS 
     .Offset(rowcount, 21) = Me.TB16.Value 
     .Offset(rowcount, 22) = Me.TB17.Value 
     .Offset(rowcount, 23) = Me.TB18.Value 
     .Offset(rowcount, 24) = Me.TB19.Value 
     .Offset(rowcount, 25) = Me.TB20.Value 
     .Offset(rowcount, 26) = Me.TB21.Value 
     .Offset(rowcount, 27) = Me.TB22.Value 
     .Offset(rowcount, 28) = Me.CB23.Value 
     .Offset(rowcount, 29) = Me.CB24.Value 
     .Offset(rowcount, 30) = Me.CB25.Value 
     .Offset(rowcount, 31) = Me.CB26.Value 
     .Offset(rowcount, 32) = Me.CB27.Value 
    End With 
End Sub 
+0

情報が私を助けてくれてありがとう! –

0

コードを短縮する方法の例を示します。これはあなたのコードからの作品です:

.Offset(rowcount, 7) = Me.TB23.Value 
    .Offset(rowcount, 8) = Me.TB24.Value 
    .Offset(rowcount, 9) = Me.TB25.Value 
    .Offset(rowcount, 10) = Me.TB26.Value 
    .Offset(rowcount, 11) = Me.TB27.Value 
    .Offset(rowcount, 12) = Me.TB28.Value 
    .Offset(rowcount, 13) = Me.TB29.Value 
    'PRODUCTION 
    .Offset(rowcount, 14) = Me.TB8.Value 
    .Offset(rowcount, 15) = Me.TB9.Value 
    .Offset(rowcount, 16) = Me.TB10.Value 
    .Offset(rowcount, 17) = Me.TB11.Value 
    .Offset(rowcount, 18) = Me.TB12.Value 
    .Offset(rowcount, 19) = Me.TB13.Value 
    .Offset(rowcount, 20) = Me.TB14.Value 
    'ASSETS 
    .Offset(rowcount, 21) = Me.TB16.Value 
    .Offset(rowcount, 22) = Me.TB17.Value 
    .Offset(rowcount, 23) = Me.TB18.Value 
    .Offset(rowcount, 24) = Me.TB19.Value 
    .Offset(rowcount, 25) = Me.TB20.Value 
    .Offset(rowcount, 26) = Me.TB21.Value 
    .Offset(rowcount, 27) = Me.TB22.Value 

すべての値が数値順であり、すべてがTBで始まっているので、あなたはコードを短くするためにループを使用することができます。

For x = 7 To 27 

    If x = 7 Then 
     t = 23 
    ElseIf x = 14 Then 
     t = 8 
    ElseIf x = 21 Then 
     t = 16 
    End If 

    .Offset(rowcount, x) = Me.Controls("TB" & t).Value 
    t = t + 1 

Next x 
0

ここでアイデアです:

project = Array(CB1.value, TB2.value, TB3.value, CB4.value, CB7.value, TB1.value) 
.Offset(rowcount, 0).resize(1, Ubound(project)-1).Value = project 

finishDates= Array(TB23.value, TB24.value, TB25.value, TB26.value, TB27.value, TB28.value, TB29.Value) 
.Offset(rowcount, 7).resize(1, Ubound(finishDates)-1).Value = finishDates 

などなど...

PSコントロールを連続して番号を付けると、名前の順番付けを利用したループを書くことができますが、これはあなたのケースではなく(必ずしもAFAICSではない)、維持するのが難しいためそれにはカウントすることは推奨されません。

0

次のようにあなたのコードをリファクタリングできます。以下のWrite_em()サブ悪用

If Me.CB7.Value = "A&R" Then 'A&R 
     With Worksheets("A&R") 
      Select Case Me.CB23.Value 
       Case "5x9N" '5X9N 
        Write_em .Range("C1"), .Range("C3").CurrentRegion.Rows.Count 

       Case "5x10N" '5X1N 
        Write_em .Range("AM1"), .Range("AM3").CurrentRegion.Rows.Count 
      End Select 
     End With 
    End If 

次のようにコードのみを短縮するために、また

Sub Write_em(rng As Range, RowCount As Long) 
    With rng 
     'PROJECT 
     .Offset(RowCount, 0) = Me.CB1.Value 
     .Offset(RowCount, 1) = Me.TB2.Value 
     .Offset(RowCount, 2) = Me.TB3.Value 
     .Offset(RowCount, 3) = Me.CB4.Value 
     .Offset(RowCount, 4) = Me.CB7.Value 
     .Offset(RowCount, 5) = Me.TB1.Value 
     'FINISH DATES 
     .Offset(RowCount, 7) = Me.TB23.Value 
     .Offset(RowCount, 8) = Me.TB24.Value 
     .Offset(RowCount, 9) = Me.TB25.Value 
     .Offset(RowCount, 10) = Me.TB26.Value 
     .Offset(RowCount, 11) = Me.TB27.Value 
     .Offset(RowCount, 12) = Me.TB28.Value 
     .Offset(RowCount, 13) = Me.TB29.Value 
     'PRODUCTION 
     .Offset(RowCount, 14) = Me.TB8.Value 
     .Offset(RowCount, 15) = Me.TB9.Value 
     .Offset(RowCount, 16) = Me.TB10.Value 
     .Offset(RowCount, 17) = Me.TB11.Value 
     .Offset(RowCount, 18) = Me.TB12.Value 
     .Offset(RowCount, 19) = Me.TB13.Value 
     .Offset(RowCount, 20) = Me.TB14.Value 
     'ASSETS 
     .Offset(RowCount, 21) = Me.TB16.Value 
     .Offset(RowCount, 22) = Me.TB17.Value 
     .Offset(RowCount, 23) = Me.TB18.Value 
     .Offset(RowCount, 24) = Me.TB19.Value 
     .Offset(RowCount, 25) = Me.TB20.Value 
     .Offset(RowCount, 26) = Me.TB21.Value 
     .Offset(RowCount, 27) = Me.TB22.Value 
     .Offset(RowCount, 28) = Me.CB23.Value 
     .Offset(RowCount, 29) = Me.CB24.Value 
     .Offset(RowCount, 30) = Me.CB25.Value 
     .Offset(RowCount, 31) = Me.CB26.Value 
     .Offset(RowCount, 32) = Me.CB27.Value 
    End With 
End Sub 

は、あなたがこの後者のリファクタリングができ:

Sub Write_em(rng As Range, RowCount As Long) 
    With rng 
     'PROJECT 
     .Offset(RowCount, 0).Resize(, 6).Value = Array(Me.CB1.Value, Me.TB2.Value, Me.TB3.Value, Me.CB4.Value, Me.CB7.Value, Me.TB1.Value) 
     'FINISH DATES 
     WriteTBs .Offset(RowCount, 7), 23, 29 
     'PRODUCTION 
     WriteTBs .Offset(RowCount, 14), 8, 14 
     'ASSETS 
     WriteTBs .Offset(RowCount, 21), 16 27 
    End With 
End Sub 

Sub WriteTBs(rng As Range, iniTB As Integer, endTB As Integer) 
    Dim iTb As Integer, colOffset As Integer 

    With rng 
     For iTb = iniTB To endTB 
      .Offset(, colOffset) = Me.Controls("TB" & iTb).Value 
      colOffset = colOffset + 1 
     Next 
    End With 
End Sub 
関連する問題