#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
приращение 🙂