Функциональный модуль VBA не рассчитывает все выходные значения - PullRequest
0 голосов
/ 30 мая 2019

У меня в основном 2 модуля.Основной модуль «TestMain» имеет функцию, которая записывает код второго модуля «MyNewTest», который должен выполнять некоторые вычисления.

(Причина в том, что код зависит от ввода, поэтому для каждоговведите код будет другим).

Для простоты я написал очень простой код, чтобы подчеркнуть мою проблему.

Проблема в том, что функция вычисляет только первое значение входного массива ипоместив свой результат во все оставшиеся строки.

Хотя код второго модуля обновляется, когда я запускаю основную подпрограмму.Но результаты только по первому «второму модулю» (который соответствует первому ряду).(Например, в листе 4 все значения второго столбца равны 23 (соответствуют входу в первую строку).

Есть идеи о том, как решить проблему?

Option Explicit

Public Sub AddNewWorkBookTEST()

Dim nextline As Long, LastUsedRowList As Long
Dim CodeString As String

Dim x As Long
Dim KWATT As Double


Dim folderPath As String
folderPath = Application.ActiveWorkbook.Path

LastUsedRowList = Sheet4.Cells(Rows.Count, 1).End(xlUp).Row

For x = 1 To LastUsedRowList
    KWATT = Sheet4.Cells(x, 1)
    CodeString = CodeStringGenerator(KWATT)

    ''Update the module code
    With ActiveWorkbook.VBProject.VBComponents("MyNewTest").CodeModule
        .DeleteLines 1, .CountOfLines
    End With

    With ActiveWorkbook.VBProject.VBComponents("MyNewTest").CodeModule
        nextline = .CountOfLines + 1
        .InsertLines nextline, CodeString
    End With

CallOtherModule x
''Calling the function in the second module (where the code was copied).
'''Cannot call the function directly from this sub, since excel will crash:Call MyNewTest.SortedArray(x)

Next x


End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub CallOtherModule(ItemsCounter As Long)
    Call MyNewTest.SortedArray(ItemsCounter)
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''The function that writes the code of the second module as String
Function CodeStringGenerator(KWATT As Double) As String

CodeStringGenerator = "'Option Explicit" & vbCrLf & "Public Function 
SortedArray(ItemsCounter As Long) As Variant()" & vbCrLf & vbCrLf _
& "Dim TempSortedArray() As Variant" & vbCrLf _
& "Sheet4.Cells(ItemsCounter, 2) = " & KWATT + 5 & vbCrLf _
& "End Function" & vbCrLf

End Function

1 Ответ

0 голосов
/ 11 июня 2019

На вопрос ответили по ссылке ниже Тим Уильямс:

https://stackoverflow.com/a/56533585/8758864

Смена имени второго модуля - хитрость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...