VBA, объект RANGE
От: aureola  
Дата: 19.05.10 08:20
Оценка:
Добрый день, коллеги.

Кто знает, существует ли возможность склеивать диапазоны ячеек
наборами, без:
Do...Loop
Do While...Loop
Do Until...Loop
Do ... Loop While
Do...Loop Until
For...Next
For Each ...Next?

К примеру, есть диапазон A1:An, B1:Bn.
В диапазоне C1:Cn нужно получить "A1:An"&"B1:Bn".
Основное условие: склеить диапазонами, а не ячейками по одной.


Такой код не работает:
Set ran = Worksheets("Sheet1").Range("A1" + ":" + "An")
ran.Offset(0, 0).Select = ran.Offset(0, 0) & " " & ran.Offset(o, 1)
приходится использовать For Each...Next
Re: VBA, объект RANGE
От: ZAMUNDA Земля для жалоб и предложений
Дата: 19.05.10 21:32
Оценка:
Здравствуйте, aureola, Вы писали:

A>К примеру, есть диапазон A1:An, B1:Bn.

Range("A1:Bn")

A>В диапазоне C1:Cn нужно получить "A1:An"&"B1:Bn".

Это как? Поясни что сделать надо?

A>Основное условие: склеить диапазонами, а не ячейками по одной.

У Range есть конструктор Range(<Range>, <Range>) он склеивает два Range в один.

A>Такой код не работает:

A>Set ran = Worksheets("Sheet1").Range("A1" + ":" + "An")
естессно не работает, оператор кокатенации строк '&'

A>приходится использовать For Each...Next

ОК!
'Можешь пример с For Each...Next коротенький тут состряпать?
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[2]: VBA, объект RANGE
От: aureola  
Дата: 20.05.10 06:42
Оценка:
Добрый день, Zamunda.

Если склеивать построчно операторами цикла "For.. next i",
очень долго отрабатывает при большом количестве строк.

For i = 0 To x 'x — число строк
Set ran = Worksheets("Sheet1").Range("A1")
Set ran2 = Worksheets("Sheet1").Range("С1") '
ran2.Offset(i, 0) = ran.Offset(i, 0) & ran.Offset(i, 1)
Next i

таким образом если в ячейке "A1" находится текст "привет лунатикам!",
а в "B1" — "они среди нас", то в "C1" будет "привет лунатикам!они среди нас".
тоже и для других строк в диапазоне "A1":"Ax" цикл отталкиваясь от начальных ячеек
будет спускаться вниз.

НО!

Очень долго. Нужен способ оптимизировать решение. Range(range,range)
дает диапазон пусть один ("A1":"Ax"), другой ("B1":"Bx"). А надо тоже самое, как
выше привет лунатикам!они среди нас".
Re[3]: VBA, объект RANGE
От: Аноним  
Дата: 20.05.10 08:22
Оценка: 7 (1)
Option Explicit

Sub Test()
    Const LoBound As Long = 1
    Const UpBound As Long = 25

    Dim vA As Variant
    Dim vB As Variant
    Dim avC(LoBound To UpBound, 1 To 1) As Variant

    vA = Range(Cells(LoBound, 1), Cells(UpBound, 1)).Value
    vB = Range(Cells(LoBound, 2), Cells(UpBound, 2)).Value

    Dim i As Long
    For i = LoBound To UpBound
        avC(i, 1) = vA(i, 1) & vB(i, 1)
    Next

    Range(Cells(LoBound, 3), Cells(UpBound, 3)).Value = avC
End Sub
Re[3]: VBA, объект RANGE
От: ZAMUNDA Земля для жалоб и предложений
Дата: 20.05.10 12:52
Оценка: 7 (1)
Здравствуйте, aureola, Вы писали:

A>Если склеивать построчно операторами цикла "For.. next i",

Так тебе не ячейки а значения в них скокатенировать надо. Стандартного способа обойтись без "For..." я не знаю.

A>Очень долго. Нужен способ оптимизировать решение.

Ну попробуй вот так:
    Dim clsRN As Excel.Range
    
    Set clsRN = ThisWorkbook.Sheets(1).Range("C1:C1024")
    
    clsRN.FormulaR1C1 = "=R[0]C[-2] & R[0]C[-1]"
    clsRN.Value = clsRN.Value

или так:
    Dim clsRN As Excel.Range
    
    Set clsRN = ThisWorkbook.Sheets(1).Range("C1:C1024")
        
    Dim k As Long
    Dim avntSrc() As Variant
    Dim avntDst() As Variant
    
    avntSrc = clsRN.Offset(0, -2).Value
    avntDst = clsRN.Offset(0, -1).Value
    
    For k = 1 To clsRN.Rows.Count
        avntDst(k, 1) = CStr(avntSrc(k, 1)) & CStr(avntDst(k, 1))
    Next k
    
    clsRN.Value = avntDst
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[4]: VBA, объект RANGE
От: Аноним  
Дата: 20.05.10 14:41
Оценка:
Оукей, спасибо, Zamunda
Попробую эти варианты.
Re[4]: VBA, объект RANGE
От: Аноним  
Дата: 20.05.10 14:50
Оценка:
Оукей. Интересный вариант, правда с циклом.
Попробуем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.