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.
  • Avatar do usuário
Por JuliaMorais
#62066
RESOLVIDO
Olá pessoal, estou criando uma planilha para registrar dados de pH em um relatório. A ideia principal é que a pessoa "clique" nos botões de pH (Imagem 1) e eles sejam inseridos na tabela da Imagem 2. No total são 200 amostras, então a pessoa vai clicando e adicionando na planilha seguindo a ordem apresentada na Imagem 2.
Porém não tenho ideia de como colocar esse comando, e como fazer para ir mudando as linhas.
Se alguém puder me ajudar, obrigada
Imagem
Editado pela última vez por JuliaMorais em 11 Fev 2021 às 10:03, em um total de 1 vez.
Avatar do usuário
Por AfonsoMira
Posts Avatar
#62068
Boas, consegue disponibilizar o seu ficheiro, para o podermos ajudar melhor?
Obrigado! :D
Por JuliaMorais
#62071
Anexei a planilha que estou usando, porém fiz umas modificações. Nós temos apenas o número máximo de amostras por categoria, então criei uma aba para cada e uma lista suspensa. Então escolhendo a "categoria pH 48 amostras" os dados devem ser gravados nessa aba. Acho que assim ficará mais fácil de passar para o relatório.
O que preciso de ajuda é em como armazenar nas células o que eu cliquei. Pois se clico 48x preciso que mude de linha, coluna e preencha todos os quadros.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por AfonsoMira
Posts Avatar
#62072
Então fiz o código para o botão 6.08.
Agora só precisa duplicar para os restantes, o mesmo código, alterando apenas o número dos botões.

Dica: Altere o nome de todos os botões para ficar mais organizado.
Você não está autorizado a ver ou baixar esse anexo.
JuliaMorais agradeceu por isso
Por osvaldomp
#62090
Segue outra solução. Veja se aproveita.

Preparação:
1. no intervalo nomeado existente "categorias" (planilha Lista) coloque os nomes corretos das planilhas, para isso rode o código abaixo que irá elaborar na coluna A a lista com os nomes das planilhas, em seguida copie e cole em "categorias" (célula B4), menos os dois primeiros nomes. A Validação existente naquele intervalo será excluída.
Sub ListaPlanilhas()
Dim ws As Worksheet
[A:A] = ""
For Each ws In ThisWorkbook.Worksheets
Cells(Rows.Count, 1).End(3)(2) = ws.Name
Next ws
End Sub


2. para carregar o Form atual utilize o código abaixo no Módulo1, assim você poderá efetuar outras operações como ativar outra planilha, inserir dados, etc., enquanto o Form estiver carregado.
Sub CarregaForm()
UserForm1.Show vbModeless
End Sub


3. no atual módulo do Form exclua o código Private Sub ComboBox1_Change() que lá existe pois não será necessário e poderá interferir nas operações.

4. no módulo do Form cole uma cópia do código abaixo.
Option Explicit
Dim Buttons() As New BtnClass
Private Sub UserForm_Initialize()
Dim BuCont As Integer, ctl As Control
For Each ctl In UserForm1.Controls
If TypeName(ctl) = "CommandButton" Then
If ctl.Caption Like "LIMPAR*" Or ctl.Caption Like "EMITIR*" Or ctl.Caption Like "VER*" Then Exit Sub
BuCont = BuCont + 1
ReDim Preserve Buttons(1 To BuCont)
Set Buttons(BuCont).ButtonGroup = ctl
End If
Next ctl
End Sub


