Сохраняйте значение функции VBA в подпрограммах

#vba

#vba

Вопрос:

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

 Function SaveExcelDialog() As String
Dim strSelectedFolder As String
Dim strGetFolder As String

'Choosing the location of the folder where i will save all my recordset
With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "Select a Folder" 'window title
    .AllowMultiSelect = False   'avoiding multiple selection
    .Show
    strSelectedFolder = .SelectedItems.Item(1) 'taking the selected path folder
End With
GetFolder = strSelectedFolder 'returning the path of the folder
End Function
 
 Public Function ChooseTemplateFile() As String

' my variables
Dim strSelectedTemplateFile As String
Dim strTemplatePath As String

'selecting a template file
With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "Select a Template File" 'window title
    .AllowMultiSelect = False 'avoiding multiple selection
    .Filters.Add "Classeur Excel", "*.xls; *.xlsx; *.xlsm" 'filter all the file that are allow to be choosen
    .Show
    
    'storing the path of my excel file
   TemplateFile = .SelectedItems.Item(1) 'keeping the path
End With
strTemplatePath = strSelectedTemplateFile 'returning  the path string value
End Function
 

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

 Private Sub Run_Click()
'My Data Variables
Dim strCountry, strSelectedYear, strLink, strCountryLink, strDomain, strDomainLink, strDateLink, DOsSQL As String
Dim iSelectedYear As Integer
Dim strGetFolder, strTemplatePath As String
Dim i As Long
'Variables for query
Dim qdf As DAO.QueryDef
Dim qdfDOs As DAO.QueryDef

Dim rs As DAO.Recordset
Dim rsDOs As DAO.Recordset

strTemplatePath = ChooseTemplateFile() ' value are not kept they are erase as soon as i go to the next line
strGetFolder = SaveExcelDialog() ' value are not kept they are erase as soon as i go to the next line

'taking the value of the file and the folder picked
Dim db As DAO.Database
Dim arrReports(4, 3) As String
Dim strReportTitle As String....
 

Ответ №1:

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

Вместо этого, похоже, вы пытаетесь присвоить значения внешним переменным изнутри функций.

Это может работать с несколькими изменениями, но более обычно (и безопаснее) делать следующее:

 Function SaveExcelDialog() As String
    'Choosing the location of the folder where i will save all my recordset
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Select a Folder" 'window title
        .AllowMultiSelect = False   'avoiding multiple selection
        .Show
        'To return a value from a function, assign it to the function's name.
        SaveExcelDialog = .SelectedItems.Item(1) 
    End With
End Function
 
 Public Function ChooseTemplateFile() As String
    'selecting a template file
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Select a Template File" 'window title
        .AllowMultiSelect = False 'avoiding multiple selection
        .Filters.Add "Classeur Excel", "*.xls; *.xlsx; *.xlsm" 'filter all the file that are allow to be choosen
        .Show
        'Again, let's just assign the result to the name, in order to
        'return the value.
        ChooseTemplateFile = .SelectedItems.Item(1)
    End With
End Function
 

Если хотите, вы можете написать тестовую процедуру, чтобы убедиться, что ваши значения сохраняются в переменных.

 Public Sub TestFilePickers()

    Dim strGetFolder, strTemplatePath As String

    strTemplatePath = ChooseTemplateFile()
    strGetFolder = SaveExcelDialog()

    Debug.Print(strTemplatePath)
    Debug.Print(strGetFolder)

End Sub
 

Комментарии:

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

2. Не могли бы вы в своем вопросе указать место в своем коде, где вы пытаетесь использовать значения? В настоящее время я вижу, что вы присваиваете их переменным, но я не понимаю, что вы пытаетесь сделать с этими переменными.

3. Я вызываю другую функцию в моей основной подпрограмме RecordsetToExcel rs, «Invoicing_» amp; strCountry amp; » » amp; strSelectedYear amp; » » amp; arrReports(i, 0) amp; «.xlsx», strGetFolder, strTemplatePath и т. Д., Где я пытаюсь получить значение, чтобы отправить их в этот общедоступный подраздел функции RecordsetToExcel(rs как набор записей, excelFileName, strGetFolder, strTemplatePath как строка)

4. Извините, что это сработало, я не был внимателен к ChooseTemplateFile = .SelectedItems . Пункт (1) очень жаль