2011-07-26 3 views
0

私はvb.netに新しいですし、この言語の力を知らないこのVB.netコードを最適化することは可能ですか?より良い実装ができますか?

Public Sub createNextMonthSheets(ByRef io As InputOutput) 
    Dim WB As Excel.Workbook = getWorkBook(io.newClientReportHandle) 
    For Each name In clientSheetNames.FindAll(AddressOf findCurrMonthSheetNames) 
     For Each sheet In WB.Sheets 
      If (sheet.Name = name) Then 
       sheet.Name = name.Replace(currMonth, nextMonth) 
       sheet.Copy(After:=WB.Sheets(1)) 
      End If 
     Next sheet 
    Next name 
    WB.Close() 
End Sub 

Private Function findCurrMonthSheetNames(ByVal sheetName As String) As Boolean 
    If sheetName.Contains(" (" + currMonth + ")") Then 
     Return True 
    Else 
     Return False 
    End If 
End Function 

..私はこのコードを最適化してください。

パフォーマンスを最適化できるかどうかを確認してください。

同じことを行うコードの行数を減らして最適化できるかどうかを確認してください。

これをより読みやすくするために、言語の新しい側面を紹介することができます。

findcurrmonthsheetnames関数を何らかの方法でオーバーロードして、WB.sheetsを取得できますか?

+0

これはかなり簡単です。あなたのメソッド名にケーシングを固定し、 'WB'変数を小文字にする以外、コードは意味があり、すでにかなりコンパクトです。パフォーマンスに問題がある場合は、おそらく、ワークブックのサイズや複雑さ、またはこれがInteropコードの場合、Interopサービスのオーバヘッドが大きくなります。 –

+0

linqを使用してより良い方法でdesieredシートを得ることができますか? –

+0

LINQは魔法の解決 - すべての機能を提供しません。それはその用途を持っていますが、これはおそらく何らかの利益をもたらすものではありません。あなたが持っているものは単純で論理的です。 LINQを使用するためだけにLINQを使用するのは良いアプローチではありません。 –

答えて

1

ネストループの質問に答えるには、必要なすべての名前を最初に別の配列に抽出してから、既存の名前ごとに配列をスキャンすることができます。

Public Sub createNextMonthSheets(ByRef io As InputOutput) 
    Dim WB As Excel.Workbook = getWorkBook(io.newClientReportHandle) 
    Dim CurrMonthSheetNames As String() = clientSheetNames.FindAll(AddressOf findCurrMonthSheetNames) 
    For Each sheet In WB.Sheets 
     Dim name As String = sheet.Name 
     If Array.Contains(CurrMonthSheetNames, name) Then 
      sheet.Name = name.Replace(currMonth, nextMonth) 
      sheet.Copy(After:=WB.Sheets(1)) 
     End If 
    Next sheet 
    WB.Close() 
End Sub 
+0

本当に助けてくれてありがとう..なぜ私はそれを考えなかったのだろうと思っていたのですが! –

関連する問題