VBA Global / Public переменная область - PullRequest
0 голосов
/ 25 октября 2019

Мне нужен совет о том, как сохранить значение переменной, назначенное в «Private Sub», и передать его в «Main Sub»

код будет выглядеть так:


Global DocDate as String
Sub Main()

```(some code before)```
Call RemitterParsing

```this goes for 8 different values```
Set objDocDate = objDoc.createElement("PayerDocumentDa")
objRemitt.appendChild objDocDate
objDocDate.Text = DocDate


End Sub

Private Sub RemitterParsing()
    OpenPosition = InStr(Range(foundRmt.Address).Offset(2, 0).Value, "PayerDocumentDa>")
    closeposition = InStr(Range(foundRmt.Address).Offset(2, 0).Value, "</PayerDocumentDa")
    DocDate = Mid(Range(foundRmt.Address).Offset(2, 0).Value, OpenPosition + 16, closeposition - OpenPosition - 16)

End Sub

Вот почемуя хочу вызвать другую подпрограмму, чтобы получить все 8 значений одновременно и затем использовать их в основной подпрограмме. Функция будет вызывать их 8 раз.

Ответы [ 3 ]

2 голосов
/ 25 октября 2019

Ваш код работает как есть.

Но я бы не советовал использовать Public переменные, если это необходимо, и передавать переменные между подпрограммами следующим образом:

Option Explicit

Sub Main()
    Dim var1 As String ' declare a variable in scope with Main sub

    assignValue var1 ' call 'assignValue' sub passing it the variable to be set
    MsgBox var1 ' see variable has been set

End Sub

Private Sub assignValue(var1 As String) ' have the sub accept a variable as argument
    var1 = "Hello" ' set the passed variable
End Sub
0 голосов
/ 25 октября 2019

Если я правильно прочитал этот комментарий («Дело в том, что мой исходный код должен возвращать 8 разных значений ...»), вы можете попробовать что-то вроде этого, используя Определенный пользователем тип (UDT, обычно известный как Structure на других языках):

' Define the UDT in the General section of a module
Type MyReturnValues
' Expand the individual UDT members as needed
   Value1 As String
   Value2 As Long
   Value3 As Date
   ' ... More members, if needed
   DocDate As String
End Type

Sub Main()

   Dim udtReturn As MyReturnValues

   ' ```(some code before)```
   udtReturn = RemitterParsing()

   ' Show the results of RemitterParsing()
   With udtReturn
      Debug.Print "Value1: "; .Value1, "Value2: "; .Value2, "Value3: "; .Value3, "DocDate: "; .DocDate
   End With

   ' ```this goes for 8 different values```
   Set objDocDate = objDoc.createElement("PayerDocumentDa")
   objRemitt.appendChild objDocDate
   objDocDate.Text = DocDate

End Sub

Private Function RemitterParsing() As MyReturnValues

   Dim udt As MyReturnValues

   OpenPosition = InStr(Range(foundRmt.Address).Offset(2, 0).Value, "PayerDocumentDa>")
   closeposition = InStr(Range(foundRmt.Address).Offset(2, 0).Value, "</PayerDocumentDa")
   udt.DocDate = Mid(Range(foundRmt.Address).Offset(2, 0).Value, OpenPosition + 16, closeposition - OpenPosition - 16)

   ' Populate a 2nd UDT member
   OpenPosition2 = InStr(Range(foundRmt.Address).Offset(2, 0).Value, "PayerDocumentDa>")
   closeposition2 = InStr(Range(foundRmt.Address).Offset(2, 0).Value, "</PayerDocumentDa")
   udt.Value1 = Mid(Range(foundRmt.Address).Offset(2, 0).Value, OpenPosition + 16, closeposition - OpenPosition - 16)

   ' Add random stuff for demonstration
   With udt
      .Value2 = 123
      .Value3 = Now()
   End With

   ' Return the values
   RemitterParsing = udt

End Function
0 голосов
/ 25 октября 2019

Извините всех, мой подход сработал, но я обнаружил ошибку. Я снова объявил это значение в основной подпрограмме как "Dim". Удалил и все заработало

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