Выбор нескольких столбцов и определенной строки с помощью VBA для цикла

#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 Восстановил его и тоже адаптировал для работы с формулами…