2017-03-06 2 views
0

シート上のすべての黄色のセルをループし、すべての最終的な連結結果をコピー/ペーストして、黄色のセルのすべての値を示すレポートにコピーするためのスクリプトを作成しました。どのようにセルをループし、コンマで区切った区切り記号で連結するのですか?

本質的に、スクリプトは次のようなものを生成します。 、私は私が直接、上記の例で説明したようにどこ、のために、結果を印刷するためのコードを変更するにはどうすればよい

Task#6 Map Central Email Change to: Owner Group; Owner Role; Task Description 
Task#7 Map Tri Email Change to: Owner Group; Owner Role; Task Description 
Task#14ADDED!! 

Task#6 Map Central Email Change to: Owner Group 
Task#6 Map Central Email Change to: Owner Role 
Task#6 Map Central Email Change to: Task Description 
Task#7 Map Tri Email Change to: Owner Group 
Task#7 Map Tri Email Change to: Owner Role 
Task#7 Map Tri Email Change to: Task Description 
If the whole row is yellow, I simply get this: 
Task#14ADDED!! 
Task#15ADDED!! 

はちょうど今日の私の同僚は、彼らがこのような結果を確認したいと述べました各タスク#、結果はセミコロンで区切られますか?私はこのコードをしばらく設計しましたが、私はこのフォーマットでしばらく見ていましたが、今は新しいフォーマットの周りに私の心を感じることができません。

Sub UpdateFormat() 
Dim i As Long 
Dim j As Long 

Set sht = ThisWorkbook.Worksheets("Version Control") 
LRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row + 1 

Worksheets("PaperlessTemplate").Select 
    Set R = ActiveSheet.UsedRange 
    For i = 1 To R.Rows.Count 
    Worksheets("PaperlessTemplate").Select 
     For j = 1 To R.Columns.Count 
      If Cells(i, j).Interior.ColorIndex = 6 Then 
       Set Value = Cells(i, j) 
       TaskNo = Cells(i, 2) 
       TaskTitle = Cells(i, 3) 

       Title = Cells(1, j) 
        If Cells(i, 19).Interior.ColorIndex = 6 Then 
         finalset = finalset & vbCrLf & "Task#" & TaskNo & "ADDED!!" 
         GoTo here: 

         Else 
         finalset = finalset & vbCrLf & "Task#" & TaskNo & " " & TaskTitle & " " & "Change to: " & Title 
        End If 
      End If 
     Next 
here: 
    Next 

    Worksheets("Version Control").Cells(LRow, 4).Value = Worksheets("Version Control").Cells(LRow, 4).Value & finalset & vbCrLf 

End Sub 
+0

行と列のヘッダーを含むサンプルデータのスクリーンショットを提供すると、実行する必要があるものを視覚化するのに役立ちます。各バージョンコントロールの更新の最後にセルの色をリセットする必要がありますか? – PatricK

+0

ソースデータはすべて上記のように3つの関連する行にありますか?もし黄色い部分があれば、3列全てを保持しますか?そうであれば、(a)新しい文字列変数を薄暗くすることができます。 (2)色が見つかったら、オフセットを使って文字列を作成し、2行目と3行目のタスクに移動します。あなたのコードを変更して、関連するタスクを構成するので、行を1ではなく3ずつ増やすようにします。 –

+0

さらに、 "Scripting.Dictionary"オブジェクト(KeyはTaskNo&TaskTitleとしてValueをTitleとして使用します)を使用すると、追加/変更された内容を追跡できます。 – PatricK

答えて

1

あなたは辞書を避けたい場合は、あなただけのタイトルが書かれてする必要があるのを追跡するために、余分な変数を使用することができ、ここでコードがあります次に出力を作成するだけです

