Member 13892171 Ответов: 2

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

2 Ответов

Рейтинг:
2

Maciej Los

Цитата:
Когда я нажимаю кнопку Выполнить, он запрашивает у меня имя макроса и вообще не запускается. Я тоже не знаю, как его редактировать. Буду очень признателен за вашу помощь. Спасибо!


Что ж... Взгляните на вашу процедуру:
Sub sub_inputData(dicData As Dictionary)

Он ожидает объект словаря в качестве входного параметра.

Если вы хотите запустить/выполнить процедуру, вам нужно создать другую, которая вызовет sub_inputData процедура в пределах входного параметра:

Sub Whatever()
    'declare dictionary object for later use
    Dim oDict As Dictionary
    'initiate variable
    Set oDict = New Dictionary
    'fill dictionary object 
    oDict.Add "Key", "Value"
    '...

    'use dictionary object inside sub_inputData procedure
    sub_inputData oDict

End Sub


Для получения более подробной информации, пожалуйста, смотрите: Справочник по языку VBA | MSDN[^]


Member 13892171

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

Рейтинг:
1

Richard MacCutchan

В Excel вы можете щелкнуть пункт меню Вид -> макросы, чтобы показать доступные макросы. Затем вы можете запускать, отлаживать (Step into) или редактировать их по мере необходимости.