2016-12-15 5 views
2

Как написать следующий код в виде цикла. Я хочу, чтобы скопировать значения из таблицы в листе 4 в ряд от расстояния (б: 17: L17"). Есть более эффективный способ сделать это с петлямиЗапись цикла в Excel для Visual Basic

ActiveSheet.Range("B17").Value = Sheets(4).Range("G8") 

ActiveSheet.Range("C17").Value = Sheets(4).Range("G9") 

ActiveSheet.Range("D17").Value = Sheets(4).Range("G10") 

ActiveSheet.Range("E17").Value = Sheets(4).Range("G11") 
ActiveSheet.Range("F17").Value = Sheets(4).Range("G12") 
ActiveSheet.Range("G17").Value = Sheets(4).Range("G13") 
ActiveSheet.Range("H17").Value = Sheets(4).Range("G14") 

ActiveSheet.Range("I17").Value = Sheets(4).Range("G15") 

ActiveSheet.Range("J17").Value = Sheets(4).Range("G16") 


ActiveSheet.Range("K17").Value = Sheets(4).Range("G17") 

ActiveSheet.Range("L17").Value = Sheets(4).Range("G18") 
+1

См [структура управления потоком] (http://stackoverflow.com/documentation/ vba/1873/структуры контроля потока # t = 201612151953105925624) по документации.SO. –

+0

Как этот вопрос поднялся? – vacip

ответ

8

Да, есть:

ActiveSheet.Range("B17:L17").Value = Application.Transpose(Sheets(4).Range("G8:G18").Value) 
+3

.............. очень приятно! –

+2

@ Gary'sStudent Спасибо, но я просто понял, что OP хочет «более эффективный путь с петлями», предположим, что это, вероятно, не соответствует ожиданию LOL. –

+2

Это более эффективно, так как Excel содержит эту функцию, определенно это лучшее решение: аккуратное и простое. – Sgdva

1

Вы можете, используя что-то вроде этого (VB.Net, но может легко скопировать на VBA):

Dim cell as Integer, c as Integer 
cell = 8 
For c = 66 To 76 
    ActiveSheet.Range(Chr(c) & "17").Value = Sheets(4).Range("G" & cell) 
    cell = cell + 1 
Next 

функция Chr() получает символ, связанный с кодом символа (66-76), а затем это значение объединяется со строкой «17», чтобы сформировать полное имя ячейки («B17», «C17», ...)

Я также увеличиваю число ячеек для G одновременно.


Используйте это, если вы действительно хотите использовать цикл - но не может быть более эффективные способы, как answer given by @A.S.H

+0

@ YowE3K Спасибо - слишком агрессивно на подсветку. – vbnet3d

+2

Обратите внимание, что это работает до столбца Z. Помимо этого .... –

+1

@ Mat'sMug Абсолютно верно ... это можно расширить, включив в него гораздо более возможные значения, но в этот момент я бы рекомендовал использовать что-то лучше любым способом , как ответ ASH. – vbnet3d

1

Solution объяснение:
Установите свои правила! Что меняется в диапазоне для активного листа? Столбец будет расти, поскольку цикл for/to делает! Итак, мы должны судить об этом. Что еще нужно увеличить? Диапазон в другой стороне '=', поэтому, установив алгоритм, мы можем сказать, что строка является константой в диапазоне Activesheet, а столбец является переменной on с другой стороны.
Решение:

Sub Test() 
Const TotalInteractions As Long = 11 
Dim CounterInteractions As Long 
    For CounterInteractions = 1 To TotalInteractions 
    'where 1 is column A so when it starts the cycle would be B,C and so on 
    'where 7 is the row to start so when it begins it would became 8,9 and so on for column G 
    ActiveSheet.Cells(17, 1 + CounterInteractions).Value = Sheets(4).Cells(7 + CounterInteractions, 7) 
    Next CounterInteractions 
End Sub 
+0

@ YowE3K вы правы, я плохо обновил его – Sgdva

0

Это, вероятно, ваше наиболее эффективное решение в с утверждением:

Sub LoopExample() 
    Sheets("Sheet4").Range("G8:G18").Copy 
    Sheets("Sheet2").Range("B17").PasteSpecial xlPasteValues, Transpose:=True 
End Sub 
+1

Это скопирует больше, чем просто '.Value's. Он также копирует на неверный лист (должен быть «Листы (4)»), а также копирует в ячейки G8: Q8, а не в G8: G18. И источник и назначение - неправильный путь. – YowE3K

+0

@ YowE3K Вы впечатляющие! : D –

+0

Ой! отредактировано выше. благодаря! – user1