Скопировать из ячейки, если две другие ячейки соответствуют критериям? - PullRequest
0 голосов
/ 07 декабря 2018

любая помощь с этим будет оценена.

Я пытаюсь скопировать ячейку из столбца (G) в другой лист, если ячейки из той же строки в столбце (R) = "Y" и столбце(B) = "Месяц"

Я работал только по критерию "Y", но как только я добавил "Месяц", эта кнопка перестала работать?

это код, который яесть;


Private Sub CommandButton1_Click()


Dim LR As Long, i As Long
    With Sheets("Savings Q4")
        LR = .Range("R" & Rows.Count).End(xlUp).Row
        For i = 1 To LR
            With .Range("R" & i)
                If .Value = "Y" Then
            With .Range("B" & i)
                If .Value = "January" Then
                    Sheets("Savings Q4").Range("G:G").Copy Destination:=Sheets("Cifas Loadings").Range("A:A")
              End If
            End With
        Next i
    End With


End Sub

Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Слишком много 'Withing' и 'Ifing'

Правила

  • Количество With операторов должно быть равно количеству End With операторов.

  • Количество операторов If должно быть равно количеству операторов End If, за исключением случаев, когда существует «однострочный» оператор If .

Insights

Решение Алексея C получает эти With -s и If -s встрока, но проблемы все еще остаются.

Когда вы пишете With .Range("R" & i), это относится к Sheets("Savings Q4") из предыдущего оператора With, и вы фактически сокращаете строку

With Sheets("Savings Q4").Range("R" & i)

, которая OK .

Когда вы позже напишите With .Range("B" & i), это не относится к Sheets("Savings Q4"), это относится к .Range("R" & i), т.е. вы не сокращаете строку With Sheets("Savings Q4").Range("B" & i), но

With Sheets("Savings Q4").Range("R" & i).Range("B" & i)

, что НЕПРАВИЛЬНО .

Matteo NNZ правильно прокомментировал, что операторы If могут быть сокращены до одного оператора If с использованием And оператор.

Когда вы пишете

Sheets("Savings Q4").Range("G:G").Copy_
    Destination:=Sheets("Cifas Loadings").Range("A:A")

, вы копируете весь столбец G во весь столбец A.Поскольку это в цикле (For i = 1 to LR), каждый раз, когда код встречает " Январь " и " Да ", он копирует столбец весь ,Крайне маловероятно, что вы пытаетесь достичь этой функциональности.

План изменений

  • Избавьтесь от «внутренних» With.
  • Уменьшите If, используя And.
  • Измените КОЛОННА диапазонов G:G и A:A на соответствующие CELL диапазоны.
  • Избавьтесь от Destination:=.

Код

Sub WithIf()

    Dim LR As Long, i As Long

    With Sheets("Savings Q4")
        LR = .Range("R" & Rows.Count).End(xlUp).Row
        For i = 1 To LR
            If .Range("R" & i).Value = "Y" And _
                .Range("B" & i).Value = "January" Then
                .Range("G" & i).Copy Sheets("Cifas Loadings").Range("A" & i)
            End If
        Next i
    End With

End Sub

Остальные проблемы

Еще одна проблема может заключаться в том, чтоВы не хотели, чтобы данные столбца A копировались в ту же строку, что и данные столбца G.В этом случае вы должны применить ту же логику LR = .Range("R" & Rows.Count).End(xlUp).Row и интегрировать ее в код, ссылающийся на столбец A листа "Загрузка Cifas".

0 голосов
/ 07 декабря 2018

По крайней мере, вы забыли один End With и один End If.Но в любом случае это не правильно с логической частью.

Dim LR As Long, i As Long
    With Sheets("Savings Q4")
        LR = .Range("R" & Rows.count).End(xlUp).Row
        For i = 1 To LR
            With .Range("R" & i)
                If .Value = "Y" Then
                    With .Range("B" & i)
                        If .Value = "January" Then
                            Sheets("Savings Q4").Range("G:G").Copy Destination:=Sheets("Cifas Loadings").Range("A:A")
                        End If
                    End With
                End If
            End With
        Next i
    End With

Проще сделать это без С, как

if Range("R"& i).value="Y" and Range("B" & i).value = "Month"
     COPE CELLS
end if
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...