2014-11-18 2 views
0

Я проверил Google и предлагаемые ответы здесь, но к сожалению, к сожалению.Visual Basic - Как использовать переменную от одной функции в другой

Последнее, что мне нужно сделать, это отправить электронное письмо в поле электронной почты, указав rateNbr, но оно просто пусто.

Я попытался сделать Public Function FuncRateCheckFile как Public Function FuncRateCheckFile(ByVal rateNbr As String), чтобы попытаться включить его для вызова вне функции, но тогда это прерывает функцию, когда она вызывается в другом месте. :(

Вот код, с комментариями относительно того, где я имею в виду:

Public Function FuncRateCheckFile() 

    Dim blnContinue As Boolean 
    Dim strLine As String 
    Dim strSearchFor, strSearchWrd, LineCount, objFSO, objTextFile, arrLines 
    Dim dteNow As Date 
    Dim newDate As String 
    '//============================================================================================== 
    '// DECLARED 
    Dim rateNbr As String 
    '//============================================================================================== 

    FuncRateCheckFile = False 
    blnContinue = True 


    If blnContinue Then 

     Const ForReading = 1 
      'Get todays date and reformat it 
      dteNow = DateValue(Now) 
      newDate = Format(dteNow, "dd/MM/yy") 
      strSearchWrd = newDate 
      'Read the whole file 
      Set objFSO = CreateObject("Scripting.FileSystemObject") 
      Set objTextFile = objFSO.OpenTextFile(m_RateCheckFile, ForReading) 

      LineCount = 0 
      Do Until objTextFile.AtEndOfStream 

       strLine = objTextFile.ReadLine() 

       If InStr(strLine, strSearchWrd) <> 0 Then 

        arrLines = Split(strLine, vbCrLf) 
        LineCount = LineCount + 1 

       End If 
      Loop 

       'Log a message to state how many lines have todays day, and if there are none, log an error 
       If LineCount <> 0 Then 
        '//============================================================================================== 
        '// "rateNbr" IS WHAT I AM TRYING TO GET TO PUT IN THE EMAIL 
        LogMessage "Rate file date is correct" 
        rateNbr = "Number of rates for " & newDate & " in the file recieved on " & newDate & " is " & LineCount 
        LogMessage rateNbr 
        EmailAdvice2 
        objTextFile.Close 
        '//============================================================================================== 

       Else 

        blnContinue = False 
        LogError "Failed to retrieve Current Rate date, please check rate file.." 
        EmailAdvice 
        objTextFile.Close 

       End If 

    End If 

    FuncRateCheckFile = blnContinue 

    LogMessage "Completed Check Rate file" 

End Function 


Private Function EmailAdvice2() 


Dim strSMTPFrom As String 
Dim strSMTPTo As String 
Dim strSMTPRelay As String 
Dim strTextBody As String 
Dim strSubject As String 
Dim oMessage As Object 
'//============================================================================================== 
'// DECLARED AGAIN 
Dim rateNbr As String 
'//============================================================================================== 

Set oMessage = CreateObject("CDO.Message") 
strSMTPFrom = "[email protected]" 
strSMTPTo = "[email protected]" 
strSMTPRelay = "smtp.relay.com" 
'//============================================================================================== 
'// THIS MAKES THE TEXT BODY BLANK, BUT THE EMAIL STILL SENDS 
strTextBody = rateNbr 
'//============================================================================================== 
strSubject = "Todays rates" 
'strAttachment = "full UNC path of file" 

oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTPRelay 
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
oMessage.Configuration.Fields.Update 

oMessage.Subject = strSubject 
oMessage.From = strSMTPFrom 
oMessage.To = strSMTPTo 
oMessage.textbody = strTextBody 
'oMessage.AddAttachment strAttachment 


oMessage.Send 

End Function 

Я уверен, что он пустой, потому что я объявил rateNbr под EmailAdvice2(), а потом не дал ему ничего, чтобы заполнить переменная с. Но я не знаю, как сделать это называть переменную под FuncRateCheckFile().

Спасибо всем за любую помощь.

+1

Как это, ваш вопрос код свалка. Пожалуйста, уменьшите код до минимального примера, необходимого для иллюстрации вашей проблемы. – xxbbcc

+1

Посмотрите на 'Scope'; объявленный внутри процедуры, 'rateNbr' существует только локально. Таким образом, у вас есть 2 из них, один в 'FuncRateCheckFile' и' EmailAdvice2'. Это даже VB.NET? Существует очень синтаксис VBA и использование объектов, например, с объектом FileScripting. – Plutonix

+0

Вы опубликовали очень неопределенное (и несколько бессвязное) описание проблемы и огромную стену кода. Здесь не все проблемы. Пожалуйста, отредактируйте, чтобы четко сформулировать проблему, уменьшите код до минимального ** минимального **, необходимого для вашего вопроса, и задайте конкретный вопрос об этом коде. –

ответ

1

как указано Plutonix, это вопрос сфера.

Переместить декларацию переменной «» rateNbr к уровню класса, и удалить локальные объявления в ваших функциях:

Dim rateNbr As String ' <-- out at class level it will be accessible from both functions 

Public Function FuncRateCheckFile() 
    ... 
    ' REMOVE both the decalarations of "rateNbr" that are INSIDE your functions 
    ... 
End Function 

Private Function EmailAdvice2() 
    ... 
    ' REMOVE both the decalarations of "rateNbr" that are INSIDE your functions 
    ... 
End Function 
+0

Ах, человек. Это было так очевидно, что я чувствую себя немного глупо сейчас. Полагаю, иногда вам просто нужны еще две глаза. Большое спасибо, я очень ценю вашу помощь! – Chris

Смежные вопросы