Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
#16733
Estou com um problema numa macro que desenvolvi para meu serviço, o pessoal costuma usar 2 telas e diversas vezes o Excel está em uma delas porém, os MsgBox e UserForms abrem na outra. Como posso obter a posição na qual o Excel foi aberto e definir a posição de abertura dos MsgBox e UserForms em relação a do EXCEl?
#16748
Gilbertjuniors, boa noite!

Não estou certo que de entendi bem sua questão, mas imagino a dificuldade que está tendo, vou sugerir algumas idéias, ai você confirma se foi atendido ou não.


Instância do Aplicativo
Creio que está tendo problemas com Instância, isso ocorre quando trabalhamos com Formulários desenvolvidos no VBA:
Quando temos diversas pastas de trabalho abertas e em uma delas precisamos ativar um formulário, este impede o acesso as outros arquivos abertos.
Encontrei um artigo falando sobre instância do aplicativo, dá uma lida:
http://www.tomasvasquez.com.br/blog/mic ... a-do-excel
O pessoal costuma usar 2 telas e diversas vezes o Excel está em uma delas porém, os MsgBox e UserForms abrem na outra. Como posso obter a posição na qual o Excel foi aberto e definir a posição de abertura dos MsgBox e UserForms em relação a do EXCEl?
Sobre a citação acima, se entendi bem, o que não tenho certeza, é que o formulário de um arquivo se sobrepõe ao outro arquivo, neste caso eu recomento que utilize o método Initialize do formulário para ativar a pasta de trabalho a qual pertence o formulário:
Código: Selecionar todos
Private Sub UserForm_Initialize()
    
        ThisWorkbook.Activate
        Frm_Poste_Exemplo_do_seu_Arquivo.Show
    
End Sub
Dessa forma ao inicializar o formulário o comando ThisWorkbook.Activate irá manter ativo a pasta possui os códigos.
Entretanto creio que o problema ainda não acabe, teremos o problema de Instanciação das telas, por isso sugiro o seguinte, algo que faço em todos os formulários que crio no VBA:

Configure a propriedade ShowModal do formulário para False, dessa forma, mesmo que o Form sobreponha as planilhas, você consegue editar as células com o formulário ativo.

Mas pode ter um problema se o tamanho do Frm ativo tomar todo o campo de visão das planilhas, logo não vai conseguir visualizar o que há por trás, então recomendo que utilize APIs para manipulação das opção de janelas, assim os seus formulários vão ter a opção de Minimizar, Maximizar ativos, fica bem bacana de se trabalhar, é só colar os códigos abaixo:


1º Passo:
Em algum lugar do código, dentro do formulário em questão, cole a função abaixo (não é dentro de nenhum evento, é solta mesmo na página do código, mas tem que ser dentro do formulário):
Código: Selecionar todos
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
       (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
       (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
       (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) _
        As Long
Private Declare Function GetSystemMenu Lib "user32" _
       (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" _
       (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) _
        As Long

Private Const GWL_STYLE As Long = (-16)
Private Const WS_SYSMENU As Long = &H80000
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const SC_CLOSE As Long = &HF060
2º Passo:
Cole o código abaixo no evento Initialize do Frm:
Código: Selecionar todos
Private Sub UserForm_Initialize()
Dim lngFrmHndl As Long, lngStyle As Long
    
    lngFrmHndl = FindWindow(vbNullString, Me.Caption)
    lngStyle = GetWindowLong(lngFrmHndl, GWL_STYLE)
    lngStyle = lngStyle Or WS_SYSMENU Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLong lngFrmHndl, GWL_STYLE, lngStyle
    DrawMenuBar lngFrmHndl
    
End Sub
Estou anexando um arquivo de exemplo para entender como funciona.

Espero ter ajudado!
A dica foi útil? Dê um ->
Obrigado
Resolveu sua questão? Marque como -> Resolvido
#16795
No arquivo do Excel, dentro de um módulo tem uma SUB buscarInfo() que localiza todas as informações numa das planilhas e preenche a outra planilha(ambas dentro do mesmo arquivo), ao final esta SUB solicita abrir o formulario GerarImg.Show (que gera uma imagem jpeg do range que contem as informações).
O pessoal que usa o arquivo precisa comparar com um PDF referencia, abre o EXCEL num monitor e o PDF no outro porém, por diversas vezes, tanto este formulário, quando as MsgBox, abrem no monitor onde está o PDF e não sobre o Excel (monitor onde foi aberto o EXCEL).
Tentei colocar a linha ThisWorkbook.Activate antes da GerarImg.Show porém, não resolveu o problema.
#16798
Olá Gilberto,

Desculpe, mas ainda não entendi, tente postar um modelo dos dois arquivos, com dados fictícios para que possamos entender.
#16904
Os arquivos são da empresa que trabalho, não tenho acesso à Internet de lá.

A primeira etapa é copiar os dados de um PDF para a Planilha 2.
A segunda etapa é na Planilha 1 clicar em localizar, uma macro busca todas as informações importantes.
Ao final desta macro é aberto automaticamente um formulário para que o operador selecione uma página (quando os dados são muitos, o resultado é dividido em páginas, e cada uma gera uma imagem que é exportada ao ser selecionada).
Até aqui esta tudo em perfeita ordem.

O problema é que estes operadores trabalham com 2 monitores, em um fica o EXCEL e no outro o PDF e,
este formulário nem sempre abre sobre o EXCEL, muitas vezes abre no outro monitor sobre o PDF.
Quero travar a posição do userform sobre a posição do EXCEL que foi aberto ( e que roda a esta macro)

Segue print de uma simulação que fiz em casa.
Imagem
#16972
Achei um código no sitehttp://www.vbaexpress.com/kb/getarticle.php?kb_id=356 que resolveu o problema, grato pela ajuda, segue o código utilizado:

Private Sub UserForm_Initialize()

With UserForm1
.Top = Application.Top + 150 '< change 125 to what u want
.Left = Application.Left + 250 '< change 25 to what u want
End With

End Sub


Obs.: Usei a Sub UserForm_Initialize(), pois do jeito sugerido pelo site, o formulário piscava num monitor e em seguida aparecia no outro.


Att
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord