Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/50: Рейтинг темы: голосов - 50, средняя оценка - 4.60
749 / 460 / 50
Регистрация: 13.05.2012
Сообщений: 958
1

Как вывести всю строку(столбец) в массиве

02.08.2013, 21:34. Показов 10262. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет Всем!
Есть матрица, например
1 4 7 10
2 5 8 11
3 6 9 12
Мне нужно вывести, например весь первый столбец
1
2
3
или всю строку 1 4 7 10
Пробую вот так
Visual Basic
1
2
3
4
5
Sub mtx3()
Dim arr, c
arr = [a1].CurrentRegion
c = arr(1)
End Sub
выдает ошибку.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2013, 21:34
Ответы с готовыми решениями:

Необходимо перемножить строку на столбец двумерного массива и результат вывести в одномерном массиве
Необходимо перемножить строку на столбец двумерного массива и результат вывести в одномерном...

Как поменять местами 1-ю строку и 1 столбец в двухмерном массиве?
int tmp; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length;...

хранимая процедура (MIN), как вывести всю строку, а не только 1 данное???
Привет, есть БД. Надо написать хранимую процедуру, чтобы выводилась(ись) строки со всеми данными,...

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

38
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
02.08.2013, 22:14 2
Матрица где? На листе? Куда выводить? В массив? На лист?
Visual Basic
1
2
3
4
5
6
Sub mtx3()
Dim arr(), c&, mRNg As Range
   Set mRNg = [a1].CurrentRegion
   c = 2: arr = mRNg.Rows(c).Value ' arr=mrng.Colums(c)
   Cells(Rows.Count, "a").End(xlUp).Offset(3, 0).Resize(1, UBound(arr, 2)).Value = arr
End Sub
Добавлено через 22 минуты
О! Извиняюсь! Пропустил Value (в окне писал). Уже исправил. Это вторую строку ...
0
749 / 460 / 50
Регистрация: 13.05.2012
Сообщений: 958
02.08.2013, 22:14  [ТС] 3
я имею ввиду по аналогии с функцией Array
arr= Array(Array(1,2,3),Array(4,5,6), Array(7,8,9),Array(10,11,12))
Пишем здесь
c=arr(0)
и в окне Locals выводится то что нужно, т.е.
1
2
3
Как мне прописать это в массиве по аналогии с Array.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
02.08.2013, 22:19 4
Функция Array - когда Вы явно задаете значения. Получите только одномерный гор. массив начиная от нулевого индекса.

Добавлено через 1 минуту
Если у Вас есть массив (виртуальный, не на листе) - тогда только перебором в паралельный массив с Redim etc....
0
749 / 460 / 50
Регистрация: 13.05.2012
Сообщений: 958
02.08.2013, 22:25  [ТС] 5
т.е. все же без цикла не обойтись?
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.08.2013, 22:36 6
Visual Basic
1
c = [a1].CurrentRegion.columns(1).value
Вообще можно использовать экселевскую index - но это долго.
0
749 / 460 / 50
Регистрация: 13.05.2012
Сообщений: 958
02.08.2013, 22:36  [ТС] 7
Visual Basic
1
2
3
4
5
6
7
8
Sub mtx3()
Dim arr, c, i&
arr = [a1].CurrentRegion
ReDim c(LBound(arr, 1) To UBound(arr, 1))
For i = LBound(arr, 1) To UBound(arr, 1)
c(i) = arr(i, 1)
Next i
End Sub
получаю то что нужно, но я надеялся, что можно как-то без цикла прописать...
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.08.2013, 22:40 8
Visual Basic
1
2
3
4
5
Sub mtx3()
    Dim arr, c
    arr = [a1].CurrentRegion
    c = Application.Index(Application.Transpose(arr), 1, 0)
