Использование Excel PasteSpecial (Divide) в зависимости от количества строк - PullRequest
0 голосов
/ 21 января 2020

У меня есть электронная таблица следующим образом:

  • Столбцы A: G (имя, путь, размер, тип, DateCreated, DateLastModified, DateLast Accessed)

  • Заголовок использует строки 1: 7

  • Столбец C содержит размер файла в КБ
  • Первичный VBA заполняется из выбранной папки
  • Подставка вставляет 2 столбца слева от ColumnD
  • Теперь столбцы: Имя, Путь, Размер в КБ, Размер в МБ, Размер в ГБ, Тип, DateCreated, DateLastModified, DateLast Accessed

У меня есть Sub чтобы вызвать цикл Column C и вставить разделенное количество в ColumnD & ColumnE

Цикл работает, но занимает время, поэтому хотел бы PasteSpecial, где ColumnD = ColumnC / 1000000 и ColumnE = ColumnC / 1000000000

В каждой папке будет разное количество файлов. Для запуска конверсионного вызова я использую myRows = Cells(Rows.Count, 3).End(xlUp).Row - 7 (где 7 - вычет строки заголовка) "

Я бы хотел PasteSpecial myRows Column C в ColumnD и ColumnE, но, как было отмечено, myRows будет быть разным для каждой папки. Я не нахожу (но все еще ищу), куда поместить делитель, который будет использоваться для вычисления ColumnD и ColumnE:

PasteSpecial Operation:=xlPastSpecialOperationDivide

Мой код вызова:

Sub Convert_MB_GB()

    Dim myRows As Long
    Dim x As Long
    Dim var As Double
    Dim Num1 As Long
    Dim Num2 As Long
    Num1 = 1000000 'Divisor for KB to MB
    Num2 = 1000000000 'Divisor for KB to GB

        myRows = Cells(Rows.Count, 3).End(xlUp).Row - 7 'Count rows and subtract 7-row header

        Range("D:E").Insert 'Insert 2 columns to the left of Column D
        [D7].Value = "Size in MB" 'Add title to column
        [E7].Value = "Size in GB" 'Add title to column

        Range("C8").Select 'Starting Cell

        For x = 1 To myRows
            var = Application.ActiveCell.Value
            ActiveCell.Offset(0, 1).Select
                ActiveCell.Value = var / Num1
            ActiveCell.Offset(0, 1).Select
                ActiveCell.Value = var / Num2
            ActiveCell.Offset(1, 0).Select
                ActiveCell.Offset(0, -2).Select
        Next

 Range("D:D").NumberFormat = "0.0" 'Configure Column D to 1 decimal point
 Range("E:E").NumberFormat = "0.0" 'Configure Column E to 1 decimal point

End Sub

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы имеете в виду это?

Sub x()

Dim myRows As Long

myRows = Cells(Rows.Count, 3).End(xlUp).Row - 7

With Cells(1, 1000)
    .Value = 1000000 'some out of the way unused cell
    Range("D8").Resize(myRows).Value = Range("C8").Resize(myRows).Value
    .Copy
    Range("D8").Resize(myRows).PasteSpecial operation:=xlPasteSpecialOperationDivide
    .ClearContents
End With

End Sub

Или другой подход

Sub x()

Dim myRows As Long

myRows = Cells(Rows.Count, 3).End(xlUp).Row - 7

With Range("D8").Resize(myRows)
    .Value = .Offset(, -1).Value
    .Value = Evaluate(.Address & "/1000000")
    'or in one line
    '.Value = Evaluate(.Offset(, -1).Address & "/1000000")
End With

End Sub

См. здесь .

0 голосов
/ 21 января 2020

Вам, вероятно, не нужно PasteSpecial, и вам следует избегать использования Select. Ваш l oop может быть упрощен до:

    For x = 8 To myRows
        var = Cells(x,3)
        Cells(x,4) = var / Num1
        Cells(x,5) = var / Num2
    Next x

Это будет работать намного быстрее, чем выбор. Вы также можете отключить ScreenUpdating и включить Calculation в ручной режим при выполнении кода.

...