2016-06-03 2 views
0

У меня есть код, который находит данные в ячейке в листе 1 и вставляет его много раз, по одной ячейке за раз, в ячейки на другом листе. Что работает, ожидайте, что это займет довольно много времени и часто замораживает компьютер. Наверняка, есть способ вставить эти данные во все выделенные ячейки сразу или, по крайней мере, каким-то другим способом его оптимизации? Любая помощь приветствуется.VBA, вставляющий данные в большие куски

Dim sourcerange4 As Integer 
Dim offset4 As Integer 
Dim qproc As Integer 
qproc = 1 
sourcerange4 = 1 
offset4 = 3 

    SourceRange3 = 1 
     Offset3 = 3 
    Do Until qproc = SourceRange * QuestRange 
    qproc = qproc + 1 

      Sheets(SourceSheet).Select 
        Cells(SourceRange3, Offset3).Copy 


      Sheets(RawData).Select 
          Do Until Cells(sourcerange4, offset4) = "" 
            sourcerange4 = sourcerange4 + 1 
          Loop 

      Sheets(RawData).Select 
      Cells(sourcerange4, offset4).Select 
      ActiveSheet.Paste 

    Loop 
+2

Если ваш код работает, как задумано, но просто медленно или неэффективно, я предлагаю вам взять всю процедуру (т.е. полного контекста) [codereview.se], где вы будете получать обратную связь по любому/все аспекты вашего кода, включая проблемы с производительностью. –

+1

Ваш код не имеет никакого смысла. Как ваш внешний цикл Do завершается, поскольку SourceRange и QuestRange не определены и не действуют нигде? Существует несколько операторов .Select, которые ничего не делают, и ни одна из переменных имени листа не определена нигде. Действительно ли этот код работает? –

+1

Что-то вроде 'Target.Value = Source.Value' переносит значения из диапазона' Source' в диапазон «Target» одновременно, без необходимости выбирать, копировать и вставлять (что почти всегда является плохой идеей в Excel VBA). Определите источники и целевые объекты (предпочтительно таким образом, чтобы это было более эффективно, чем цикл по ячейкам) и передавали данные в больших кусках. Также - не используйте 'Integer'. Он запрашивает проблемы в современных версиях Excel, поскольку допустимые индексы строк могут переполнять этот тип данных. Вместо этого используйте 'Long'. –

ответ

0

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

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

Dim sCopyValue as String 
sCopyValue = Sheets(SourceSheet).Cells(SourceRange3, Offset3).Value 

Dim iCopyRows as Integer 
iCopyRows = SourceRange * QuestRange 
Sheets(RawData).Cells(sourcerange4,offset4).Resize(iCopyRows,1).Value = sCopyValue 
Смежные вопросы