none
Comparação de arranjo entre duas planilhas RRS feed

  • Pergunta

  • Boa tarde, gostaria de fazer a comparação entre duas planilhas. A comparação deve ser feita deste modo:

    A planilha"A" possui 53 colunas (K1:BK1). Conforme duas datas (início e fim), estas 53 colunas são preenchidas com uma qtdd que está na célula "A2". Por exemplo, se a data de início é na semana 3 e a data de término é na semana 48, todas as colunas de 3 a 48 ficarão preenchidas com o valor da célula "A2".

    Quando apertado um botão salvar, este arranjo é jogado em outra planilha e somado com o valor que já estava nesta outra planilha.  E uma cópia da planillha é feita. Por exempo, se na planilha que os dados são salvos, estiver o numero 30 entre a semana 3 e 48, agora ficará 30 + A2. E um novo Worksheet é feito com os dados da planilha "A", e chamado de "A2"

    Até aí ok.

    Agora caso faça outro cadastro na planilha "A", do mesmo modo ( com data de início e final, que podem ser diferentes do último cadastro), deverá mostrar se a soma da qtdd que eu estou colocando neste novo projeto, somado com o maior valor  DENTRO DO PERÍODO DESTE NOVO PROJETO, que está na planilha em que os dados estão sendo armazenados, não deverá ultrapassar um valor que está armazenado na célula "B8" de uma outra planilha chamada ("BC1"). 

    Por exemplo, faço um novo cadastro na planilha "A" e a data entre inicio e fim vai de 7 a 32, e o valor da celula A2 é 8;

    Na planilha onde guardo os dados (que é chamada de "banco"), deve ser pego o maior valor entre a coluna 7 a 32 (K11:AJ11), somar com o valor da célula A2 da planilha "A"( que no caso é 8), e se o valor desta soma for menos que o valor da célula B8 da planilha BC1, escreve em qualquer célula da planilha "A" ("OK"), caso a condição seja falsa escreve ("NAO").

    Caso esteja ok, após apertar o botao salvar a planilha "banco" é atualizada com a soma da célula A2 de "A";

    E novamente poderá ser feito um novo cadastro.....

    A minha dificuldade é como encontrar o valor maior valor que esteja entre a data que eu coloquei em outra planilha. Não sei como faz essa comparação que é dinâmica. 

    Caso alguem me ajude agradeço desde já.


    segunda-feira, 20 de janeiro de 2014 18:43

Respostas

  • Você explicou bem, desculpe a demora.

    Minha resposta não resolve seu problema porque estou perdido na estrutura da sua pasta de trabalho e não tenho tempo de decifrar. No entanto, peguei alguns trechos chave de sua dúvida e montei o código a seguir para ver se você tem alguma luz:

      Dim wksPlan1 As Excel.Worksheet
      Dim wks As Excel.Worksheet
      Dim wksCronograma As Excel.Worksheet
      Dim wksBanco As Excel.Worksheet
      Dim dteMaior As Date
      
      With ThisWorkbook
        Set wksPlan1 = .Worksheets("Plan1")
        Set wksCronograma = .Worksheets("Cronograma")
        Set wksBancoDados = .Worksheets("BancoDados")
      End With
      
      'Após apertar o botão salvar, esta planilha será copiada em um novo worksheet
      wksPlan1.Copy Before:=Sheets(1)
      Set wks = ActiveSheet
    
      'estes dados serão jogados em outra planilha, chamada "Cronograma"
      wksPlan1.Range("A1:K1").Copy
      wksCronograma.Range("A1").PasteSpecial _
      Paste:=xlPasteValues, _
      Operation:=xlPasteSpecialOperationAdd
      
      'qual o maior valor que está dentro destas duas datas
      dteMaior = WorksheetFunction.Max(wksPlan1.Range("A1:K1"))
      
      'este maior valor somado com A2, não poderá ultrapassar o
      'valor da célula "B8" de uma outra planilha chamada "BancoDados".
      If dteMaior + wksPlan1.Range("A2").Value > wksBanco.Range("B8") Then
        MsgBox "Valor limite extrapolado"
      Else
        'código desejado
      End If
    


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta Mmbr segunda-feira, 27 de janeiro de 2014 18:41
    quinta-feira, 23 de janeiro de 2014 22:57
    Moderador
  • No início do programa, utilize:

    Application.ScreenUpdating = False

    e, ao final:

    Application.ScreenUpdating = True


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br


    segunda-feira, 27 de janeiro de 2014 20:09
    Moderador

