Вот как вы это сделаете:
UITableViewCell
say MyTableViewCellDelegate
. cellButtonTapped
в свой протокол. MyTableViewCellDelegate
, то есть в файле заголовка добавьте <MyTableViewCellDelegate>
. cellForRowAtIndexPath:
контроллера вашего вида, когда инициализировать ячейку, присваивать себя как делегат. cellButtonTapped
в вашем контроллере просмотра и текущем листе действий, как вам нравится. Пример использования «С» и назначения блока из массива:
'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
Ваша обработка массива сбора неэффективна. Подумайте о том, чтобы прочитать весь реестр клиентов в массив с помощью MyArray = Range.Value. Затем подготовьте выходной массив в памяти и запишите его на лист после того, как все циклы будут выполнены, за один раз, с TargetRange.Value = collect.
Избегайте вставки строк. Что не так с существующим? Если вы готовите все данные в массиве для вставки на лист, пустые элементы массива будут создавать пустые ячейки листа. Таким образом можно избежать вставки, и все, что вам нужно сделать, это отформатировать.
Существует время для каждого доступа к рабочему листу, будь то чтение или запись. Даже для форматирования попробуйте создать диапазоны, которые обрабатываются одинаково. Избегайте доступа к листу в виде петель.
Я нашел несколько строк, которые могли бы сэкономить вам время выполнения.
'****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