#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) очень жаль