End Sub
Добавлено через 37 секунд
Но с циклом будет быстрее - померьте например на 10000 строк.
2
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
02.08.2013, 22:54 9
Если у Вас массив на листе - тогда зачем для такой задачи? Диапазон определяете? Да! Потом его в массив! Потом из массива в массив! Святая Мария! Кругами вокруг одно дерева. А если определили диапазон, то с него любую строку/столбец в любое место. В том коде строку:
Set mRNg = [a1].CurrentRegion и переменную mRNG() вобще можна удалить - это было для Вас. И записать просто:
c = 2: arr = [a1].CurrentRegion.Rows(c).Value
Ну а если из вирт. массива, тогда
Visual Basic
1
2
3
4
5
6
7
8
9
dim arr(), tmpARR(), i&, j&
   arr = [a1].CurrentRegion.value
   c=2
   Redim tmparr(1 to ubound(arr,2)
      for i=1 to ubound(arr,2)
         tpmarr(i)=arr(2,i)
      next 'i 
   Cells(Rows.Count, "a").End(xlUp).Offset(3, 0).Resize(1, UBound(tmparr)).Value = tmparr
End Sub
Заснуть можно. При таком простеньком...
Ну да, при больших обьемах - совсем другое дело...

Добавлено через 9 минут
Вот про Index я забыл
1
749 / 460 / 50
Регистрация: 13.05.2012
Сообщений: 958
02.08.2013, 23:49  [ТС] 10
Hugo121, как Вы нашли Application.Index? Он не упоминается в справке явным образом.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.08.2013, 23:53 11
На форуме
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
03.08.2013, 00:05 12
Это шутки такие... Index - это функция, но не VBA, a листа Excel. А если ее еще использовать с Match - всякие VLookUp (ы), HLookUp (ы) могут идти пить пиво.
1
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
03.08.2013, 00:09 13
Да, но что её можно применить к виртуальному массиву - это на форуме увидел.
Но циклом перебрать быстрее.
Конечно если массив маленький - то разница незаметна.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
03.08.2013, 00:20 14
Ну да, а еще transpose... Поэтому и забыл, наверное...
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
03.08.2013, 00:30 15
Transpose только чтобы взять столбец.
Чтоб взять строку - Transpose не нужно.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
03.08.2013, 00:52 16
Ну да, но крутим весь массив, не отдельную строку. На больших должно время тянуть (но я никогда не проверял). Или я что-то не понимаю...
0
1702 / 189 / 19
Регистрация: 20.11.2011
Сообщений: 281
03.08.2013, 07:58 17
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Hugo121 Посмотреть сообщение
Transpose только чтобы взять столбец.
Игорь, ты перемудрил Вместо:
Код
 c = Application.Index(Application.Transpose(arr), 1, 0)
делай:
Код
 c = Application.Index(arr, 0, 1)
И еще замечание - формулы листа обрабатывают в ВБА не более 65535 строк. Так что даже если использовать Application.Index на полную, разница во времени выполнения будет приемлемой. А уж если надо обработать больше строк, тогда без вариантов.
2
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
03.08.2013, 09:44 18
To kuklp. Спасибо, конечно, но я как-то и не использовал...
А вот это:
...формулы листа обрабатывают в ВБА не более 65535 строк...
для меня действительно новость. Это что, действительно и для 2010? Если да - то как-то странно.
0
1702 / 189 / 19
Регистрация: 20.11.2011
Сообщений: 281
03.08.2013, 09:48 19
Igor_Tr, я отвечал(см. цитату в посте) другому Игорю(Hugo121) на его замечание о Transpose
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
03.08.2013, 09:56 20
Где-то читал, что два шутника в одной комнате - это пожар. Но все-таки, про "действительно"?
0
03.08.2013, 09:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2013, 09:56
Помогаю со студенческими работами здесь

Вывести не всю таблицу умножения, а только заданный столбец
Нужно вставить в программу ввод строки (например, 3 на 2) и чтобы программа выводила не всю...

Дана строка. Если скобки расставлены правильно, то вывести число 1. В противном случае вывести всю строку
Дана строка, содержащая несколько круглых скобок. Если скобки расставлены правильно (то есть каждой...

Как разбить строку на отдельные слова и вывести их в столбец А активного рабочего листа в порядке возрастания их длины
Дана строка символов,разделенных пробелами.Разбить строку на отдельные слова и вывести их в столбец...

Указатель на строку: как выводить не всю строку целиком, а конкретную букву
Есть программка: #include<iostream> using namespace std; void fn_str1(int i,string str1,char *p)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru