Вставка значений с одного листа на другой, если X = True

#vba #excel #paste

#vba #Excel #Вставить

Вопрос:

Я пытаюсь создать макрос, который, если столбец F на пятом листе равен = 3, вставляет значения слева от 3 (столбцы с A по E) на другой лист (лист 1). Кажется, я даже не могу начать. Когда я запускаю макрос, ничего не происходит. Я уверен, что допустил кучу глупых ошибок.

Заранее спасибо за вашу помощь!

Джек

 Sub Movevalues()
        Dim q As Integer, w As Integer
    w = 7
    For q = 1 To 1000
        If ActiveWorkbook.Worksheets("Taxable Accounts Import").Cells(q, 6).Value = 3 Then
            Range(Cells(q, 1), Cells(q, 5)).Select
            Selection.Copy
            Worksheets(1).Select
            Range(22, w).Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            Worksheets(5).Select
            w = w   1
        End If
    Next q
End Sub
  

Комментарии:

1. Быстрый вопрос: это Worksheets(5) то же Worksheets("Taxable Accounts Import") самое, что и?

Ответ №1:

Я думаю, проблема здесь в том, что вы копируете 5 ячеек подряд Worksheets(5) , но увеличиваете только w на 1 в каждом цикле for . Если цель действительно состоит в том, чтобы добавить в ту же строку Worksheets(1) , вам нужно будет увеличить w на 5 вместо этого … что приятно и легко исправить, ха-ха:

 w = w   5
  

При этом вы выполняете цикл 1000 раз, что означает, что потенциально существует 1000 совпадений, которые будут заполнять 1000 столбцов (или 5000 столбцов, если моя коррекция на 5 верна). Это много! Если вы намеревались вместо этого начать со строки 7, столбца 22 и увеличивать строки оттуда, я мог бы использовать следующую стратегию. (Сильно прокомментировано, чтобы объяснить, что происходит …)

 Option Explicit
Sub MoveValuesRev2()

Dim q As Long, w As Long
Dim TAI As Worksheet, SheetOne As Worksheet, _
    SheetFive As Worksheet
Dim Source As Range, Target As Range

'set references up-front
w = 7
Set TAI = ThisWorkbook.Worksheets("Taxable Accounts Import")
Set SheetOne = ThisWorkbook.Worksheets(1)
Set SheetFive = ThisWorkbook.Worksheets(5)

'loop through the cells in question
For q = 1 To 1000
    If TAI.Cells(q, 6).Value = 3 Then
        'store the left-of-the-found-value-3 cells in a range
        With SheetFive
            Set Source = .Range(.Cells(q, 1), .Cells(q, 5))
        End With
        'set the target range in row w, col 22
        With SheetOne
            Set Target = .Cells(w, 22)
        End With
        'the next two lines are the copy and paste step
        Source.Copy
        Target.PasteSpecial (xlPasteValues)
        'increment w
        w = w   1
    End If
Next q

End Sub
  

Комментарии:

1. Большое спасибо! Это было именно то, что я искал. Очевидно, я допустил множество огромных ошибок новичков. Это было действительно поучительно.

Ответ №2:

Я думаю, что будет проще использовать некоторые переменные, а не явные ссылки. Одна вещь, которую это упростит, заключается в том, что вам не нужно постоянно «выбирать» листы взад-вперед.

Я постараюсь прокомментировать то, что я делаю, чтобы вам было понятно.

Непроверенный, поэтому дайте мне знать, если с этим возникнут какие-либо проблемы.

 Sub Movevalues()
    Dim q As Integer, w As Integer
    Dim wsSource as Worksheet      'represents the SOURCE worksheet
    Dim wsDest as Worksheet        'represents the DESTINATION worksheet
    Dim copyRange as Range         'represents the range we want to COPY
    Dim destRange as Range         'represents the destination range

    'Initialize some variables
    w = 7
    Set wsSource = ActiveWorkbook.Worksheets("Taxable Accounts Import")
    Set wsDest = ActiveWorkbook.Worksheets(1)

    For q = 1 To 1000
        With wsSource
        If .Cells(q, 6).Value = 3 Then

            'Define the range to be "copied"
            Set copyRange = .Range(.Cells(q,1), .Cells(q, 5))

            'Define the destination range using the Resize method:
            Set destRange = wsDest.Range(22, w).Resize(1,copyRange.Columns.Count)

            'Here, we don't need to select or even "copy" anything, we can write directly
            '  to one range, from another.
            destRange.Value =  copyRange.Value

            'ensure that w identifies the next column and does not overwrite the values
            ' that we just transferred, above.
            w = w   copyRange.Columns.Count
        End If
    Next q
End Sub
  

Примечание: предполагается, что вы намерены скопировать строки данных и поместить все это в одну строку на целевом листе, как в вашем примере (в котором в качестве места назначения вставки используется строка 22, столбец w).

Комментарии:

1. 1 для правильного использования ссылочных переменных и увеличения w на размер копируемого диапазона

2. Приветствия @DanWagner Я чуть не пропустил это последнее w приращение 🙂