Как я могу ускорить этот код VBA, который включает в себя форматирование?

Вот как вы это сделаете:

  1. Создайте протокол для своего клиента UITableViewCell say MyTableViewCellDelegate.
  2. Добавьте метод cellButtonTapped в свой протокол.
  3. Подключите контроллер вида (который использует эти ячейки) к MyTableViewCellDelegate, то есть в файле заголовка добавьте <MyTableViewCellDelegate>.
  4. В вашем режиме cellForRowAtIndexPath: контроллера вашего вида, когда инициализировать ячейку, присваивать себя как делегат.
  5. В вашем классе ячеек вид таблицы, когда кнопка нажата, передайте управление его делегату, который является вашим контроллером представления.
  6. Способ реализации cellButtonTapped в вашем контроллере просмотра и текущем листе действий, как вам нравится.
0
задан Pᴇʜ 16 January 2019 в 07:18
поделиться

3 ответа

Пример использования «С» и назначения блока из массива:

'copy from database to the pricing schedule as a 
'   non formatted list of all the info - this runs quickly, 
'   but I am open to changing it
With Range("Client_Register")

    For Each rw In .Rows
        If .Cells(rw.Row, 2) = selectedClient Then

            collect(i, 1) = .Range("E" & rw.Row)
            collect(i, 2) = .Range("D" & rw.Row)
            collect(i, 3) = .Range("F" & rw.Row)
            collect(i, 4) = .Range("J" & rw.Row)
            collect(i, 5) = .Range("K" & rw.Row)
            collect(i, 6) = .Range("L" & rw.Row)
            collect(i, 7) = .Range("M" & rw.Row)
            collect(i, 8) = .Range("P" & rw.Row)
            collect(i, 9) = .Range("I" & rw.Row)
            collect(i, 10) = .Range("H" & rw.Row)

            'you could even skip the row-by-row population of values
            '  and assign as a block after exiting the loop
            ws2.Range("B" & i + 6).Resize(1, 10).Value = _
                    Array(collect(i, 1), collect(i, 2), collect(i, 3), _
                          collect(i, 4), collect(i, 5), collect(i, 6), _
                          collect(i, 7), collect(i, 8), collect(i, 9), _
                          collect(i, 10))

            i = i + 1
        End If
    Next

End With

Обратите внимание, что это сломается, если ваш Client_Register ссылается на диапазон, который не начинается на строке 1, из-за относительных ссылок на диапазон.

Например:

 Range("A1:A10").Range("A1") 'refers to A1
 Range("A2:A10").Range("A1") 'refers to A2
0
ответ дан Tim Williams 16 January 2019 в 07:18
поделиться

Ваша обработка массива сбора неэффективна. Подумайте о том, чтобы прочитать весь реестр клиентов в массив с помощью MyArray = Range.Value. Затем подготовьте выходной массив в памяти и запишите его на лист после того, как все циклы будут выполнены, за один раз, с TargetRange.Value = collect.

Избегайте вставки строк. Что не так с существующим? Если вы готовите все данные в массиве для вставки на лист, пустые элементы массива будут создавать пустые ячейки листа. Таким образом можно избежать вставки, и все, что вам нужно сделать, это отформатировать.

Существует время для каждого доступа к рабочему листу, будь то чтение или запись. Даже для форматирования попробуйте создать диапазоны, которые обрабатываются одинаково. Избегайте доступа к листу в виде петель.

0
ответ дан Variatus 16 January 2019 в 07:18
поделиться

Я нашел несколько строк, которые могли бы сэкономить вам время выполнения.

'****EDIT****Changed this to direct range reference rather than go through the Names collection.
'Set namedRange1 = file1.Names("Client_Register").RefersToRange
'Set namedRange2 = file1.Names("Pricing_Range").RefersToRange
Set namedRange1 = file1.Range("Client_Register")
Set namedRange2 = file1.Range("Pricing_Range")

Используемый диапазон занимает больше времени, а лучше использовать .cells напрямую

'delete everything from the pricing schedule/reset
'****EDIT***
With ws2 'Sheets("Pricing Schedule")
    'used range takes more time rather use .cells directly
    .Cells.ClearContents

Вместо использования массивов вы можете напрямую обновлять значения, как показано ниже [ 119]

'I am using i for the row count
        ws2.Range("B" & i + 6).Value = namedRange1.Cells(i, 5).Value
        ws2.Range("C" & i + 6).Value = namedRange1.Cells(i, 4).Value
        ws2.Range("D" & i + 6).Value = namedRange1.Cells(i, 6).Value
        ws2.Range("E" & i + 6).Value = namedRange1.Cells(i, 10).Value
        ws2.Range("F" & i + 6).Value = namedRange1.Cells(i, 11).Value
        ws2.Range("G" & i + 6).Value = namedRange1.Cells(i, 12).Value
        ws2.Range("H" & i + 6).Value = namedRange1.Cells(i, 12).Value
        ws2.Range("I" & i + 6).Value = namedRange1.Cells(i, 16).Value
        ws2.Range("J" & i + 6).Value = namedRange1.Cells(i, 9).Value
        ws2.Range("K" & i + 6).Value = namedRange1.Cells(i, 8).Value
        i = i + 1

Основной причиной вашей медленной работы является операция вставки . попробуйте выработать логику, чтобы не вставив Если это невозможно, попробуйте вставить строки вне цикла в одну операцию, а не в цикл

        Range("Pricing_Range").Rows(i + 1).Insert Shift:=xlShiftDown
        Range("Pricing_Range").Rows(i + 1).Insert Shift:=xlShiftDown
0
ответ дан Hansraj 16 January 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: