Как я могу запустить один и тот же макрос для каждой строки до конца таблицы? - PullRequest
0 голосов
/ 04 августа 2020

Мне нужна твоя помощь. Я пытаюсь запустить макрос для каждой строки таблицы. Я хочу иметь дату первого и последнего взаимодействия со всеми клиентами из списка. То, что я уже сделал для макроса, - это скопировать первую дату с листа2 и вставить ее на лист1, чтобы получить первую дату, затем с помощью CTRL-Down сделайте это еще раз со следующей датой, чтобы получить последнюю дату. Однако, поскольку это не al oop, он работает только с ячейками, которые я сделал. (Внизу есть код, который у меня есть). Я бы хотел, чтобы код выполнял одно и то же с каждой ячейкой до конца таблицы.

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

sheet1 sheet2

Sheets("Total").Select
    Range("D6923").Select
    Selection.End(xlDown).Select
    Selection.Copy
    Sheets("Timeline").Select
    ActiveSheet.Paste
    Range("C189").Select
    Sheets("Total").Select
    Selection.End(xlDown).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Timeline").Select
    ActiveSheet.Paste
    Range("B190").Select
    Sheets("Total").Select
    Selection.End(xlDown).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Timeline").Select
    ActiveSheet.Paste
    Range("C190").Select
    Sheets("Total").Select
    Selection.End(xlDown).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Timeline").Select
    ActiveSheet.Paste

1 Ответ

1 голос
/ 04 августа 2020

Я вижу, вы новичок в этом, и это нормально, все мы когда-то были! Использование записанных макросов - хороший способ увидеть, как Excel просматривает то, что вы делаете в данный момент, но это крайне неэффективно по сравнению с тем, что могло бы быть. Как уже упоминал Рон, select действительно не дружит с эффективным кодом. Например, ваши первые четыре строки можно переписать в одну строку как:

Sheets("Total").Range("D6923").End(xlDown).copy

Однако даже это не лучший способ. Я собираюсь предположить, что вы работаете от верха листа до низа, и отвечу на ваш вопрос, исходя из того, что, я думаю, вы пытаетесь сделать. Я также предполагаю, что ваш лист под названием Timeline - это лист 1, а ваш лист с именем Total - это лист 2. В общем я предполагаю, что там может быть любое количество записей, а не только две, показанные в трех приведенных примерах.

Sub ExampleCode()
  'Variables, you can create and store things in VBA to make life easier for you
  Dim Wb as Workbook            'This is the workbook you are using
  Dim wsTimeline as Worksheet   'This is your worksheet called Timeline
  Dim wsTotal as Worksheet      'This is your worksheet called as Total
  Const rMin as byte = 5        'This is where the loop will start, I'm assuming row 5. As _
                                   this won't change throughout the code and we know it at the _
                                   start it can be a constant
  Dim rMax as long              'This will be the last row in your loop
  Dim r as long                 'This will be how your loop knows which row to use
  Dim timelineRow as long       'This will be the row that the data is pasted in Timeline
  Dim timelineLastRow as Long   'This is the last row of data in your timeline sheet
  
  Set Wb = Thisworkbook                   'Your whole workbook is now stored in the variable Wb
  Set wsTimeline = Wb.Sheets("Timeline")  'As the workbook was stored in Wb we can use it as _
                                             shorthand here. Now the sheet Timeline is in wsTimeline
  Set wsTotal = Wb.Sheets("Total")        'Same as above, this sheet is now stored

  rMax = wsTotal.Cells(Rows.Count, 1).End(xlUp).Row  'This is the equivalent of starting at the _
                                                        bottom row in column A and pressing _
                                                        Ctrl+Up. This takes you to the last _
                                                        row of data in column A. …(Rows.Count, 2)… _
                                                        would be column B etc.
  timelineLastRow = wsTimeline.Cells(Rows.Count, 1).End(xlUp).Row
  
  'This is the bit where you start to loop, the line below basically says "Do the code in this _
     loop for every value between rMin and rMax, each time make 'r' that value (r for row!)

  With wsTotal                                'Means that anything below starting with '.' will _
                                                 be the same as 'wsTotal.'
    For r = rMin To rMax
      'Ensure working on a line with data
      If .Cells(r, 1) = "" Then
        r = .Cells(r, 1).end(xlDown).row
        If r > rMax Then
          End With                            'Closes the With statement above as no longer needed.
          Exit For                            'Exits the loop as we have ended up beyond rMax
        End if
      End if
      
      'This will look for the person in wsTimeline and if they aren't there then add them
      If IsError(Application.Match(.Cells(r, 1), wsTimeline.Range("A3:A" & timelineLastRow), 0)) Then
        wsTimeline.Cells(timelineLastRow + 1, 1) = wsTotal.Cells(r, 1)
        timelineRow = timeLineLastRow + 1
        timelineLastRow = timelineRow
      Else
        timelineRow = Application.Match(.Cells(r, 1), wsTimeline.Range("A3:A" & timelineLastRow), 0)
      End If

      'I'm assuming that all records in 'Total' are chronologically ascending with no gaps between _
         each row for a single person.
      wsTimeline.Cells(timelineRow, 3) = .Cells(r + 2, 4)
      If .cells(r + 3, 4) <> "" then
        wsTimeline.Cells(timelineRow, 4) = .Cells(r + 2, 4).End(xlDown)
      Else
        wsTimeline.Cells(timelineRow, 4) = .Cells(r + 2, 4).End(xlDown)
      End If
      
      'Now that the data has been brought across from Total to Timeline we can move on to _
         the next row.
    Next r     'This will add one to the value stored in r and start the code again where _
                  the loop started
  End With

  'The loop has now ended having gone through every row in your worksheet called Total.
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...