Usuário com melhor resposta
Creating Data Grouping with vba

Pergunta
-
Hi all,
I have a problem and do not know how to solve.
Digite um texto ou endereço de um site ou traduza um documento.
Cancelar
I have the following sample worksheet:
A B C
frutas
vegetais
verdura
So I need to activate a macro that calls a userform and I ask the following question:
Do you want to create a primary category? Yes or No?
If yes, for example, I type cereal and it appears just below the other foods:
A B C
fruit
vegetable
greenery
cereal
If not, the macro asks to me what the name of the secondary category.
And I pick fruit in a radio button and then the macro asks me the name of the fruit. So I type strawberry. And the strawberry appears under the category of fruit. But the primary categories should be moved down.
A B C
fruit
strawberry
vegetable
greenery
cereal
And the macro asks me if I want to add another category. Since I already have a primary and secondary category, macro now also ask me if I want to include a tertiary category.
Suppose I click yes. Then the macro asks me which of the subcategories I want to include a third category. I chose strawberry and typed "green."
So the categories should go down again.
A B C
fruit
strawberry
green
vegetable
greenery
cereal
Then the macro will always ask me if I want to include a new category until I click no. And I must always use radio buttons for my choices.
See how you'd like to stay:
A B C
fruit
strawberry
green
red
apple
sweet
vegetable
potato
greenery
kale
fresh
cereal
And so on...
And in the end I will create a Data Grouping for the first, second and third category from the menu data from excel.
It's urgent. Any help will be considered.
Thanks.
Respostas
-
Prezados, parece que usando o se e o somarproduto vai dar certo.
Assim que testar aviso vocês.
Obrigado a todos.
- Marcado como Resposta Vinicius P Gomes quarta-feira, 4 de janeiro de 2012 13:14
Todas as Respostas
-
-
Boa tarde Rafael. Obrigado. Vou lhe explicar o que preciso, quem sabe possa me ajudar.
Vou precisar de uma planilha com três colunas. A primeira coluna seria a principal. A segunda coluna seria uma subcategoria da primeira e a terceira uma subcategoria da segunda.
Então precisaria de um código em vba que fizesse o seguinte: assim que eu executasse a macro ele me pergunta que tipo de categoria gostaria de adicionar, porém se não existisse nada na primeira coluna, ele não me deixaria inserir nada nas outras (colunas B e C). Ai apareceia uma caixa onde digito por exemplo frutas. Então ele a insere na coluna A. Em seguida me pergutna se quero inserir uma nova categoria e o tipo (primária ou secundária). ai escolho, por exemplo, primária e digito legumes e assim por diante, ou seja, neste ponto posso inserir uma categoria primária ou secundária. Se eu optar por escolher uma categoria secundária, então ele me pergutnaria de qual das categorias primárias já inseridas esta categoria secundária é filha, aí eu escolho fruta e aparece uma caixa onde digito morango, por exemplo. Na próxima iteração ai ele me pergutna se quero inserir uma categoria primária, secundária ou terciária (pq agora eu já tenho categoria primária e secundária). Então opto por escolher uma categoria terciária e ele me pergutna de qual fruta, por exemplo (das já inseridas), aí eu escolho morango e vai me aparecer uma caixa onde eu digito, por exemplo vermelho.
Obs: A cada nova categoria ou subcategoria inserido, as linhas que estão abaixo devem descer. Outra coisa, pode acontecer de uma categoria primária ou mesmo secundária ficar sem uma subcategoria, como no exemplo da batata (ela não tem uma subcategoria).
Obs2: Então deve existir uam repetição até eu disser que não quero incluir uma nova categoria. Mais um detalhe (hehehe), depois que eu inserir td o que preciso, devo criar uma estrutura de tópicos onde eu posso exibir só a primeira categoria, a primeira e segunda ou todas as três. É possível?
No mais muito obrigado e segue um exemplo abaixo.
Vide exemplo:
Frutas morango vermelho frecos maçã verde Legumes batata verdura couve flor alface -
Olá Vinicius,
Esta é um solução bem complexa para te passar por aqui. Mas pelo que entendi, talvez você nem precise de código se tentar desenvolver isso em MS Access.
Rafael Gomes dos Santos Consultor de Informática MCAS - Microsoft Certified Application Specialist rafael.gomes.santos@gmail.com https://sites.google.com/site/pfntec/ -
Então Rafael, o problema é que realmente precisa ser feito em excel. Entendo que é complexo mesmo e para falar a verdade até achei um código que faz o início do que eu queria, mas ta emio complicado. Tem amis alguma sugestão ou noção de como se fazer?
abraço.
-
Vinicius,
Uma saída seria criar uma lista simples com estas três colunas e então gerar um tabela dinâmica com base nesta lista para obter o efeito de estrutura de tópicos da forma que você quer.
Rafael Gomes dos Santos Consultor de Informática MCAS - Microsoft Certified Application Specialist rafael.gomes.santos@gmail.com https://sites.google.com/site/pfntec/ -
Crie um form com três ComboBox - ComboBox1, ComboBox2 e ComboBox3 e use o código abaixo:
Option Explicit Const strAdicionarItem_C As String = "(novo item...)" Dim ws As Worksheet Private Sub ComboBox3_Change() GeneralChangeCombo 3, ComboBox3, Nothing, ComboBox2 End Sub Private Sub UserForm_Initialize() Set ws = ActiveSheet Inicializar End Sub Private Sub ComboBox1_Change() GeneralChangeCombo 1, ComboBox1, ComboBox2 End Sub Private Sub ComboBox2_Change() GeneralChangeCombo 2, ComboBox2, ComboBox3, ComboBox1 End Sub Private Sub UserForm_Terminate() Set ws = Nothing End Sub Private Sub GeneralChangeCombo(cCol As Long, ctrlIn As Control, ctrlOut As Control, Optional ctrlPai As Control) Dim rInício As Long Dim rFim As Long With ws If ctrlIn = strAdicionarItem_C Then Dim strNovoItem strNovoItem = InputBox("Qual é o novo item que deseja adicionar?", "Adicionar novo item") If strNovoItem = vbNullString Then Exit Sub Else If cCol = 1 Then .Rows(1).Insert .Range("A1") = strNovoItem rFim = .Cells(.Rows.Count, 1).End(xlUp).Row Else rInício = .Columns(cCol - 1).Find(ctrlPai, , , xlWhole).Row .Rows(rInício + 1).Insert .Cells(rInício + 1, cCol) = strNovoItem End If LimparTodos End If Else If Not ctrlOut Is Nothing Then rInício = .Columns(cCol).Find(ctrlIn, , , xlWhole).Row If .Cells(rInício, cCol).Offset(1) = vbNullString Then rFim = .Cells(rInício, cCol).End(xlDown).Row If rFim = .Rows.Count Then rFim = .Cells(.Rows.Count, cCol + 1).End(xlUp).Row If rFim < rInício Then rFim = rInício End If End If Else rFim = rInício + 1 End If AdicionarItens cCol + 1, ctrlOut, rInício, rFim End If End If End With End Sub Private Sub AdicionarItens(lngColuna As Long, ctrl As Control, lngStart As Long, lngEnd As Long, Optional blÚltimoNível = False) Dim n As Long ctrl.Clear With ws For n = lngStart To lngEnd If .Cells(n, lngColuna) <> vbNullString Then ctrl.AddItem .Cells(n, lngColuna) End If Next n If Not blÚltimoNível Then ctrl.AddItem strAdicionarItem_C End If End With End Sub Private Sub Inicializar() Dim rLast As Long With ws rLast = .Cells(.Rows.Count, 1).End(xlUp).Row AdicionarItens 1, Controls("ComboBox1"), 1, rLast End With End Sub Private Sub LimparTodos() Dim ctrl As Control For Each ctrl In Controls If TypeName(ctrl) = "ComboBox" Then ctrl.Clear End If Next ctrl Inicializar End Sub
http://www.ambienteoffice.com.br -
-
Caros Rafael e Felipe, desde já agradeço a ajuda de vocês.
Felipe, não sei se fiz errado, porém criei um userform e inseri os 3 combobox nele (combobox1, combobox2 e combobox3), ems eguida dei dois cliques no formulário, apaguei o que estava lá e colei o código que você gerou. A primeira categoria (coluna A) está perfeito, porém os outros combobox 2 e 3 estão vazios. Eu fiz algo errado? Deveria colcar o código em partes separadas?
No aguardo.
Obrigado.
-
-
Felipe, agora sim, era isso mesmo que precisava. A única coisa que tenho que fazer agora é gerar um agrupamento através da opção: "Menu Dados - Organizar a estrutura de tópicos", mas isso eu posso fazer manualmetne de forma com que consiga exibir só a primeira coluna, depois a primeira com a segunda, depois a primeira com a segunda e a terceira. Mas não tem erro não.
Mas uma cosia..É possível fazer este agrupamento com o vba tb????
se nao der..blz
De qualquer forma:
VC É O CARA MESMO (NO BOM SENTIDO.....uhauhauhauhh)
Muitissimo obrigado...
Salvou aqui
abração.
-
-
sim..acho q de linhas fica melhor...o que q na parte superior do excel...após cadastrar os itens..aprece as opções 1, 2 e 3...Vamos voltar no exemplo q tinah dado antes...
Frutas morango vermelho frecos maçã verde Legumes batata verdura couve flor alface Ai preciso q qdo clicar no botao 1..só aparece as frutas, legumes e verduras..qdo clicar no 2, aparecça as frutas, legumes e verduras com seus tipos e qdo clicar no botão 3 apareçça as frutas, legumes e verduras com seus tipos e subtipos...
bem...seria isso o q preciso...
Muitissimo obrigado mais uma vez....
-
Não é exatamente o que você falou, mas tente essa rotina:
Sub Ordena() Dim n As Long Dim rLast As Long Dim cLast As Long Dim lngNível As Long Dim lngCabeçalho As Long Dim lngÚltimoNível As Long Dim ws As Worksheet Set ws = ActiveSheet On Error Resume Next For n = 1 To 7 Rows.Ungroup Next n On Error GoTo 0 ActiveSheet.Outline.SummaryRow = xlAbove With ws rLast = .UsedRange.Rows.Count cLast = .UsedRange.Columns.Count + 1 For n = 1 To rLast .Cells(n, cLast) = .Cells(n, cLast).End(xlToLeft).Column Next n lngÚltimoNível = WorksheetFunction.Max(.Columns(cLast)) For n = 1 To rLast lngCabeçalho = n If .Cells(lngCabeçalho, cLast) < lngÚltimoNível Then Do If .Cells(n, cLast) <= .Cells(lngCabeçalho, cLast) Then If n - lngCabeçalho > 1 Then .Rows(lngCabeçalho + 1 & ":" & n - 1).Group n = lngCabeçalho Exit Do End If If n <> lngCabeçalho Then n = lngCabeçalho Exit Do End If End If n = n + 1 Loop End If Next n Columns(cLast).Delete End With Set ws = Nothing End Sub
http://www.ambienteoffice.com.br -
Grande Felipe...Funciona sim, porém se eu mandar agrupar os dados e depois inserir novos valroes, eles ficam agrupados erroneamente..mas nao tem problema...basta eu inserir todos os dados q preciso e por fim mando agrupar...
Cara...vc tem muito a manha...
Muito obrigado pela ajuda e q Deus te abençoes..
Se precisar tb estamos ai...
abrax
-
Boa tarde amigos, agora tenho outra pergunta...
Imagine a função cont.ses para o 2997...ela não funiona para uma matriz de dados, ou seja, se eu usa-se algo como cont.ses(a1:a7;"teste".b1:e7;1) não funciona, ou seja se eu quiser procurar pela palavra teste no intervalo de a1 até a7 e depois procurar pelo número 2 no range que vai de b1 até e7, como faria isso?
Claro que eu poderia faz\er vários cont.ses e ir somando um ao outro, mas acontece que tenho centenas de colunas e isso fica inviável.
Seria uma macro?
No aguardo.
Obrigao.
-
Vinicius,
O ideal seria criar um novo post para manter o fórum organizado.
Não sei se entendi bem o que você precisa. Mas pelo que vejo a melhor solução seria criar as centenas de contses mesmo. Afinal, de qualquer forma você precisará indicar ao sistema qual é a coluna e valor que você precisa buscar.
Rafael Gomes dos Santos Consultor de Informática MCAS - Microsoft Certified Application Specialist rafael.gomes.santos@gmail.com https://sites.google.com/site/pfntec/ -
-
-
-
-
Vinicius uma opção para contar em diversos intervalos é o SOMARPRODUTO
De uma olhada neste tópico e veja ai se te ajuda...
http://www.officevb.com/2010/12/respondendo-perguntas-com-o-excel.html[]'s
PS:Rafa tá tranquilo ai mesmo hein!! kkkk
Bruno Silva Leite
officevb.com -
Prezados, parece que usando o se e o somarproduto vai dar certo.
Assim que testar aviso vocês.
Obrigado a todos.
- Marcado como Resposta Vinicius P Gomes quarta-feira, 4 de janeiro de 2012 13:14
-