Todas as Respostas

  • Olá,

    As explicações são detalhadas, e terei que ler com mais atenção para entender melhor.

    Estou ficando confuso porque você fala da célula A2 e fala também de uma planilha chamada A2.

    Você já escreveu algum código para tentar resolver seu problema?


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 21 de janeiro de 2014 09:37
    Moderador
  • Realmente é meio confuso... Vou reexplicar...

    A planilha"Plan1" possui 53 colunas (K1:BK1). Conforme duas datas (início e fim), estas 53 colunas são preenchidas com uma qtdd que está na célula "A2". Por exemplo, se a data de início é na semana 3 e a data de término é na semana 48, todas as colunas de 3 a 48 ficarão preenchidas com o valor da célula "A2".

    Quando apertado um botão salvar, este arranjo é jogado em outra planilha e somado com o valor que já estava nesta outra planilha.  E uma cópia da planillha é feita. Por exempo, se na planilha que os dados são salvos, estiver o numero 30 entre a semana 3 e 48, agora ficará 30 + A2. E um novo Worksheet é feito com os dados da planilha "Plan1", e chamado de "Plan2"

    Até aí ok.

    Agora caso faça outro cadastro na planilha "Plan1", do mesmo modo ( com data de início e final, que podem ser diferentes do último cadastro), deverá mostrar se a soma da qtdd que eu estou colocando neste novo projeto, somado com o maior valor  DENTRO DO PERÍODO DESTE NOVO PROJETO, que está na planilha em que os dados estão sendo armazenados, não deverá ultrapassar um valor que está armazenado na célula "B8" de uma outra planilha chamada ("BancoDados"). 

    Por exemplo, faço um novo cadastro na planilha "Plan1" e a data entre inicio e fim vai de 7 a 32, e o valor da celula A2 é 8;

    Na planilha onde guardo os dados (que é chamada de "Cronograma"), deve ser pego o maior valor entre a coluna 7 a 32 (K11:AJ11), somar com o valor da célula A2 da planilha "A"( que no caso é 8), e se o valor desta soma for menos que o valor da célula B8 da planilha BancoDados aparece disponível, 

    IF((MAX(Cronograma!K11:AJ11)+Plan1!A2<BancoDados!B8);"disponivel";"INDISPONIVEL")

     

    Caso esteja ok, após apertar o botao salvar a planilha "Cronograma" é atualizada com a soma da célula A2 de "Plan1";

    E novamente poderá ser feito um novo cadastro.....

    Ficou mais claro agora Felipe??

    terça-feira, 21 de janeiro de 2014 18:54
  • Felipe, eu acho que teria que ser feito um loop para encontrar onde está o primeiro valor não nulo (que é o valor da célula "A2".... E onde está o último valor antes que volte a ser nulo novamente. Salva o número da primeira coluna com o valor e o número da última coluna. Vai para a planilha Cronograma e olha qual o maior valor que está entre as duas colunas.

    Soma com a célula "A2" da Plan1 e se for menor do que B8 da BancoDados escreve disponivel; else indisponivel.



    terça-feira, 21 de janeiro de 2014 19:15
  • Realmente, não estou entendendo nada. Está difícil acompanhar, porque nunca vi a planilha.

    Acho que será mais fácil perguntar o que pretende fazer em termos técnicos de Excel do que explicar o que a planilha faz, por exemplo:

    1 - Duplicar a planilha A e chamar essa cópia de A2

    2 - Somar ao intervalo K1:BK1 da planilha A2 o valor da célula A2 da planilha A

    ...e assim por diante.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 21 de janeiro de 2014 21:25
    Moderador
  • Ok, veja se assim fica melhor...

    A "Plan1" possui colunas de L7:DM7, são 106 colunas, as 53 primeiras representam o numero de semanas de 2014 e as outras 53 representam o número de semanas de 2015.

    A linha 7 da "Plan1", é quem recebe o valor da célula A2 desta mesma planilha. As colunas ('L7:DM7") estão amarradas com as datas inseridas em duas combo box, que analisa qual o número da semana de início e de fim, por exemplo, se a data de início é na semana 16 de 2014 e a de fim é na 32 de 2015, a linha 7 ficará com o valor da célula A2 da coluna que corresponde a semana 16 de 2014(AA) até a coluna CR (semana 32 de 2015). As outras colunas serão preenchidas com 0. Até aí ok?

    Após apertar o botão salvar, esta planilha será copiada em um novo worksheet e estes dados serão jogados em outra planilha, chamada "Cronograma", que é basicamente estas datas aí de cima. A planilha cronograma serve para armazenar os dados de todos os outros projetos. Quando apertado o botão salvar, os dados serão somados na planilha cronograma. Por exemplo, como as semanas 16/2014 a 32/2015 estão com o valor da célula A2, este valor será somado no período correspondente na planilha Cronograma, mas só entre esta data! 

    Isto já está feito... Agora, gostaria que quando colocado as datas de início e fim na minha "Plan1" e um valor na célula A2, fosse verificado na planilha Cronograma qual o maior valor que está dentro destas duas datas e este maior valor somado com A2, não poderá ultrapassar o valor da célula "B8" de uma outra planilha chamada "BancoDados".

    Por exemplo, A2 = 10, e a data de início e fim é na semana 16/2014 e 32/2015, respectivamente. Logo, a linha 7 terá valor 10 para as colunas AA à CR e 0 para as demais colunas. Agora, verificando a planilha Cronograma, entre a semana 16/2014 e 32/2015 terá que ser pego o maior valor e deve ser somado com A2, ou seja, 10. Caso esta soma seja menor que o valor de B8 de BancoDados, estará ok, caso ultrapasse o valor de B8, estará inválido. Esta mensagem de ok ou inválido pode ser exibida em alguma célula da Plan1, para o usuário saber se pode ou não pegar a quantidade inserida na célula A2 de Plan1.

    Obrigado pela atenção Felipe.

    terça-feira, 21 de janeiro de 2014 22:20
  • Ficou mal explicado Felipe?
    quarta-feira, 22 de janeiro de 2014 23:48
  • Você explicou bem, desculpe a demora.

    Minha resposta não resolve seu problema porque estou perdido na estrutura da sua pasta de trabalho e não tenho tempo de decifrar. No entanto, peguei alguns trechos chave de sua dúvida e montei o código a seguir para ver se você tem alguma luz:

      Dim wksPlan1 As Excel.Worksheet
      Dim wks As Excel.Worksheet
      Dim wksCronograma As Excel.Worksheet
      Dim wksBanco As Excel.Worksheet
      Dim dteMaior As Date
      
      With ThisWorkbook
        Set wksPlan1 = .Worksheets("Plan1")
        Set wksCronograma = .Worksheets("Cronograma")
        Set wksBancoDados = .Worksheets("BancoDados")
      End With
      
      'Após apertar o botão salvar, esta planilha será copiada em um novo worksheet
      wksPlan1.Copy Before:=Sheets(1)
      Set wks = ActiveSheet
    
      'estes dados serão jogados em outra planilha, chamada "Cronograma"
      wksPlan1.Range("A1:K1").Copy
      wksCronograma.Range("A1").PasteSpecial _
      Paste:=xlPasteValues, _
      Operation:=xlPasteSpecialOperationAdd
      
      'qual o maior valor que está dentro destas duas datas
      dteMaior = WorksheetFunction.Max(wksPlan1.Range("A1:K1"))
      
      'este maior valor somado com A2, não poderá ultrapassar o
      'valor da célula "B8" de uma outra planilha chamada "BancoDados".
      If dteMaior + wksPlan1.Range("A2").Value > wksBanco.Range("B8") Then
        MsgBox "Valor limite extrapolado"
      Else
        'código desejado
      End If
    


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta Mmbr segunda-feira, 27 de janeiro de 2014 18:41
    quinta-feira, 23 de janeiro de 2014 22:57
    Moderador
  • Consegui alterar algumas coisas e ficou ótimo!

    Só uma coisa, minha macro está usando muitas vezes o .Copy e .Paste, e enquanto está fazendo isso a tela fica piscando, tem algum modo de tirar isso? Ou fazer uma MsgBox do tamanho da tela que apareça salvando e saia quando acabar todos os "copiar" e "colar"?

    segunda-feira, 27 de janeiro de 2014 18:43
  • No início do programa, utilize:

    Application.ScreenUpdating = False

    e, ao final:

    Application.ScreenUpdating = True


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br


    segunda-feira, 27 de janeiro de 2014 20:09
    Moderador