Возьмите все ячейки из строки до столбца 31, затем перейдите к следующей строке

#excel #vba

#excel #vba

Вопрос:

Попытка написать макрос, который берет ячейки из одной строки (каждый раз увеличивая взятую ячейку на 2), затем вставьте его в другую электронную таблицу, пока он не попадет в столбец 33, затем начните со следующей строки.

введите описание изображения здесь

Верните это введите описание изображения здесь

Основываясь на моем коде, он возвращает следующие значения : введите описание изображения здесь

 Dim wbDest As Workbook
Dim shtDest As Worksheet   
Dim cell As Integer
Dim cellnum As Integer
Dim cellhours As Integer
Dim lastrow As Integer                 
cellhours = 3
cellnum = 10
lastrow = 8

            Do Until cellnum > 31
                
                ' STHours
                If Wkb.Sheets(1).Cells(2, cellnum).Value Like "Reg*" Or Wkb.Sheets(1).Cells(2, cellnum).Value Like "*OffReg*" Or Wkb.Sheets(1).Cells(2, cellnum).Value Like "*Hol*" Then
                
                    shtDest.Cells(lastrow, 10).Value = Wkb.Sheets(1).Cells(2, cellhours).Value   shtDest.Cells(lastrow, 10).Value
                    
                'OTHours
                Else
                    
                    shtDest.Cells(lastrow, 11).Value = Wkb.Sheets(1).Cells(2, cellhours).Value   shtDest.Cells(lastrow, 10).Value

                End If

                
                destLRow = destLRow   1
                cellhours = cellhours   3
                cellnum = cellnum   3
                lastrow = lastrow   1
            Loop
 

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

1. вероятно, есть более простой способ сделать это: exceljet.net/formula/sum-every-nth-column

2. @sous2817 обычно я бы согласился с вами. К сожалению, этот процесс настраивается в гораздо большем макросе VBA и должен быть реализован через vba, а не в Excel.

Ответ №1:

Хорошо, я понял! Извините, я новичок в VBA, поэтому я уверен, что этот код выглядит ужасно, лол. Но вот оно.

 Dim lRow As Integer
Dim destLRow As Integer
Dim cell As Integer
Dim cellnum As Integer
Dim cellhours As Integer
Dim lastrow As Integer
Dim rownum As Integer
  cellhours = 8
  cellnum = 10
  lastrow = 8
  rownum = 2
    
    'amount of people
        For person = 1 To lRow
    
            Do Until cellnum > 31
                
                ' STHours
                If Wkb.Sheets(1).Cells(rownum, cellnum).Value Like "Reg*" Or Wkb.Sheets(1).Cells(rownum, cellnum).Value Like "*OffReg*" Or Wkb.Sheets(1).Cells(rownum, cellnum).Value Like "*Hol*" Then
                
                    shtDest.Cells(lastrow, 10).Value = Wkb.Sheets(1).Cells(rownum, cellhours).Value   shtDest.Cells(lastrow, 10).Value
                    
                'OTHours
                Else
                    
                    shtDest.Cells(lastrow, 11).Value = Wkb.Sheets(1).Cells(rownum, cellhours).Value   shtDest.Cells(lastrow, 10).Value

                End If


                cellhours = cellhours   3
                cellnum = cellnum   3
                
            Loop
            lastrow = lastrow   1
            rownum = rownum   1
            cellnum = 10
            cellhours = 8
        Next person
 

Ответ №2:

Хорошо. Также вы можете немного упростить свой код. Вы можете запустить цикл for с параметром «шаг». Это способ пропустить 1 столбец.