Страницы: 1
RSS
VBA как "одним движением" заполнить массив из строки листа?
 
Бьюсь и не знаю как сделать  
вот так работает    
Public Entry_curr() As Variant  
........  
ReDim Entry_curr(1 To 256)  
ActiveWorkbook.Worksheets("Лист2").Columns(1) = Application.Transpose(ActiveWorkbook.Worksheets(Лист1).Rows(23))  
 
Entry_curr = Application.Transpose(ActiveWorkbook.Worksheets("Лист2").Range(Cells(1, 1), Cells(256, 1)))  
 
а так нет    
Public Entry_curr() As Variant  
........  
ReDim Entry_curr(1 To 256)  
With ActiveWorkbook.Worksheets("Лист1")  
Set ran = .Range(.Cells(23, 1), .Cells(23, 256))  
Entry_curr() = ran  
End With  
пишет type mystmach
 
{quote}{login=Groovydmk}{date=09.10.2010 08:32}{thema=VBA как "одним движением" заполнить массив из строки листа?}{post}Бьюсь и не знаю как сделать  
вот так работает    
Public Entry_curr() As Variant  
........  
ReDim Entry_curr(1 To 256)  
ActiveWorkbook.Worksheets("Лист2").Columns(1) = Application.Transpose(ActiveWorkbook.Worksheets(Лист1).Rows(23))  
 
Entry_curr = Application.Transpose(ActiveWorkbook.Worksheets("Лист2").Range(Cells(1, 1), Cells(256, 1)))  
 
а так нет    
Public Entry_curr() As Variant  
........  
ReDim Entry_curr(1 To 256)  
With ActiveWorkbook.Worksheets("Лист1")  
Set ran = .Range(.Cells(23, 1), .Cells(23, 256))  
Entry_curr() = ran  
End With  
пишет type mystmach{/post}{/quote}  
 
 
 
Entry_curr = ran.value
Спасибо
 
