скопировать строку из одного листа Excel в другой на основе 2 входных критериев - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть лист Excel, где первый лист содержит все основные данные, который будет иметь размер около 500 строк и переходит к столбцу R, этот лист называется общим листом. Столбец O содержит месяц, а столбец P - год.

У меня есть еще один лист, на который я хотел бы скопировать данные, это называется «месяц прогноза». вверху в B1 выбран месяц, в который я хотел бы скопировать, а в D1 - год. Я хотел бы, чтобы кнопка прочитала эти две ячейки и скопировала данные из «общего листа», основываясь на этом.

Я написал этот код, как показано ниже, но по какой-то причине данные вводятся в «прогнозируемый месяц» 10 раз перед добавлением следующего (также 10 раз). У меня должно быть только 3 куска данных на этом листе, но вместо этого есть 30, 10 для каждого.

Кроме того, верхние 3 строки на каждом листе имеют заголовки, поэтому данные должны начинаться с записи в строке 4 (что и происходит)

Пожалуйста, кто-нибудь может помочь ??

Private Sub CommandButton1_Click()
    Dim month As String
    Dim year As String

    Dim c As Range
    Dim d As Range

    Dim k As Integer
    Dim source As Worksheet
    Dim targetforecastmonth As Worksheet

    'change worksheet designations as needed
    Set source = ActiveWorkbook.Worksheets("Overall Sheet")
    Set targetforecastmonth = ActiveWorkbook.Worksheets("Forecast Month")

    targetforecastmonth.Range("A4:Z1000").Clear

    month = ActiveWorkbook.Worksheets("Forecast Month").Range("B1")
    year = ActiveWorkbook.Worksheets("Forecast Month").Range("D1")

    k = 4

    For Each c In source.Range("O4:O1000")
        For Each d In source.Range("P4:P1000")
            If c = month And d = year Then
                source.Rows(c.Row).Copy targetforecastmonth.Rows(k)
                k = k + 1
            End If
        Next d
    Next c
End Sub

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

У вас есть вложенный цикл For Each, что означает, что вы берете ячейку "O4", затем циклически проходите ячейки "P4:P1000", а затем переходите к ячейке "O5", повторяете циклы через ячейки "P4:P1000" и так далее ... Если например, значение ячейки "O4" удовлетворяет критерию month, тогда каждый раз, когда цикл в столбце P находит ячейку, которая удовлетворяет критерию year, номер строки 4 будет скопирован и вставлен. Попробуйте вместо этого:

Private Sub CommandButton1_Click()
    Dim month As String
    Dim year As String

    Dim c As Range
    Dim d As Range
    Dim x As Long

    Dim k As Integer
    Dim source As Worksheet
    Dim targetforecastmonth As Worksheet

    'change worksheet designations as needed
    Set source = ActiveWorkbook.Worksheets("Overall Sheet")
    Set targetforecastmonth = ActiveWorkbook.Worksheets("Forecast Month")

    targetforecastmonth.Range("A4:Z1000").Clear

    month = ActiveWorkbook.Worksheets("Forecast Month").Range("B1")
    year = ActiveWorkbook.Worksheets("Forecast Month").Range("D1")

    k = 4
    x = 4

    For Each c In source.Range("O4:O1000")
        Set d = source.Range("P" & x)
        If c.Value = month And d.Value = year Then
            source.Rows(c.Row).Copy targetforecastmonth.Rows(k)
            k = k + 1
        End If
    x = x + 1
    Next c
End Sub
0 голосов
/ 19 ноября 2018

Кажется, неправильная логика существует.Я полагаю, вам нужно Expl .: O8, P8 соответствует B1, D1. Таким образом, вам нужен только один цикл:

For Each c In source.Range("O4:O1000")
d = source.Range("P" & k)
If c = month And d = year Then
    source.Rows(c.Row).Copy targetforecastmonth.Rows(k)
End If
k = k + 1
Next c
0 голосов
/ 19 ноября 2018

Попробуйте, надеюсь, это поможет.

Private Sub CommandButton1_Click()
Dim month As String
Dim year As String

Dim c As Range

Dim k As Integer
Dim source As Worksheet
Dim targetforecastmonth As Worksheet

'change worksheet designations as needed
Set source = ActiveWorkbook.Worksheets("Overall Sheet")
Set targetforecastmonth = ActiveWorkbook.Worksheets("Forecast Month")

targetforecastmonth.Range("A4:Z1000").Clear

month = ActiveWorkbook.Worksheets("Forecast Month").Range("B1")
year = ActiveWorkbook.Worksheets("Forecast Month").Range("D1")

k = 4

For Each c In source.Range("O4:O1000")
If c = month And source.Cells(c.Row, 16).Value = year Then
source.Rows(c.Row).Copy targetforecastmonth.Rows(k)
k = k + 1
End If
Next c

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...