Sub UpdateFormat() 
    Dim i As Long 
    Dim j As Long 
    Dim LRow As Long 
    Dim sht As Worksheet 
    Dim R As Range 
    Dim TaskNo 
    Dim TaskTitle 
    Dim Title 
    Dim finalset As String 
    Dim partset As String 

    Set sht = ThisWorkbook.Worksheets("Version Control") 
    LRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row + 1 

    With Worksheets("PaperlessTemplate").UsedRange 
     For i = 1 To .Rows.Count 
      TaskNo = .Cells(i, 2).Value 
      TaskTitle = .Cells(i, 3).Value 
      If .Cells(i, 19).Interior.ColorIndex = 6 Then 
       finalset = finalset & vbCrLf & "Task#" & TaskNo & "ADDED!!" 
      Else 
       'Use a temporary variable to concatenate all the relevant titles 
       partset = "" 
       For j = 1 To .Columns.Count 
        If .Cells(i, j).Interior.ColorIndex = 6 Then 
         'Set Value = Cells(i, j) 
         Title = .Cells(1, j) 
         partset = partset & Title & "; " 
        End If 
       Next 
       'See if the temporary variable contains anything 
       If partset <> "" Then 
        'If it does, append it to the end of "finalset" 
        '(remove the last two characters from "partset" as that will be a trailing "; ") 
        finalset = finalset & vbCrLf & "Task#" & TaskNo & " " & TaskTitle & " " & "Change to: " & Left(partset, Len(partset) - 2) 
       End If 
      End If 
     Next 
    End With 

    Worksheets("Version Control").Cells(LRow, 4).Value = Worksheets("Version Control").Cells(LRow, 4).Value & finalset & vbCrLf 

End Sub 
+0

@ ryguy72 - 計算された文字列の先頭に1を置き、計算された文字列の最後に1を追加するため、Ibo(感謝しますか?)へのあなたのコメントに応じて、複数のCR/LFが得られます。したがって、マクロを2回実行すると、列Aに新しいものを追加することなく、新しい文字列の先頭にあるCR/LFは、古い文字列の最後にあるCR/LFの直後になります。だからこそ、新しいセルを毎回使用するのではなく、列Aの最後に使用されたセルの1行下の列Dのセルにデータを常に追加する根拠は何ですか? – YowE3K

1

パトリックで述べたように、あなたは辞書を使用する必要があり、そのためにあなたは、スクリプトランタイムを(VBEツール/ Referenmcesに/マイクロソフトのランタイムスクリプトを確認してください)を追加する必要があります。

このコードで作業を行う必要があります。私はサンプルデータを持っていないのでテストできませんでしたので、試してみてエラーが出るかどうか確認してください。あなたはそこから得ることができます。

範囲を定義するためにワークシートを選択する必要はありません。それはあなたが本当にシートを拾っている間は、シートを選択する必要はありませんが、それだけでなく、ちらつき、それ以外の多くの行を扱っている場合、パフォーマンスを遅くするでしょう

ここ
Sub UpdateFormat() 
    Dim i As Long 
    Dim j As Long 
    Dim TaskNo As String 
    Dim TaskTitle As String 
    Dim Titke As String 
    Dim dict As Dictionary 

    Set sht = ThisWorkbook.Worksheets("Version Control") 
    LRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row + 1 

    'Worksheets("PaperlessTemplate").Select 

    Set R = Worksheets("PaperlessTemplate").UsedRange 
    For i = 1 To R.Rows.Count 

    'Worksheets("PaperlessTemplate").Select 

    Set dict = New Dictionary 

    With Worksheets("PaperlessTemplate") 
     For j = 1 To R.Columns.Count 
      If .Cells(i, j).Interior.ColorIndex = 6 Then 
       Set Value = .Cells(i, j) 
       TaskNo = .Cells(i, 2) 
       TaskTitle = .Cells(i, 3) 
       Title = .Cells(1, j) 

       If .Cells(i, 19).Interior.ColorIndex = 6 Then 
        finalset = finalset & vbCrLf & "Task#" & TaskNo & "ADDED!!" 
        GoTo here: 

        Else 
         If dict.Exists(TaskNo) Then 'edit the item of dictionary with the new Title 
          finalset = dict(TaskNo) 
          dict(TaskNo) = finalset & "; " & Title 
         Else 'add to the dictionary 
          dict.Add TaskNo, "Task#" & TaskNo & " " & TaskTitle & " Change to: " & Title 
         End If 

       End If 
      End If 
     Next 
    End With 

: 次

 Worksheets("Version Control").Cells(LRow, 4).Value = Worksheets("Version Control").Cells(LRow, 4).Value & finalset & vbCrLf 

End Sub 
+0

ありがとうYowE3K !!これは私が欲しいものをほぼ正確に行います。私は間違いなく一緒に暮らすことができます!私が尋ねるのは、余分なvbCrLfを取り除く方法があるかどうかであり、これはしばらくポップアップするようです。私は自分のコードを書き直し、あなたが私に与えたものに似たものを思いついた。私も私の結果に余分なvbCrLf文字を持っています。スクリプトが終了する直前にすべてが書かれた最後のセルの内容を調べ、その中にvbCrLfしかないすべての行を削除する簡単な方法はありますか?みんな、ありがとう!! – ryguy72

関連する問題