Как сделать петлю вокруг петель VBA
Привет,
Я очень ценю вашу помощь в этом, так как я новичок в VBA. У меня есть форма Infopath, которая в основном хранит данные, заполняемые пользователями, в формате XML. Затем он будет передан в Excel для обработки данных. Некоторые данные остаются неизменными, например, имена и даты. Однако, поскольку форма пытается вместить несколько транзакций, которые будут записаны в течение одной и той же даты, некоторые данные уникальны для каждой транзакции, например цена/валюта.
Поэтому я пытаюсь создать такой код, чтобы данные, уникальные для каждой транзакции, были зациклены от 1 до 10 (максимальное количество транзакций, которые могут быть записаны в одной и той же форме), и теперь они переименованы в "Цена 1", "Цена 2" и т. д. Все это время одни и те же данные (например, имя и дата) остаются в таблице, и каждая транзакция сохраняется в базе данных перед переходом к данным следующей транзакции. Если транзакции больше нет, код должен перестать выполняться.
Когда я нажимаю кнопку Выполнить, он запрашивает у меня имя макроса и вообще не запускается. Я тоже не знаю, как его редактировать. Буду очень признателен за вашу помощь. Спасибо!
Другие коды, вызывающие этот код, являются:
The other code that is calling this code is this: Sub sub_form (dicData As Dictionary) Dim dicTransaction As Dictionary Dim key As Variant Dim key2 As Variant For Each key In dicData.Keys blnWait = True If InStr(key, REPEAT_KEY) Then Set dicTransaction = dicData(key) dicTransaction("exchangeRate") = dicTransaction("exchangeRate") / 100 Call sub_PreLoad(dicTransaction) End If Next Set dicTrade = Nothing Set key = Nothing Set key2 = Nothing The sub_Preload procedure looks like this: Sub sub_PreLoad(dicData As Dictionary) Dim i As Integer: i = 1 Dim j As Integer Dim no As Integer Dim vTemp As Variant vTemp = Range(Range("rInputStart").Offset(1, 1), _ fnc_LastCellInCol(Range("rinputstart")).Offset(-1).Offset(0, 1)).value Dim vKey As Variant For i = LBound(vTemp, 1) To UBound(vTemp, 1) If Not vTemp(i, 1) = vbNullString Then If no>1 Then vFormKey = Split(vTemp(i, 1), "|") For j = LBound(vKey) To UBound(vKey) If dicData.Exists(vKey(j)) Then Range("rInputStart").Offset(i, 2).value = dicData_ (vKey(j)) End If Next j Else: Call sub_inputData End If Next i Set vTemp = Nothing Set vKey = Nothing End Sub
(P. s: Я перекрестно размещал сообщения на других форумах, потому что мне очень хочется обратиться за помощью к другим экспертам. Я так сожалею об этом.
Что я уже пробовал:
Я попробовал следующий код:
Sub sub_inputData(dicData AsDictionary) Dim ws As Worksheet: Set ws =ActiveSheet Dim i As Integer Dim j As Integer Dim vTemp As Variant Range("rInputStart").Parent.Calculate vTemp =Range(Range("rInputStart").Offset(1),_ Range("rInputStart").End(xlDown).Offset(0,2)).value Dim price as Long Dim currency As String: currency = vbNullString Dim exchangeRate as String: exchangeRate = vbNullString Dim remark as String: remark = vbNullString For j =1To10 price = price & dicData ("price" & CStr (j))&"|" price = price ("rPriceManual").value 'and at this point, other functions will be called to convert the prices to different currencies etc,aslongas the prices are inserted into the table correctly currency = currency & dicData("dl_currency"&CStr(j))&"|" exchangeRate =(exchangeRate & dicData("exchange_rate"&CStr(j))&"|")/100 Remark= remark & dicData("remarks"&CStr(j))&"|" For i =LBound(vTemp,1)ToUBound(vTemp,1) If vTemp(i,1)="currency"And dicData(dl_currency)<> vbNullString Then vTemp(i,3)= currency Endif If vTemp(i,2)="remark"Then vTemp(i,3)=Remark EndIf If vTemp(i,2)="exchangeRate"Then vTemp(i,3)= exchangeRate EndIf Next i Next j End Sub