Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/27: Рейтинг темы: голосов - 27, средняя оценка - 4.52
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
1

Создать модуль в VBA Ecxel, в котором написать вывод произвольной матрицы на лист Ecxel

11.06.2012, 15:54. Показов 5227. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Помогите, пожалуйста. Нужно создать модуль в VBA Ecxel, в котором написать вывод произвольной матрицы на лист Ecxel, где размерность задается пользователем, и сумма элементов каждой строки матрицы равна 1, а значения каждого элемента должны быть от 0 до 1.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2012, 15:54
Ответы с готовыми решениями:

VBA Ecxel (обращение к SharePoint)
Добрый день! Подскажите, пожалуйста, кто знает, как решить данную проблему. Суть в следующем:...

Ecxel перенос строки в столбец VBA
В екселе имеется два листа: Лист1 и Лист2 Данные в виде текста содержатся в Лист1: А1,В1,С1...

Как можно открыть активную ячейку для редактирования (F2) возможностями VBA в Ecxel?
Как можно открыть активную ячейку для редактирования (F2) возможностями VBA в Ecxel? Заранее...

Почему VBA в Ecxel при обращении к некоторым функциям (Date, Chr и др.) ругается?
Если кто знает, скажите, почему VBA в Ecxel при обращении к некоторым функциям (Date, Chr и др.)...

41
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
11.06.2012, 18:06 2
1. Создаёшь книгу Excel
2. Добавляешь пустой модуль.
3. В модуль заносишь следующий код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Sub CreaMatrix()
 
Dim Matr() As Double
 
      n%=Val(InputBox("Введите размерность квадратной матрицы"))
      If n%<=0 Then Exit Sub
 
      '::: Создание матрицы
 
      Redim Matr(1 to n%, 1 to n%) As Double
 
      Randomize Second(Time)
 
      For i%=1 to n%
           For j%=1 to n%
                Matr(i%,j%)=Rnd()
           Next j%
     Next i%
 
     '::: Нормировка строк
 
     For i%=1 to n%
          S#=0
          For j%=1 to n%
               S#=S#+Matr(i%,j%)
          Next j%
          For j%=1 to n%
               Matr(i%,j%)=Matr(i%,j%)/S#
          Next j%
    Next i%
 
    '::: Вывод
 
    For i%=1 to n%
         For j%=1 to n%
              ThisWorkBook.Sheets(1).Cells(i%,j%).Value=Matr(i%,j%)
         Next j%
    Next i%
       
 
End Sub
4. Запускаешь эту процедуру...
2
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
12.06.2012, 18:14  [ТС] 3
Спасибо Вам большое! Вы мне очень помогли)

Добавлено через 22 часа 49 минут
Здравствуйте, а можно еще спросить? Теперь нужно сделать, чтобы когда я создаю вторую матрицу, например, первая удалялась. Я знаю, что нужно использовать функцию Cells.Clear, но мне нужно чтобы не вся страница очищалась, а только те ячейки, где была матрица. Заранее спасибо)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
12.06.2012, 18:20 4
Это просто:

1. Способ медленный:

Visual Basic
1
2
3
4
5
    For i%=1 to n%
         For j%=1 to n%
              ThisWorkBook.Sheets(1).Cells(i%,j%).Value=""
         Next j%
    Next i%
2. Способ быстрый:

Visual Basic
1
2
3
ThisWorkBook.Sheets(1).Range(Cells(1,1),Cells(n%,n%)).Select
Selection.ClearContents
Cells(1,1).Select
1
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
12.06.2012, 18:21 5
Visual Basic
1
ThisWorkBook.Sheets(1).[a1].CurrentRegion.Clear
2
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
12.06.2012, 19:21  [ТС] 6
Спасибо ещё раз!
0
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
02.08.2012, 11:18  [ТС] 7
Здравствуйте! Помогите, пожалуйста, еще раз. Я задаю размерность матрицы, вывожу ее. Теперь мне нужно эту матрицу умножить на саму себя. А затем полученную матрицу умножить на исходную. И так далее. Помогите, пожалуйста!
0
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
02.08.2012, 11:26 8
Перемножение матриц
Возведение матрицы в степень, заданной массивом
1
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
08.08.2012, 12:12  [ТС] 9
А что нужно изменить в коде, чтобы создать одномерный массив, сумма элементов которого была равна 1? Заранее спасибо!
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub CreaMatrix()
 
Dim Matr() As Double
 
      n%=Val(InputBox("Введите размерность массива"))
      If n%<=0 Then Exit Sub
 
      '::: Создание матрицы
 
      Redim Matr(1 to n%) As Double
 
      Randomize Second(Time)
 
      For i%=1 to n%
   
                Matr(i%)=Rnd()
 
     Next i%
 
     '::: Нормировка строк
 
     For i%=1 to n%
          S#=0
               S#=S#+Matr(i%)
               Matr(i%)=Matr(i%)/S#
 
    Next i%
 
    '::: Вывод
 
    For i%=1 to n%
              ThisWorkBook.Sheets(1).Cells(i%).Value=Matr(i%)
    Next i%
       
End Sub
Посмотрите, пожалуйста, так правильно?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.08.2012, 16:12 10
Мне кажется, да - правильно! Единственно, нужно поправить блок вывода:

