0

誰か助けてくれませんか。

「ソース」「AllData」シートからデータを抽出し、この情報を「宛先」「直接活動」シートに貼り付けるために、使用したい次のコードをまとめました。

もう少し詳しく言うと:

  • スクリプトで「送信先」シートの列Eにあるテキスト値「DIR」を検索するようにしたいと思います。
  • これが見つかったら、列DBから値をコピーし、両方に対して一意の個別のリストを作成します。
  • 「Destination」シートの列Dから列Bに、列Bから列Cに値を貼り付けます。

さらに、スクリプトで、[ソース] シートの列Iのマンデイの数値をすべて合計し、[目的地] シートの関連する月の下に配置したいと考えています。

Sub Extract()

    Dim i As Long, j As Long, m As Long, strProject As String, RLOB As String, RDate As Date, RVal As Single
    Dim BlnProjExists As Boolean, ws As Worksheet, DI As Worksheet, LastRow As Long
    Const StartRow As Long = 5

    Application.ScreenUpdating = False

    Set DI = Sheets("Direct Activities")


    With Sheets("AllData").Range("E3")
        For i = 1 To .CurrentRegion.Rows.Count - 1
            strProject = .Offset(i, 0)
            RDate = .Offset(i, 3)
            RVal = .Offset(i, 4)
            RLOB = .Offset(i, -3)

         If InStr(.Offset(i, 0), "DIR") > 0 And RVal > 0 Then
            strProject = .Offset(i, -1)
            RLOB = .Offset(i, -3)
            With DI.Range("B1")
                If .CurrentRegion.Rows.Count = 1 Then
                    .Offset(1, 0) = strProject
                    j = 1
                Else
                    BlnProjExists = False
                    For j = 1 To .CurrentRegion.Rows.Count - 1
                         If .Offset(j, 0) = strProject And .Offset(j, 1) = RLOB Then
                            BlnProjExists = True
                            Exit For
                        End If
                    Next j
                        If BlnProjExists = False Then
                          .Offset(j, 0) = strProject
                        End If
                End If
                Select Case Format(RDate, "mmm yy")
                    Case "Apr 13"
                        m = 1
                    Case "May 13"
                        m = 2
                    Case "Jun 13"
                        m = 3
                    Case "Jul 13"
                        m = 4
                    Case "Aug 13"
                        m = 5
                    Case "Sep 13"
                        m = 6
                    Case "Oct 13"
                        m = 7
                    Case "Nov 13"
                        m = 8
                    Case "Dec 13"
                        m = 9
                    Case "Jan 14"
                        m = 10
                    Case "Feb 14"
                        m = 11
                    Case "Mar 14"
                        m = 12
                End Select
                        m = m + 1
                 .Offset(j, m) = .Offset(j, m) + RVal
            End With


         End If
        Next i
    End With

     Application.ScreenUpdating = True
    End Sub

「Destination」シートの列Bの値を貼り付けることはできますが、値が誤って複数回繰り返され、「Source」シートの列Bから列Cに値をコピーできませんでした。 「宛先」シート。

ただし、「ソース」シートの列 I から「目的地」シートの正しい月までのマンデイの数字を合計することはできます。

「ソース」「AllData」シートと「直接活動」「宛先」シートを含むファイルをここにアップロードしました。「マクロ」シートのボタンを選択すると、マクロを実行できます。

さらに、マクロで達成したいことを示す別のシート「期待されるアクティビティ」を含めました。

誰かがこれを見て、どうすればこれを達成できるかについてのガイダンスを提供できるかどうか疑問に思いました.

多くの感謝と親切な敬意

4

1 に答える 1

0

このコードにはいくつかの問題があります。

この行で:
If .Offset(j, 0) = strProject And .Offset(j, 1) = RLOB Then

列 B と C で既存の一致を探していますが、列 B のみを入力しています。次のように設定する必要があります。

.Offset(1, 0) = strProject
.Offset(1, 1) = RLOB 'added line

と:

.Offset(j, 0) = strProject
.Offset(j, 1) = RLOB ' added line

さて、この行:
With DI.Range("B1")

シートの上部で行の入力を開始しますが、これは望ましくないと思います。「B4」に変更してください。これにより、空のテーブルの行数が変更されるため、以下も変更する必要があります。

If .CurrentRegion.Rows.Count = 1 Then

If .CurrentRegion.Rows.Count = 3 Then

そして:
For j = 1 To .CurrentRegion.Rows.Count - 1

For j = 1 To .CurrentRegion.Rows.Count - 3

私の好みは Range("B4") から開始し、 .End(xlDown) を使用して検索する領域を選択することです。

次の変更を加えてスクリプトを実行すると、「期待される」シートと同じ結果が得られました。

        With DI.Range("B4") ' changed from b1
            If .CurrentRegion.Rows.Count = 3 Then ' changed from 3
                .Offset(1, 0) = strProject
                .Offset(1, 1) = RLOB ' added
                j = 1
            Else
                BlnProjExists = False
                For j = 1 To .CurrentRegion.Rows.Count - 3
                     If .Offset(j, 0) = strProject And .Offset(j, 1) = RLOB Then
                        BlnProjExists = True
                        Exit For
                    End If
                Next j
                    If BlnProjExists = False Then
                      .Offset(j, 0) = strProject
                      .Offset(j, 1) = RLOB ' added
                    End If
            End If
于 2013-09-16T17:24:38.273 に答える