5. insira um Módulo de Classe, assim: no menu do editor de VBA clique em Inserir | Módulo de classe; renomeie de BtnClass (para renomear clique no menu Exibir | Janela Propriedades e no campo name cole BtnClass.
Na janela do módulo de classe cole uma cópia do código abaixo.
Option Explicit
Public WithEvents ButtonGroup As MsForms.CommandButton
Private Sub ButtonGroup_Click()
Dim LR As Long, LC As Long
If UserForm1.ComboBox1.Text = "" Then MsgBox " NO CAMPO 'Selecione a Leitura'" & vbLf & "SELECIONE A PLANILHA QUE RECEBERÁ OS DADOS": Exit Sub
With Sheets(UserForm1.ComboBox1.Text)
If .[A1] = "" Then
.[A1] = CDbl(ButtonGroup.Caption)
Else: LR = .[A:J].Find(what:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
LC = .Cells(LR, Columns.Count).End(1).Column
If LC = 10 Then
.Cells(LR + 1, 1) = CDbl(ButtonGroup.Caption)
Else: .Cells(LR, LC + 1) = CDbl(ButtonGroup.Caption)
End If
End If
End With
End Sub


Done!
funcionamento - a partir de qualquer planilha carregue o Form .
Selecione na ComboBox o nome da planilha que receberá os dados e vá clicando nos botões do Form para inserir os valores de pH. Os valores serão inseridos na planilha selecionada na ComboBox, a partir de A1, por linhas, de A até J.

Se você quiser, poderemos ajustar o código para lançar os dados diretamente na planilha Laudo, conforme o seu primeiro post.
JuliaMorais agradeceu por isso
Por JuliaMorais
#62123
AfonsoMira escreveu:Então fiz o código para o botão 6.08.
Agora só precisa duplicar para os restantes, o mesmo código, alterando apenas o número dos botões.

Dica: Altere o nome de todos os botões para ficar mais organizado.
Olá Afonso, muito obrigada pela ajuda! Estou com outro probleminha na tabela, será que você consegue me ajudar?

O número de amostras a serem testadas não é fixo, então coloquei valores máximos de cada categoria (qntd de células no relatório fixo). Mas pode ser que no dia sejam medidos uma menor quantidade de amostras. Sendo assim, queria que a média que está na célula (17,"B") só fosse calculada com os valores preenchidos. Esses valores são todos abaixo dessa célula (somatório de todas categorias p/ baixo). O mesmo seria feito para o Desvio na célula (17,"D). Já o valor mín e máx também devem pegar somente os valores preenchidos. Esses cálculos podem ser feitos por código no vba? Pois queria que ao clicar no botao "emitir laudo" já fossem atualizados esses valores.

Obs: Coloquei uma regra para ficar cinza todas as células que estiverem com o valor "0,00", para facilitar visualização.

Anexei o arquivo em questão
Você não está autorizado a ver ou baixar esse anexo.
Por JuliaMorais
#62124
osvaldomp escreveu: 10 Fev 2021 às 00:15 Segue outra solução. Veja se aproveita.

Preparação:
1. no intervalo nomeado existente "categorias" (planilha Lista) coloque os nomes corretos das planilhas, para isso rode o código abaixo que irá elaborar na coluna A a lista com os nomes das planilhas, em seguida copie e cole em "categorias" (célula B4), menos os dois primeiros nomes. A Validação existente naquele intervalo será excluída.
Sub ListaPlanilhas()
Dim ws As Worksheet
[A:A] = ""
For Each ws In ThisWorkbook.Worksheets
Cells(Rows.Count, 1).End(3)(2) = ws.Name
Next ws
End Sub


2. para carregar o Form atual utilize o código abaixo no Módulo1, assim você poderá efetuar outras operações como ativar outra planilha, inserir dados, etc., enquanto o Form estiver carregado.
Sub CarregaForm()
UserForm1.Show vbModeless
End Sub


3. no atual módulo do Form exclua o código Private Sub ComboBox1_Change() que lá existe pois não será necessário e poderá interferir nas operações.

4. no módulo do Form cole uma cópia do código abaixo.
Option Explicit
Dim Buttons() As New BtnClass
Private Sub UserForm_Initialize()
Dim BuCont As Integer, ctl As Control
For Each ctl In UserForm1.Controls
If TypeName(ctl) = "CommandButton" Then
If ctl.Caption Like "LIMPAR*" Or ctl.Caption Like "EMITIR*" Or ctl.Caption Like "VER*" Then Exit Sub
BuCont = BuCont + 1
ReDim Preserve Buttons(1 To BuCont)
Set Buttons(BuCont).ButtonGroup = ctl
End If
Next ctl
End Sub


5. insira um Módulo de Classe, assim: no menu do editor de VBA clique em Inserir | Módulo de classe; renomeie de BtnClass (para renomear clique no menu Exibir | Janela Propriedades e no campo name cole BtnClass.
Na janela do módulo de classe cole uma cópia do código abaixo.
Option Explicit
Public WithEvents ButtonGroup As MsForms.CommandButton
Private Sub ButtonGroup_Click()
Dim LR As Long, LC As Long
If UserForm1.ComboBox1.Text = "" Then MsgBox " NO CAMPO 'Selecione a Leitura'" & vbLf & "SELECIONE A PLANILHA QUE RECEBERÁ OS DADOS": Exit Sub
With Sheets(UserForm1.ComboBox1.Text)
If .[A1] = "" Then
.[A1] = CDbl(ButtonGroup.Caption)
Else: LR = .[A:J].Find(what:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
LC = .Cells(LR, Columns.Count).End(1).Column
If LC = 10 Then
.Cells(LR + 1, 1) = CDbl(ButtonGroup.Caption)
Else: .Cells(LR, LC + 1) = CDbl(ButtonGroup.Caption)
End If
End If
End With
End Sub


Done!
funcionamento - a partir de qualquer planilha carregue o Form .
Selecione na ComboBox o nome da planilha que receberá os dados e vá clicando nos botões do Form para inserir os valores de pH. Os valores serão inseridos na planilha selecionada na ComboBox, a partir de A1, por linhas, de A até J.

Se você quiser, poderemos ajustar o código para lançar os dados diretamente na planilha Laudo, conforme o seu primeiro post.
Olá Osvaldo, muito obrigada pela ajuda! Estou com outro probleminha na tabela, será que você consegue me ajudar?

O número de amostras a serem testadas não é fixo, então coloquei valores máximos de cada categoria (qntd de células no relatório fixo). Mas pode ser que no dia sejam medidos uma menor quantidade de amostras. Sendo assim, queria que a média que está na célula (17,"B") só fosse calculada com os valores preenchidos. Esses valores são todos abaixo dessa célula (somatório de todas categorias p/ baixo). O mesmo seria feito para o Desvio na célula (17,"D). Já o valor mín e máx também devem pegar somente os valores preenchidos. Esses cálculos podem ser feitos por código no vba? Pois queria que ao clicar no botao "emitir laudo" já fossem atualizados esses valores.

Obs: Coloquei uma regra para ficar cinza todas as células que estiverem com o valor "0,00", para facilitar visualização.

Anexei o arquivo em questão
Você não está autorizado a ver ou baixar esse anexo.
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