0
votes

VBA Global / Public variable Portée

J'ai besoin de conseils sur la manière de conserver une valeur variable attribuée dans "Sous-Sous" et transmettez-la sur "Sub principal"

Code ressemblerait à ceci: p>

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


3 commentaires

Veuillez prendre le Tour . et lisez Comment demander à puis modifier la question (par exemple, recherche Web pour le titre de la question et ajouter du code qui est pertinent, comme votre L'échantillon ne échouera pas sur la portée tant que le code est dans le même module).


Quel est votre message? Je m'attendrais à ce que votre code fonctionne. Sans plus de détails, il est très difficile d'aider, mais avez-vous vraiment besoin d'utiliser une variable globale? Pouvez-vous ne pas activer assigntureValue en une chaîne de retour de la fonction?


La chose est mon code d'origine doit renvoyer 8 valeurs différentes et pour une raison quelconque, cette approche retourne en blanc.


3 Réponses :


2
votes

Votre code fonctionne comme c'est.

Mais je conseillerais contre l'utilisation d'utiliser des variables code> code> sauf si nécessaire, et passez des variables entre les sous-marins, comme suit: P>

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


1 commentaires

Peut-être qu'une fonction est plus facile à comprendre qu'un (implicite!) Byref pour les débutants. Et une procédure qui attribue qc. indique une propriété Let / Set pour moi.



0
votes

Désolé tout le monde, mon approche a fonctionné, mais j'ai trouvé une erreur. J'ai déclaré que la valeur se trouve à nouveau à nouveau "Dim". L'a supprimé et cela a fonctionné


0 commentaires

0
votes

Si je lisais ce commentaire Droit (", mon code d'origine doit renvoyer 8 valeurs différentes ..."), vous voudrez peut-être essayer quelque chose comme ça, en utilisant un Type défini par l'utilisateur (UDT, communément appelé Structure code> dans d'autres langues):

' 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 commentaires