Essa pergunta parece corresponder exatamente ao que estou procurando em termos de declaração de uma variável que pode ser chamada e retém informações de qualquer lugar.
Tenho um userform que fornece um número de projeto e um caminho de arquivo como string e tenho outro como booleano para determinar se o botão OK ou CANCELAR foi selecionado e como proceder quando o processo retorna ao sub. Da pesquisa que estava fazendo, parece indicar que a maneira mais fácil de fazer isso é por meio de algo chamado variável global. Embora essa possa ser a maneira mais fácil, é a maneira correta?
Tentei colocar minha declaração de variável no topo da folha de código antes do primeiro sub/fun na Sheet3, onde está a maior parte do meu código e onde está o código de clique do botão para iniciar o formulário do usuário. Também tentei colocá-lo no topo do código em ThisWorkBook. E também tentei colocá-lo no topo da página de código para o formulário do usuário associado.
Eu só os declaro em um lugar. Eu não os declaro em vários lugares ao mesmo tempo.
Quando declaro na Planilha3 recebo um erro em um sub colocado no código do userform
Código associado:
Private Sub OKBtn_Click()
strPPTFilepath = PPTPath.text
strProjectNumber = ProjectNoTextBox.text
bCancelled = False
End Sub
Quando declaro em ThisWorkBook recebo:
E o código que causa o erro está localizado na Planilha3 e é o seguinte:
Private Sub LoadPPT_Click()
Dim frm As PPT_Picker_Form
Dim wbPPT As Workbook
Dim wsPPT As Worksheet
Dim rngTopLeft As Range
Dim lngLastUsedRow As Long
Dim lngLastCo As Long
'Public strPPTFilepath As String
'Public strProjectNumber As String
Set frm = UserForms.Add(PPT_Picker_Form.Name)
frm.ListData = ThisWorkbook.Worksheets("Project Numbers").ListObjects("Project_Number_List").DataBodyRange
frm.show
Unload frm
If bCancelled Then '<----this is the undeclared variable
Exit Sub
End If
'Define PPT Table
Set wbPPT = Workbooks.Add(strPPTFilepath)
Set wsPPT = wbPPT.Worksheets("Fee Estimate")
'Find top left corner
With wsPPT.Cells
Set rngTopLeft = .Find("WBS Code", LookIn:=xlValues)
If rngTopLeft Is Nothing Then
'nothing found
'add a manual cell picker routine
End If
End With
'Find last row
'find Right edge
' strProjectNumber
End Sub
Quando declaro isso na área de código do formulário de usuário, recebo o mesmo erro acima no mesmo local.
Pergunta
Qual é a maneira correta de passar informações de um formulário para um sub na planilha3?
Atualizar
Puta merda, não acredito que esqueci de mostrar o código para declarar minhas variáveis, então aqui está:
'set it so that all subs and functions require variables to be dimensioned
Option Explicit
'variable available across all modules?
Public strPPTFilepath As String
Public strProjectNumber As String
Public bCancelled As Boolean
Você também pode declarar uma variável pública no topo do módulo de formulário:
Public bCancelled As Boolean
Isso pode ser definido pelo código no formulário do usuário e lido pelo código de chamada:
Isso evita a criação de uma variável global em nível de projeto.
Você pode usar uma variável pública para que o script possa acessá-la tanto do módulo
UserForm
,ThisWorkbook
quanto do módulo worksheet. As variáveis públicas devem ser declaradas em um módulo padrão em vez de em outros módulos.No editor VBA (VBE)
Insert -> Module
, adicione a linha abaixo naCode
janela.Documentação da Microsoft: