none
Creating Data Grouping with vba RRS feed

  • 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.
    terça-feira, 9 de novembro de 2010 18:00

Respostas

Todas as Respostas

  • Cara, se você escrevesse em portugues ficaria mais fácil rs..
    Rafael Gomes dos Santos Consultor de Informática MCAS - Microsoft Certified Application Specialist rafael.gomes.santos@gmail.com https://sites.google.com/site/pfntec/
    quinta-feira, 11 de novembro de 2010 17:26
  • 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  
    terça-feira, 16 de novembro de 2010 15:07
  • 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/
    terça-feira, 16 de novembro de 2010 15:48
  • 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.

    terça-feira, 16 de novembro de 2010 18:40
  • 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/
    terça-feira, 16 de novembro de 2010 20:02
  • 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
    quarta-feira, 17 de novembro de 2010 02:44
    Moderador
  • Estamos no caminho certo?
    http://www.ambienteoffice.com.br
    quarta-feira, 17 de novembro de 2010 02:58
    Moderador
  • 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.

    quarta-feira, 17 de novembro de 2010 17:44
  • -O ComboBox2 será povoado somente se você escolher algum item no ComboBox1.

    -O ComboBox3 será povoado somente se você escolher algum item no ComboBox2.


    http://www.ambienteoffice.com.br
    quarta-feira, 17 de novembro de 2010 18:07
    Moderador
  • 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.

    quinta-feira, 18 de novembro de 2010 14:17
  • A estrutura de tópicos que você quer criar é de Linhas, e não Colunas, certo?
    http://www.ambienteoffice.com.br
    quinta-feira, 18 de novembro de 2010 18:28
    Moderador
  • 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....

     

    quinta-feira, 18 de novembro de 2010 18:56
  • 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
    quinta-feira, 18 de novembro de 2010 23:55
    Moderador
  • 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

    sexta-feira, 19 de novembro de 2010 15:56
  • 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.

    segunda-feira, 23 de maio de 2011 16:37
  • 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/
    segunda-feira, 23 de maio de 2011 16:54
  • Boa tarde Rafael, realmente criei outro post.

    Mas é isso mesmo que você entendeu, porém não queria usar uma fórmula com centenas de cont.ses, entao gostaria de uma  macro para fazer isso...

    Obrigado.

    abraço

     

    segunda-feira, 23 de maio de 2011 18:37
  • Criei este post Rafael

    Macro para a função cont.ses do Excel 2007 - VBA

    Se puder ajudr..

    Obrigado.

    segunda-feira, 23 de maio de 2011 18:40
  • Boa noite Felipe, será que podia me ajduar novamente, agora neste post?

    Macro para a função cont.ses do Excel 2007 - VBA

    Obrigado.

    segunda-feira, 23 de maio de 2011 21:19
  • Olá Vinícius,

    Poderia mandar o link do post? Não estou localizando o mesmo.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br
    segunda-feira, 23 de maio de 2011 22:21
    Moderador
  • 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
    terça-feira, 24 de maio de 2011 00:27
  • 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
    quarta-feira, 25 de maio de 2011 15:43
  • Olá Vinícius,

    Poderia mandar o link do post? Não estou localizando o mesmo.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br
    quarta-feira, 25 de maio de 2011 19:05
    Moderador