Не хочет записать данные из массива в лист Excel - VBA

Узнай цену своей работы

Формулировка задачи:

Тут код програмки .
Листинг программы
  1. Function Multi(x As Range, y As Range)
  2. Debug.Print x.Address
  3. Debug.Print x.Columns.Count
  4. Debug.Print x.Rows.Count
  5. Dim arr(), sz_f_i As Byte, sz_f_j As Byte
  6. sz_f_i = x.Rows.Count: sz_f_j = x.Columns.Count
  7. arr = Range(x.Address).Value
  8. ' Call output_arr(sz_f_i, sz_f_j, arr)'
  9. Debug.Print y.Address
  10. Debug.Print y.Columns.Count
  11. Debug.Print y.Rows.Count
  12. Dim arr_t(), sz_s_i As Byte, sz_s_j As Byte
  13. sz_s_i = y.Rows.Count: sz_s_j = y.Columns.Count
  14. arr_t = Range(y.Address).Value
  15. ' Call output_arr(sz_s_i, sz_s_j, arr_t)'
  16. Dim new_arr()
  17. ReDim Preserve new_arr(1 To sz_f_i, 1 To sz_s_j)
  18. Call multiplication_arr(sz_f_i, sz_f_j, arr, sz_s_i, sz_s_j, arr_t, new_arr)
  19. Call output_arr(sz_f_i, sz_s_j, new_arr)
  20.  
  21. End Function
  22. Sub output_arr(size_i As Byte, size_j As Byte, arr()) ' ГўГЁГўВіГ¤ Г¬Г*Г±ГЁГўГі '
  23. Dim strS$, ttm%
  24. For i = 1 To size_i
  25. For j = 1 To size_j
  26. ttm = j Mod size_j
  27. If ttm = 0 Then strS = strS + " " + Str(arr(i, j)) + vbCrLf
  28. If ttm <> 0 Then strS = strS + " " + Str(arr(i, j))
  29. Next j
  30. Next i
  31. MsgBox (strS)
  32. Dim m_i%, m_j%, temp_cell As Range
  33. m_i = 1: m_j = 1
  34.  
  35. End Sub
  36. Sub multiplication_arr(sz_i As Byte, sz_j As Byte, arr_one(), t_sz_i As Byte, t_sz_j As Byte, arr_two(), new_arr())
  37. Dim save_num%, count_cycle%, llt%, amount%
  38. llt = 1: count_cycle = 0: amount = 0
  39. save_num = 0
  40. For i = 1 To sz_i
  41. For j = 1 To sz_j
  42. For m = 1 To t_sz_j
  43. If count_cycle >= sz_i Then GoTo here
  44. For n = 1 To t_sz_i
  45.  
  46. save_num = save_num + arr_one(m, n) * arr_two(n, llt)
  47. amount = amount + 1
  48. Next n
  49. new_arr(m, llt) = save_num: save_num = 0: If amount >= (sz_j * t_sz_j) Then amount = 0: _
  50. m = 0: _
  51. count_cycle = count_cycle + 1: _
  52. llt = llt + 1
  53. Next m
  54. Next j
  55. Next i
  56. here:
  57. End Sub
Сперва выделяется два массива на листе ексель , потом програма их умножает и выводит через MsgBox , хотел сохранить данные из массива на ексель в ячейки которые пустие , пробовал както так
Листинг программы
  1. For i = 1 To size_i
  2. For j = 10 To 10 + size_j
  3. Cells(i, j) = arr(m_i, m_j)
  4. m_j = m_j + 1
  5. Next j
  6. m_i = m_i + 1
  7. Next i
но на строке
Листинг программы
  1. Cells(i, j) = arr(m_i, m_j)
почему то просто ничего ничего не делает и завершает программу . Подскажите что не так.

Решение задачи: «Не хочет записать данные из массива в лист Excel»

textual
Листинг программы
  1. Function Multiplication(x As Range, y As Range)
  2.        
  3.     Dim arr_one(), arr_two(), arr_three()
  4.    
  5.     arr_one = x.Value ' first arr '
  6.    arr_two = y.Value ' second arr '
  7.    
  8.     ReDim Preserve arr_three(1 To x.Rows.Count, 1 To y.Columns.Count) ' three arr -> set size '
  9.    
  10.     If x.Rows.Count <> y.Columns.Count Then MsgBox "Кількість рядків 1 матриці повинна = кількості стовпців 2 матриці ": GoTo ended
  11.     If x.Rows.Count = y.Columns.Count Then Call multiplication_arr(arr_one, arr_two, arr_three): _
  12.                                            Call output_arr(arr_three) ' output in MsgBox '
  13.    
  14.     Dim i&, j&
  15.     ReDim temp(1 To UBound(arr_one), 1 To UBound(arr_two, 2))
  16.    
  17.     For i = 1 To UBound(temp)
  18.         For j = 1 To UBound(temp, 2)
  19.        
  20.            temp(i, j) = arr_three(i, j)
  21.            
  22.         Next j
  23.     Next i
  24.    
  25.    Multiplication = temp
  26.        
  27. ended:
  28. End Function
  29. Sub output_arr(arr_three()) ' output arr '
  30.  
  31. Dim strS$, ttm&
  32.  
  33. For i = 1 To UBound(arr_three)
  34.    For j = 1 To UBound(arr_three, 2)
  35.    
  36.       ttm = j Mod UBound(arr_three, 2)
  37.       If ttm = 0 Then strS = strS + " " + Str(arr_three(i, j)) + vbCrLf
  38.       If ttm <> 0 Then strS = strS + " " + Str(arr_three(i, j))
  39.      
  40.    Next j
  41. Next i
  42.  
  43. MsgBox (strS)
  44.  
  45. End Sub
  46. Sub multiplication_arr(arr_f(), arr_s(), arr_th()) 'A * B'
  47.  
  48. 'result multiplication/cycle/num row/num colum/amount cycle '
  49. Dim save_num&, count_cycle&, a_row&, a_colum&, amount&
  50. a_row = 1: a_colum = 1: count_cycle = 0: amount = 0
  51. save_num = 0
  52.  
  53. For i = 1 To UBound(arr_f) ' - first cycle '
  54.   For j = 1 To UBound(arr_f, 2)
  55.              For m = 1 To UBound(arr_s, 2) ' - second cycle '
  56.                If count_cycle >= UBound(arr_s, 2) Then GoTo here
  57.                     For n = 1 To UBound(arr_s)
  58.                    
  59.                         save_num = save_num + arr_f(a_row, n) * arr_s(n, a_colum) 'multiplication and addition numbers '
  60.                        amount = amount + 1
  61.                        
  62.                     Next n
  63.                     'save result '
  64.                    arr_th(a_row, a_colum) = save_num: a_row = a_row + 1
  65.                     save_num = 0: If amount >= (UBound(arr_f) * UBound(arr_s)) Then amount = 0: _
  66.                                                                                                m = 0: _
  67.                                                                        count_cycle = count_cycle + 1: _
  68.                                                                     a_row = 1: a_colum = a_colum + 1
  69.               Next m
  70.     Next j
  71. Next i
  72.  
  73. here:
  74.  
  75. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы