Нужна помощь в сокращении этого макроса Excel 2013 - PullRequest
0 голосов
/ 18 декабря 2018

Пока это не сложно, но я новичок в макросах Excel.Я нашел в Интернете и отредактировал это для моего использования, но я знаю, что это так долго.Все одиночные диапазоны относятся к одной и той же ячейке, которая является просто значением =today().Я знаю, что это может быть интегрировано, я просто не знаю как.Остальные копируют строку и вставляют ее внизу определенных строк, по одному для каждого сотрудника.Я уверен, что есть даже лучшие способы сделать это, поскольку копируемые строки предназначены только для этого кода и не являются основным источником данных.Но по одному шагу за раз.Лол

Sub LastRowDtDataTEST()
Dim wb As Workbook
Dim ws As Worksheet
Dim LastRow As Long
Set wb = ActiveWorkbook
Set ws = ThisWorkbook.Sheets("Buyer Trend Metrics")
ws.Select

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "J").End(xlUp).Row
Range("J" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B61:H61").Copy
LastRow = Cells(Rows.Count, "K").End(xlUp).Row ' get last row with data in column "K"
Range("K" & LastRow + 1).PasteSpecial Paste:=xlPasteValues ' paste values

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "S").End(xlUp).Row
Range("S" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B62:H62").Copy
LastRow = Cells(Rows.Count, "T").End(xlUp).Row
Range("T" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "AB").End(xlUp).Row
Range("AB" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B63:H63").Copy
LastRow = Cells(Rows.Count, "AC").End(xlUp).Row
Range("AC" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "AK").End(xlUp).Row
Range("AK" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B64:H64").Copy
LastRow = Cells(Rows.Count, "AL").End(xlUp).Row
Range("AL" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "AT").End(xlUp).Row
Range("AT" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B65:H65").Copy
LastRow = Cells(Rows.Count, "AU").End(xlUp).Row
Range("AU" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "BC").End(xlUp).Row
Range("BC" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B66:H66").Copy
LastRow = Cells(Rows.Count, "BD").End(xlUp).Row
Range("BD" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "BL").End(xlUp).Row
Range("BL" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B67:H67").Copy
LastRow = Cells(Rows.Count, "BM").End(xlUp).Row
Range("BM" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "BU").End(xlUp).Row
Range("BU" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B68:H68").Copy
LastRow = Cells(Rows.Count, "BV").End(xlUp).Row
Range("BV" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "CD").End(xlUp).Row
Range("CD" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B69:H69").Copy
LastRow = Cells(Rows.Count, "CE").End(xlUp).Row
Range("CE" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B58").Copy  ' Copies the value of =Today() from a cell. Would be easier to just integrate today's date instead.
LastRow = Cells(Rows.Count, "CM").End(xlUp).Row
Range("CM" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

Range("B70:H70").Copy
LastRow = Cells(Rows.Count, "CN").End(xlUp).Row
Range("CN" & LastRow + 1).PasteSpecial Paste:=xlPasteValues

End Sub

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018
  1. Не удваивайте пробел каждую строку .Вы должны использовать их как стратегические разделители, а не как стандартные. Это не MLA.
  2. Используйте переменную рабочего листа, чтобы быстро ссылаться на ваши листы (ws относится к листу с ячейками для копирования и ds (лист назначения)) относится к листу, где должны быть вставлены ячейки
  3. Вместо копирования / вставки можно использовать перенос значения, для которого также не требуется нескольких строк

В общем,при сокращении кода вы хотите искать повторяемость. Я вижу, что вы постоянно копируете значение из Range("B58"), поэтому вы также можете сократить его. У вас есть комментарии, в которых говорится, что вы хотите, чтобы значение было просто сегодня, чтобы вы могли просто что-то сделатькак

ds.Range("?") = Today Повторять при необходимости


Option Explicit

Sub LastRowDtData()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim ds As Worksheet: Set ds = ThisWorkbook.Sheets("Buyer Trend Metrics")
Dim LR As Long

LR = ds.Range("J" & ds.Rows.Count).End(xlUp).Offset(1)
ds.Range("J" & LR).Value = ws.Range("B58").Value

LR = ds.Range("K" & ds.Rows.Count).End(xlUp).Offset(1)
ds.Range("K" & LR).Resize(1, 7).Value = ws.Range("B61:H61")

LR = ds.Range("S" & ds.Rows.Count).End(xlUp).Offset(1)
ds.Range("S" & LR).Value = ws.Range("B58").Value


'Repeat for below ranges
'------------------
Range("B62:H62").Copy
Range("B58").Copy
Range("B63:H63").Copy
Range("B58").Copy
Range("B64:H64").Copy
Range("B58").Copy
Range("B65:H65").Copy
Range("B58").Copy
Range("B66:H66").Copy
Range("B58").Copy
Range("B67:H67").Copy
Range("B58").Copy
Range("B68:H68").Copy
Range("B58").Copy
Range("B69:H69").Copy
Range("B58").Copy
Range("B70:H70").Copy


End Sub
0 голосов
/ 18 декабря 2018

Существует образец того, как вы копируете / вставляете.

Копирование каждой строки, вставка в каждый 9-й столбец после столбца 10.

Я добавил две строки для поиска последнейrow - либо найдите его один раз и вставьте все в этот ряд, либо найдите его, прежде чем копировать каждый раз.Раскомментируйте, что вы предпочитаете.

Это скопирует B61:H61 в K:P в последнем ряду (с датой в J), затем B62:H62 в T:Z с датой в R.

Дата также будет отображаться в правильном формате, а не в виде числа.

Public Sub WhateverYouWantToCallIt()

    Dim x As Long, y As Long
    Dim lLastRow As Long

    With ThisWorkbook.Worksheets("Buyer Trend Metrics")

        'This will set the same last row for each copy.
        lLastRow = .Cells(.Rows.Count, 10).End(xlUp).Row + 1

        y = 10
        For x = 61 To 70

            'This will set the last row on each set of data.
            'lLastRow = .Cells(.Rows.Count, y).End(xlUp).Row + 1

            .Cells(lLastRow, y) = Date

            .Range(.Cells(lLastRow, y + 1), .Cells(lLastRow, y + 7)) = _
                .Range(.Cells(x, 2), .Cells(x, 8)).Value

            '-OR-
            '.Range(.Cells(x, 2), .Cells(x, 8)).Copy
            '.Cells(lLastRow, y + 1).PasteSpecial Paste:=xlPasteValues

            y = y + 9
        Next x
    End With

End Sub
0 голосов
/ 18 декабря 2018

Вот несколько вещей, на которые вы можете посмотреть ...

  1. ВСЕГДА используйте Option Explicit.См. здесь для объяснения.
  2. Когда вы выполняете какое-либо действие, такое как копирование данных, очень полезно очень четко определить источник и место назначения данных.Это включает в себя определение того, в какие данные Workbook будут отправлены данные.Вы поблагодарите меня позже за создание этой привычки сейчас.

Как пример:

Dim srcWB As Workbook
Dim dstWB As Workbook
Set srcWB = ThisWorkbook
Set dstWB = ThisWorkbook

Dim srcWS As Worksheet
Dim dstWS As Worksheet
Set srcWS = srcWB.Sheets("Sheet1") ' <--- you didn't specify this in your code
Set dstWS = dstWB.Sheets("Buyer Trend Metrics")
Когда вы выполняете одни и те же (или очень похожие) действия снова и снова, идеальная ситуация - создать отдельную функцию, которая будет выполнять действие за вас.Когда вы нарушаете этот раздел кода, он называется «функциональная изоляция».Это означает, что если у вас есть проблема, которую нужно исправить, вам нужно исправить ее только в одном месте, вместо того, чтобы находить все разные места в вашем коде, которые делают одно и то же.

В вашем случае вывыполняют копирование из одного диапазона ячеек в другой диапазон ячеек.Таким образом, разбивка этого на отдельную подпрограмму выглядит следующим образом:

Private Sub CopyMyData(ByRef fromData As Range, ByRef toData As Range)
    Dim lastrow As Long
    With toData.Parent
        lastrow = .Cells(.Rows.Count, toData.Column).End(xlUp).Row
    End With

    fromData.Copy
    toData.Cells(lastrow).PasteSpecial Paste:=xlPasteValues
End Sub

Обратите внимание, как я использую имена переменных, которые описывают, что делает код (fromData и toData).Это проясняет, что происходит.

Соберите все вместе, и ваш код будет выглядеть примерно так:

Option Explicit

Public Sub StartCopying()
    Dim srcWB As Workbook
    Dim dstWB As Workbook
    Set srcWB = ThisWorkbook
    Set dstWB = ThisWorkbook

    Dim srcWS As Worksheet
    Dim dstWS As Worksheet
    Set srcWS = srcWB.Sheets("Sheet1") ' <--- you didn't specify this in your code
    Set dstWS = dstWB.Sheets("Buyer Trend Metrics")

    CopyMyData fromData:=srcWS.Range("B58"), toData:=dstWS.Range("J:J")

    CopyMyData fromData:=srcWS.Range("B61:H61"), toData:=dstWS.Range("K:K")

    CopyMyData fromData:=srcWS.Range("B58"), toData:=dstWS.Range("S:S")

    CopyMyData fromData:=srcWS.Range("B61:H62"), toData:=dstWS.Range("T:T")
End Sub

Private Sub CopyMyData(ByRef fromData As Range, ByRef toData As Range)
    Dim lastrow As Long
    With toData.Parent
        lastrow = .Cells(.Rows.Count, toData.Column).End(xlUp).Row
    End With

    fromData.Copy
    toData.Cells(lastrow).PasteSpecial Paste:=xlPasteValues
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...