так не получается одномерный массив:(  
в первом варианте Entry_curr (1 to 256)  
в Вашем варианте получается Entry_curr (1,1 to 256)  
это не приемлимо
 
Если нужен именно 1-мерный массив, вот для примера:  
 
Public Entry_curr()  
Sub rtyrty()  
Dim ran As range  
Dim i As Integer  
ReDim Entry_curr(1 To 256)  
With Sheets("Лист1")  
   Set ran = range(.Cells(23, 1), .Cells(23, 256))  
   For i = 1 To 256  
'        Entry_curr(i) = .Cells(23, i)  
       Entry_curr(i) = ran.Cells(i)  
   Next i  
End With  
If IsArray(Entry_curr) Then MsgBox "Элементов в массиве: " _  
  & UBound(Entry_curr)  
For i = 1 To 5  
   MsgBox Entry_curr(i)  
Next i  
End Sub
 
2 nilem  
это уже не вариант с "одним движением" у меня собственно и был цикл - я от него избавляюсь  
2 The_Prist  
это еще хуже - получается одноомерный массив двумерных значений    
Entry_curr (1 to 256)(1 to 256,1)
 
не выходит :(    
см вложение
 
{quote}{login=The_Prist}{date=09.10.2010 11:22}{thema=}{post}И что не выходит-то? Даже в Watches написано: Entry_curr(1 To 256, 1 to 1)  
 
Что не так-то? Или Вас напрягает то, что вторая размерность? Так это всегда так будет, если Вы значения с листа берете.{/post}{/quote}  
 
неа ... первый вариант с двойным транспонированием - из строки в столбец и из столбца в массий дает одномерный массив. что собственно и правильно т.к. другие процедуры знают что данный массив одномерный.  
ReDim Entry_curr(1 To 256)  
ActiveWorkbook.Worksheets("Лист2").Columns(1) = Application.Transpose(ActiveWorkbook.Worksheets(Лист1).Rows(23))  
Entry_curr = Application.Transpose(ActiveWorkbook.Worksheets("Лист2").Range(Cells(1, 1), Cells(256, 1)))  
см. вложение
 
Я и говорю - выходные. Даже Prist морочится с такой хе%%%й.
Я сам - дурнее всякого примера! ...
 
2 The_Prist  
про ссылки на родительские объекты учту ! спасиб!  
но реально вы неправы- скриншот в предыдущем моем посте - в результате работы вот этого куска    
 
ActiveWorkbook.Worksheets("buff").Columns(1) = Application.Transpose _  
(ActiveWorkbook.Worksheets(List).Rows(roww))  
 
Entry_curr = Application.Transpose(ActiveWorkbook.Worksheets("buff").Range _  
(Cells(1, 1), Cells(256, 1)))  
 
где ("buff")- свободный лист ("Лист2")  
roww - переменная = номеру строки при вызове процедуры перевода строки в массив =(23) для вашего примера  
List - переменная = имени листа откуда берется строка  
в результате работы этих двух строк получается Одномерный массив Entry_curr(1 to 256) содержащий значения ячеек строки Roww с листа List  
скриншот Вы видели
 
2 The_Prist  
хм ... чтото мне никак не приходит в голову как стоит распологать одномерный массив (вертикально или горизонтально) если он одномерный и управляется одной переменной в скобочках :)  
давайте всетаки разберемся (я чегото не понимаю) если есть строки и столбцы на листе то массив двумерный можно охаректеризовать как плоскую таблицу mass(i,j)- где i-номер строки, j- номер столбца.  
тогда вытаскивание с листа в массив и обратно не составляет труда  
но когда я оперирую одномерной структурой (массивом) то мне наверное уже не важно как он распологается главное что есть одна переменная для поиска значений в массиве?  
с колонками все понятно выбрал колонку загнал в массив - все классно  
а вот со строкой не получается - excel видимо думает что нужно сделать структуру типо плоской таблицы ? тоесть двумерный массив mass(N,1)?  
 
я правильно понимаю?
 
2 The_Prist  
Прошу прощения наверное совсем запутал Вас  
цель моя состоит в следующем - есть один лист, есть на нем строка, есть один одномерный массив Entry_curr(1 to 256) as string (ну или Variant)  
нужно без использования циклов просто перегнать значения ячеек в строке листа в элементы массива - это все ! больше ничего не требуется!  
чтоб не пользовать циклы я сделал следующее  
 
ActiveWorkbook.Worksheets("buff").Columns(1) = Application.Transpose _  
(ActiveWorkbook.Worksheets(List).Rows(roww))  
на "ненужный" лист ("Buff") транспонировал строку Roww с листа List в столбец "A"(перетащил значения ячеек)  
Entry_curr = Application.Transpose(ActiveWorkbook.Worksheets("buff").Range _  
(Cells(1, 1), Cells(256, 1)))    
а тут я с этого столбца (столбец "А" листа "Buff")транспонирую значения в массив Entry_curr - по Вашим словам вертикальный (а по моему линейный просто)  
и в результате у меня получается обычный однометрый массив из строк.  
 
так вот как решить эту задачу без циклов и без использования буферного листа?
 
The_Prist  
Ваш вариант    
ReDim Entry_curr(1 To 256)  
Set ran = ActiveWorkbook.Worksheets(List).Rows(roww)  
Entry_curr = Application.Transpose(ran.Value)  
 
возвращает    
Entry_curr(1 to 256,1 to 1)  
мне это не подходит!!!!  
 
мой вариант    
ActiveWorkbook.Worksheets("buff").Columns(1) = Application.Transpose _  
(ActiveWorkbook.Worksheets(List).Rows(roww))  
Entry_curr = Application.Transpose(ActiveWorkbook.Worksheets("buff").Range _  
(Cells(1, 1), Cells(256, 1)))  
возвращает    
Entry_curr(1 to 256)  
это мне подходит но используется дополнительный лист... что не есть хорошо.  
нет больше вариантов ?    
может есть какаято встроенная функция по транспонированию массивов данных? мне бы это подошло.
 
Дим, вы толчете воду в ступе. В любом случае будет цикл(системный). Автору нужно сократить код? Так он уже столько написал, что(если бы в код)... Почему не пользоваться тем,  что есть. Получил массив и обрабатывай его. Мы все так делаем. Хотелось бы... Ну если не получается, давайте жить дружно. Работаем над тем, что есть.
Я сам - дурнее всякого примера! ...
 
{quote}{login=Groovydmk}{date=09.10.2010 01:57}{thema=}{post}может есть какаято встроенная функция по транспонированию массивов данных? мне бы это подошло.{/post}{/quote}  
ТРАНСП() - не это нужно?
 
Всем спасибо! простите что столько пришлось написать и столько времени Вашего отвлечь.  
Как я понял создать (системными методами) не циклами одномерный массив из строки листа - невозможно. Буду пользоваться дополнительным листом.  
ТРАНСП не подходит я не формулы пишу, я программу пишу на VBA :)    
вариант от The_Prist можно использовать, только потом придется в тексте писать    
aaa=Entry_curr(j,1)  
а мне хотелось не исправлять остальной код и оставить везде    
aaa=Entry_curr(j)
 
Во мля, сложности. В коде применить ctrl+h/
Я сам - дурнее всякого примера! ...
 
{quote}{login=KuklP}{date=09.10.2010 02:36}{thema=}{post}Во мля, сложности. В коде применить ctrl+h/{/post}{/quote}  
что простите? не понял 0_о
 
Че понимать. Там , где Вы писали:  
Entry_curr = Application.Transpose(ran.Value)  
обрабатывайте Entry_curr, как Вам хочется.  
А ctrl+h позволит Вам не вручную поменять ссылки на значения арраев.
Я сам - дурнее всякого примера! ...
 
Сам разобрался, чтоб поместить в одномерный массив строку с любой страницы нужно написать следующий код:  
With ActiveWorkbook.Worksheets(List)  
Entry_curr = Application.Transpose(Application.Transpose( _  
.Range(.Cells(roww, 1), .Cells(roww, 256))))  
End with  
причем Range задавать именно так - через ячейки иначе не работает (получится двумерный массив)
 
И кстати Transpose глючит в 2000 Экселе, а в версиях поновее имеет ограничение на 65536. Совсем недавно Alex_ST столкнулся на тестах.
 
{quote}{login=Hugo}{date=09.10.2010 06:19}{thema=}{post}И кстати Transpose глючит в 2000 Экселе, а в версиях поновее имеет ограничение на 65536. Совсем недавно Alex_ST столкнулся на тестах.{/post}{/quote}  
 
мне нужно было выбрать строку, а в 2003 excel они длиннее 256 не бывают :)    
для загрузки столбца транспоз не требуется.
Страницы: 1
Читают тему
Наверх