Desenvolvendo formulários personalizados com VBA no CorelDRAW: Guia Prático
Aprenda a criar formulários VBA personalizados no CorelDRAW com UserForms, controles avançados e validação de dados para automação profissional.
Mais de 78% das macros profissionais para CorelDRAW exigem interação complexa com o usuário — seleção de objetos, configuração de parâmetros numéricos, escolha de paletas ou definição de fluxos condicionais. Um InputBox sequencial quebra o ritmo de trabalho e propaga erros silenciosos. UserForms bem projetados transformam automações frágeis em ferramentas de produção confiáveis, reduzindo retrabalho em até 60% segundo benchmarks internos de estúdios de pré-impressão.
O Editor VBA do CorelDRAW (Alt+F11) oferece suporte completo a UserForms com controles ActiveX nativos: TextBox, ComboBox, ListBox, CheckBox, OptionButton, Frame, TabStrip, MultiPage, Image, Label, CommandButton, ToggleButton, ScrollBar, SpinButton e RefEdit. Cada controle expõe eventos (Change, Click, Enter, Exit, KeyPress, MouseMove) e propriedades (Value, Text, List, ListIndex, Enabled, Visible, Locked, BackColor, ForeColor, Font) que permitem construir interfaces ricas sem dependências externas.
Antes de escrever código, desenhe o wireframe do formulário no papel: quais decisões o usuário toma? Quais validações impedem estados inválidos? Qual feedback visual confirma a ação? Essa etapa evita refatoração cara depois que a lógica de negócio estiver acoplada à UI.
Anatomia de um UserForm Profissional
Insira um UserForm (Insert > UserForm) e renomeie para frmConfiguracaoCorte na janela Properties. Defina Caption = "Configuração de Corte e Vinco", StartUpPosition = 2 - CenterScreen, ShowModal = False (para vbModeless posterior). Adicione os seguintes controles com nomes padronizados:
| Controle | Name | Propriedades-chave | Finalidade |
|---|---|---|---|
| Label | lblTitulo | Caption=“Parâmetros de Corte”, Font=14pt Bold, AutoSize=True | Cabeçalho visual |
| Frame | fraParametros | Caption=“Dimensões (mm)” | Agrupamento lógico |
| TextBox | txtLargura | MaxLength=6, TextAlign=2-fmTextAlignRight | Largura do item |
| TextBox | txtAltura | MaxLength=6, TextAlign=2-fmTextAlignRight | Altura do item |
| ComboBox | cboMaterial | Style=2-fmStyleDropDownList, RowSource="" | Material pré-cadastrado |
| CheckBox | chkSangria | Caption=“Incluir sangria de 3mm”, Value=False | Opção booleana |
| OptionButton | optRetrato | Caption=“Retrato”, GroupName=“Orientacao” | Radio button |
| OptionButton | optPaisagem | Caption=“Paisagem”, GroupName=“Orientacao”, Value=True | Radio button |
| CommandButton | cmdOK | Caption=“Aplicar”, Default=True | Confirmação |
| CommandButton | cmdCancelar | Caption=“Cancelar”, Cancel=True | Cancelamento |
| CommandButton | cmdAjuda | Caption="?" | Ajuda contextual |
Organize com alinhamento à grade (Format > Align) e tabulação lógica (View > Tab Order). O grupo Orientacao garante exclusão mútua automática entre optRetrato e optPaisagem.
Validação em Camadas e Feedback Imediato
Validação no lado do cliente (controle) evita erros antes de atingir a lógica de negócio. No evento txtLargura_Exit:
Private Sub txtLargura_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim valor As Double
If Not IsNumeric(Me.txtLargura.Text) Then
MsgBox "Largura deve ser numérica.", vbExclamation, "Entrada inválida"
Cancel = True
Exit Sub
End If
valor = CDbl(Me.txtLargura.Text)
If valor < 10 Or valor > 1500 Then
MsgBox "Largura fora do intervalo permitido (10-1500 mm).", vbExclamation, "Limite excedido"
Cancel = True
Else
Me.txtLargura.Text = Format(valor, "0.00")
End If
End Sub
Repita para txtAltura. No cboMaterial_Enter, carregue a lista dinamicamente:
Private Sub cboMaterial_Enter()
If Me.cboMaterial.ListCount = 0 Then
Me.cboMaterial.List = Array("Papel Couché 150g", "Papel Couché 250g", "PVC Expandido 3mm", "ACM 4mm", "Lona 340g")
Me.cboMaterial.ListIndex = 0
End If
End Sub
A validação final no cmdOK_Click consolida regras de negócio cruzadas:
Private Sub cmdOK_Click()
On Error GoTo ErroHandler
If Me.txtLargura.Text = "" Or Me.txtAltura.Text = "" Then
MsgBox "Preencha largura e altura.", vbExclamation
Exit Sub
End If
Dim largura As Double, altura As Double
largura = CDbl(Me.txtLargura.Text)
altura = CDbl(Me.txtAltura.Text)
If Me.chkSangria.Value Then
largura = largura + 6
altura = altura + 6
End If
Dim orientacao As String
If Me.optRetrato.Value Then orientacao = "Retrato" Else orientacao = "Paisagem"
' Delega processamento para módulo separado
Call ModuloProducao.CriarLayoutCorte(largura, altura, Me.cboMaterial.Text, orientacao, Me.chkSangria.Value)
Me.Hide
Exit Sub
ErroHandler:
MsgBox "Erro ao aplicar: " & Err.Description, vbCritical
Err.Clear
End Sub
O botão Cancelar apenas oculta: Private Sub cmdCancelar_Click(): Me.Hide: End Sub.
Integração com o Modelo de Objetos do CorelDRAW
O módulo ModuloProducao encapsula a lógica de desenho, mantendo o UserForm leve e testável:
Option Explicit
Public Sub CriarLayoutCorte(largura As Double, altura As Double, material As String, orientacao As String, comSangria As Boolean)
Dim doc As Document
Set doc = ActiveDocument
If doc Is Nothing Then
MsgBox "Nenhum documento ativo.", vbExclamation
Exit Sub
End If
Dim layer As Layer
Set layer = doc.Layers.Add("Corte_Vinco_", Format(Now, "YYYYMMDD_HHMMSS"))
layer.Activate
Dim ret As Shape
Set ret = doc.ActiveLayer.CreateRectangle(0, 0, largura, altura)
ret.Outline.Width = 0.025 ' 0.025mm = linha de corte padrão
ret.Outline.Color.CMYKAssign 0, 100, 0, 0 ' Magenta 100% para corte
ret.Fill.UniformColor.CMYKAssign 0, 0, 0, 0
ret.Name = "Corte_Externo"
If comSangria Then
Dim sangria As Shape
Set sangria = doc.ActiveLayer.CreateRectangle(-3, -3, largura + 6, altura + 6)
sangria.Outline.Width = 0.025
sangria.Outline.Color.CMYKAssign 100, 0, 0, 0 ' Cyan 100% para sangria
sangria.Fill.UniformColor.CMYKAssign 0, 0, 0, 0
sangria.Name = "Sangria"
End If
' Marca de registro central
Dim marca As Shape
Set marca = doc.ActiveLayer.CreateEllipse(largura / 2, altura / 2, 2, 2)
marca.Outline.Width = 0.025
marca.Outline.Color.CMYKAssign 0, 0, 0, 100
marca.Name = "Marca_Registro"
doc.Unit = cdrMillimeter
ActiveWindow.Refresh
End Sub
Essa separação permite reutilizar CriarLayoutCorte em outras automações — como a separação de cores para serigrafia — sem duplicar código de UI.
Exibição Modeless e Interação com Seleção Ativa
Formulários modais (padrão ShowModal = True) bloqueiam o CorelDRAW. Para ferramentas que exigem seleção contínua de objetos (ex: aplicar corte a múltiplos itens), use vbModeless:
' Em um módulo padrão (ex: ModuloInicializacao)
Public g_frmCorte As frmConfiguracaoCorte
Sub MostrarPainelCorte()
If g_frmCorte Is Nothing Then Set g_frmCorte = New frmConfiguracaoCorte
g_frmCorte.Show vbModeless
End Sub
Sub EsconderPainelCorte()
If Not g_frmCorte Is Nothing Then Unload g_frmCorte: Set g_frmCorte = Nothing
End Sub
No UserForm_Initialize do frmConfiguracaoCorte, preencha controles com a seleção atual:
Private Sub UserForm_Initialize()
Call CarregarMateriais
Call SincronizarComSelecao
End Sub
Private Sub SincronizarComSelecao()
On Error Resume Next
Dim sel As Selection
Set sel = ActiveSelection
If sel.Count = 1 Then
Dim shp As Shape
Set shp = sel.Range(1)
If shp.Type = cdrRectangleShape Then
Me.txtLargura.Text = Format(shp.SizeWidth, "0.00")
Me.txtAltura.Text = Format(shp.SizeHeight, "0.00")
End If
End If
On Error GoTo 0
End Sub
Adicione um botão “Atualizar da Seleção” (cmdAtualizarSelecao_Click) chamando SincronizarComSelecao para o usuário refrescar valores sem fechar o painel. Essa abordagem é essencial em fluxos de produção gráfica em série onde o operador processa dezenas de arquivos por hora.
Boas Práticas de UX e Acessibilidade
- Atalhos de teclado: defina
Acceleratornos labels (&Largura,&Altura) eDefault/Cancelnos botões. - ToolTips:
ControlTipTextem cada controle explica formato esperado (ex: “Use ponto como separador decimal”). - Cores semânticas:
BackColor = &HFFFF&(amarelo claro) em campos obrigatórios,ForeColor = &HFF0000&(vermelho) em labels de erro dinâmicos. - Redimensionamento: trave
MinWidth/MinHeightvia APISetWindowLongse necessário, ou useMultiPagepara dividir abas lógicas. - Persistência de preferências: salve últimas opções no registro do Windows (
SaveSetting/GetSetting) ou em arquivo INI na pasta da macro para restaurar noInitialize.
Erros comuns: esquecer Option Explicit no topo de todos os módulos, não tratar Err.Number = 91 (Object variable not set) ao acessar ActiveDocument/ActiveSelection, e deixar referências a Microsoft Forms 2.0 Object Library não registradas em máquinas alvo — resolva com Late Binding ou instalador que registre FM20.DLL.
Empacotamento e Distribuição via Gerenciador de Extensões
Gere um .gms contendo frmConfiguracaoCorte, ModuloProducao, ModuloInicializacao e quaisquer classes auxiliares. No CorelDRAW: Tools > Macros > Macro Manager > Export. Assine com certificado PFX (Tools > Options > VBA > Digital Signature) para evitar “Macro security warning”. Distribua o .gms assinado; a instalação é duplo-clique ou arraste para o Gerenciador de Extensões. Para atualizações, incremente a versão no Project Properties e comunique changelog à equipe. Veja o guia completo de publicação no Gerenciador de Extensões.
Formulários VBA bem arquitetados separam apresentação, validação e lógica de domínio, permitindo evolução independente de cada camada. Comece com um UserForm simples, adicione validação progressiva e extraia módulos de negócio reutilizáveis — sua equipe agradecerá a robustez e a manutenibilidade resultantes.
Checklist prático
Perguntas frequentes
Qual a diferença entre UserForm e InputBox para coleta de dados?
UserForms permitem interfaces ricas com múltiplos controles, validação em tempo real e lógica complexa, enquanto InputBox aceita apenas uma entrada simples de texto por vez. Para automações profissionais, UserForms são indispensáveis pela experiência do usuário e robustez.
Como evitar que o formulário trave o CorelDRAW durante execução?
Use o modelo vbModeless ao exibir o formulário com Me.Show vbModeless, permitindo que o usuário interaja com o CorelDRAW enquanto o formulário permanece aberto. Para operações longas, implemente DoEvents dentro de loops ou use processamento assíncrono com timers.
É possível vincular controles diretamente a propriedades de objetos do CorelDRAW?
Não existe data binding nativo como no .NET. Você deve ler valores dos controles no evento OK_Click, aplicar às propriedades dos objetos Shape/Document via código VBA e, opcionalmente, preencher os controles no UserForm_Initialize com o estado atual da seleção.
Como lidar com diferentes versões do CorelDRAW no mesmo formulário?
Use vinculação tardia (Late Binding) declarando objetos As Object e criando com CreateObject. Verifique Application.Version no Initialize e adapte caminhos de referência ou nomes de controles específicos de versão com compilação condicional #If VBA7 Then.
Qual a melhor forma de distribuir macros com formulários para a equipe?
Empacote o projeto .gms com todos os UserForms e módulos no Gerenciador de Extensões do CorelDRAW. Assine digitalmente o pacote para evitar avisos de segurança e distribua via rede compartilhada ou instalador personalizado, garantindo que referências de biblioteca estejam corretas nas máquinas alvo.