Как сделать петлю вокруг петель 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