Строковая переменная возвращает пустую, несмотря на присвоение значения

#excel #vba #global-variables

Вопрос:

У меня есть пользовательская форма, я открываю книгу из диалогового окна, а затем создаю новую книгу на основе шаблона. Я хочу присвоить имена обоих файлов расширение (.xlsm) строке, которую я буду использовать в методе копирования.

Я новичок в VBA, все это код пользовательской формы:

 Public Sub Btn1_Click()
Dim FileName1 As String
Dim FileToOpen As Variant
Dim OpenBook As Workbook
    FileToOpen = Application.GetOpenFilename(Title:="Choose file to poen", FileFilter:="Excel Files (*.xlsm*),*xls*")
    If FileToOpen <> False Then
        Set OpenBook = Application.Workbooks.Open(FileToOpen)
        TextBox1.Value = FileToOpen
    End If
FileName1 = OpenBook.Name
End Sub
 
 Public Sub Btn2_Click()
Dim FileName2 As String
Dim wb As Workbook
Dim fPth As Object
Set fPth = Application.FileDialog(msoFileDialogSaveAs)

If choice1 = True Then
    Set wb = Workbooks.Add("path to file template 1")
ElseIf choice2 = True Then
    Set wb = Workbooks.Add("path to file template 2")
End If

With fPth
  .InitialFileName = Filename amp; ".xlsm"
  .Title = "Please choose a name for your new file"
  .InitialView = msoFileDialogViewList
  If .Show <> 0 Then
    wb.SaveAs Filename:=.SelectedItems(1), FileFormat:=xlOpenXMLWorkbookMacroEnabled
  End If
End With
FileName2 = wb.Name
End Sub
 

Все, что я пытаюсь сделать, это использовать FileName1 и FileName2 в моем методе копирования, который я также назначу кнопке и запустится, как только оба файла будут открыты.

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

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

1. Чтение о области видимости переменной должно быть полезным.

2. Я специально читал эту статью, возможно, пропустил некоторые моменты, но я попытался установить для переменной значение Public (которое возвращало ошибку) из Dim, затем Static (тот же результат) и обратно в Dim. Так что не совсем уверен. Что делать.

3. Поместите Option Explicit поверх своего кода, посмотрите на результат, затем снова обратитесь к статье scope .

4. Я не могу читать. Спасибо

Ответ №1:

 Option Explicit
Public FileName1 As String
Public FileName2 As String
 

В начале моего модуля проблема решена.