#excel #vba #for-loop #if-statement
Вопрос:
Я пытаюсь выбрать несколько столбцов для i строк в зависимости от цикла For. Идея состоит в том, чтобы проверить, соответствует ли конкретная ячейка критериям. Если это так, скопируйте формулы, связанные с этим конкретным сегментом, в ту же строку, что и это наблюдение.
то есть:
для i = 13
Если O(i) = сегмент A, скопируйте и вставьте формулу из $P$1 в P(i)
и
Скопируйте и вставьте формулы из T1:CV1 в T(i) : CV (i)
(Пожалуйста, имейте в виду, что между T и CV есть скрытые столбцы, я предполагаю, что они не будут иметь никакого отношения к результату, поскольку они скрыты, но все равно хотели бы отметить.)
До сих пор я пытался использовать код : Диапазон(«T» и i : «CV» и i).Выбирать. Я знаю, что это неправильно, но просто хотел дать представление. Полный код прилагается ниже. Любая помощь будет признательна!
Sub mastersheet()
Dim i As Integer
Sheets("Master").Select
For i = 13 To 400
If Range("O" amp; i).Value = "A" Then
Range("P1").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T1:CV1").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "B" Then
Range("P2").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T2:CV2").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "C" Then
Range("P3").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T3:CV3").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "D" Then
Range("P4").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T4:CV4").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "E" Then
Range("P5").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T5:CV5").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "F" Then
Range("P6").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T6:CV6").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "G" Then
Range("P7").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T7:CV7").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "H" Then
Range("P8").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T8:CV8").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
ElseIf Range("O" amp; i).Value = "I" Then
Range("P9").Select
Selection.Copy
Range("P" amp; i).Select
ActiveSheet.Paste
Range("T9:CV9").Select
Selection.Copy
Range("T" amp; i : "CV" amp; i).Select
ActiveSheet.Paste
End If
Next i
End Sub
Комментарии:
1. Пожалуйста, попробуйте
Range("T" amp; i ":CV" amp; i).Select, but no need to any selection in what you try doing. Selecting only consumes Excel resources and does not bring any benefit. Try using
диапазон(«T1:CV1»). Диапазон копирования(«T» amp; i amp; «:CV» amp; i)`. В одном ряду.2. Или
Range("P1").Copy Destination:=Range("P" amp; i)
.
Ответ №1:
Взгляните на Выбранный случай
Sub mastersheet1()
Dim i As Integer, ws As Worksheet, n As Integer
Set ws = Sheets("Master")
With ws
For i = 13 To 400
Select Case .Range("O" amp; i).Value2
Case "A": n = 1
Case "B": n = 2
Case "C": n = 3
Case "D": n = 4
Case "E": n = 5
Case "F": n = 6
Case "G": n = 7
Case "H": n = 8
Case "I": n = 9
Case Else: n = 0
End Select
If n > 0 Then
.Range("P" amp; n).Copy .Range("P" amp; i)
.Range("T" amp; n amp; ":CV" amp; n).Copy .Range("T" amp; i amp; ":CV" amp; i)
End If
Next
End With
End Sub
Ответ №2:
Проблема с методом копирования/вставки заключается в том, что он довольно медленный и неэффективный. Я бы предпочел использовать массивы. Вот пример:
Sub mastersheet()
Dim i As Integer
Dim arr As Variant 'This is for storing the array
Sheets("Master").Select
For i = 13 To 400
If Range("O" amp; i).Value = "A" Then
'This is faster than copy/pasting
Range("P" amp; i) = Range("P1")
arr = Range("T1:CV1")
Range("T" amp; i amp; ": CV" amp; i) = arr
End If
Next i
End Sub`
Ответ №3:
Пожалуйста, попробуйте следующий компактный код. Он не нуждается в каком-либо выборе:
Sub masterSheet()
Dim sh As Worksheet, i As Long, arr, arrL, arrNo, mtch
Set sh = Sheets("Master")
arrL = Split("A,B,C,D,E,F,G,H,I", ",") 'the array used to match the cell value
arrNo = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) 'the array to return row to be copyed (based on mtch)
arr = sh.Range("O1:O400") 'place the range in an array, for faster iteration
Application.Calculation = xlCalculationManual 'calculate formula result only of the end
For i = 13 To 400
mtch = Application.match(arr(i, 1), arrL, 0) 'match the letter value
If IsNumeric(mtch) Then 'if a match exists:
sh.Range("P" amp; arrNo(mtch - 1)).Copy Destination:=sh.Range("P" amp; i) 'use the index from arrNo
sh.Range("T" amp; arrNo(mtch - 1) amp; ":CV" amp; arrNo(mtch - 1)).Copy sh.Range("T" amp; i) 'use the index from arrNo
End If
Next i
Application.Calculation = xlCalculationAutomatic 'now calculate copied formulas
MsgBox "Ready..."
End Sub
Комментарии:
1. Col T равен 20, так
sh.cells(arrNo(mtch - 1), 19 j)
и как это удовлетворяет требованию «копировать формулы »2. @CDP1802 ИБП… Это не. Я пропустил эту часть «формул». Я удалю свой ответ.
3. @CDP1802 Восстановил его и тоже адаптировал для работы с формулами…