Visual Basic
1
2
3
4
    '::: Вывод
    For i%=1 to n%
         ThisWorkBook.Sheets(1).Cells(i%,1).Value=Matr(i%)  '::: Вывод в первый столбец
    Next i%
А потом все легко проверить: просто просуммировать числа в 1-м столбце. Должна получиться единица.
1
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
08.08.2012, 18:26  [ТС] 11
Ага, спасибо. А в нормировке нет ошибки? А то выводятся все единицы.

Добавлено через 8 минут
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.08.2012, 19:02 12
Ой, проглядел... Нормировка должна быть такой:

Visual Basic
1
2
3
4
5
6
7
8
9
     '::: Нормировка
 
     S#=0
     For i%=1 to n%
          S#=S#+Matr(i%)
     Next i%
     For i%=1 to n%
          Matr(i%)=Matr(i%)/S#
     Next i%
1
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
08.08.2012, 20:12  [ТС] 13
Спасибо, я уже исправила! А можно, я еще поспрашиваю, если будут вопросы?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
08.08.2012, 20:36 14
Конечно, пожалуйста!
1
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
09.08.2012, 08:06  [ТС] 15
Доброе утро! А теперь нужно умножить этот вектор-строку на квадратную матрицу (размерности у них одинаковые). Для этого нужно умножить каждый элемент вектора-строки на соответствующий ему по порядку элемент i-того столбца матрицы и просуммировать эти произведения. И получим вектор

Visual Basic
1
2
3
4
5
6
7
8
Dim dSum As Double
ReDim C (1 to n)
 
dSum = 0
For i=1 To n
  dSum = dSum + Vec(i) * Matr(i, j)
Next i
C(i) = dSum
Так верно будет?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
09.08.2012, 09:55 16
Нет, не совсем. Запомните на дальнейшее: матричное умножение - это минимум два цикла:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
'::: Вектор-строка V умножается на матрицу M
'::: и получается вектор-строка R
 
Sub mulM(V() as double, M() as double, R() As double)
      n%=UBound(V,1)
      For i%=1 to n%
           R(i%)=0
           For j%=1 to n%
                R(i%)=R(i%)+V(j%)*R(j%,i%)
           Next j%
      Next i%
End Sub
1
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
09.08.2012, 17:43  [ТС] 17
Спасибо большое!
А вы же функцию написали? Чтобы ее вызвать нужно использовать Call функция(список параметров)?
Это у меня получилось. А еще хочу функцию написать, чтобы полученный вектор умножался на ту же матрицу.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
10.08.2012, 09:15 18
Вот как это можно оформить:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Main
Dim M(1 to ..., 1 to ...) as Double ' вместо многоточий - нужная размерность
Dim V1(1 to ...) as Double
Dim V2(1 to ...) as Double
Dim V3(1 to ...) as Double
 
     '::: Заполняем матрицу M и вектор V1 ...
 
     ''' ......
 
     mulM V1(),M(),V2()    '::: V1*M -> V2
     mulM V2(),M(),V3()    '::: V2*M -> V3
 
End Sub
Ключевое слово "Call" писать не обязательно.
1
56 / 1 / 1
Регистрация: 11.06.2012
Сообщений: 51
10.08.2012, 15:25  [ТС] 19
Спасибо Вам за помощь! Я сделала, как вы написали, только ошибка вот в этом месте, хотя я n% объявила как глобальную переменную:
Visual Basic
1
2
3
Dim V1(1 to n%) as Double
Dim V2(1 to n%) as Double
Dim V3(1 to n%) as Double
Посмотрите, пожалуйста, если Вам не трудно.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
10.08.2012, 19:18 20
Конечно, так нельзя. Я-то имел в виду, что массивы имеют постоянные границы. Если хотите переменные, то:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub Main
 
Dim M() as Double 
Dim V1() as Double
Dim V2() as Double
Dim V3() as Double
 
     ' n% должна быть глобальной
 
     ReDim M(1 to n%, 1 to n%) as Double 
     ReDim V1(1 to n%) as Double
     ReDim V2(1 to n%) as Double
     ReDim V3(1 to n%) as Double
 
     '::: Заполняем матрицу M и вектор V1 ...
 
     ''' ......
 
     mulM V1(),M(),V2()    '::: V1*M -> V2
     mulM V2(),M(),V3()    '::: V2*M -> V3
 
End Sub
0
10.08.2012, 19:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2012, 19:18
Помогаю со студенческими работами здесь

Сложное условие в MS Ecxel
Ребята, подскажите пожалуйста, как составить условие , вычисляющее очки от прогнозов к футбольным...

работа с ecxel документами
Хочу открыть xlsx документ, использую apache poi var fis = new java.io.FileInputStream(путь...

Копирование значений в Ecxel
Здравствуйте! Нужно чтобы значения ячеек столбцов E, F и G листа &quot;16&quot; с помощью макроса...

Сохранение таблицы в Ecxel
У меня возникла проблема при переносе данных из StringGrid в Ecxel файл Написал следующий код ...

Создание файла ecxel
как создать excel файл? а то ищу в гугле ничего не написано Темы объединены

Использование DAO в MS Ecxel
Ставлю кнопку на лист Ecxel, формирую обработку нажатия, пишу строку кода: Dim db As Database...


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

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