Pergunta

Eu tenho uma planilha com um conjunto de dados de uma série de transações, cada um dos quais é composta de subetapas, cada um dos quais tem o tempo em que ela ocorreu. Pode haver um número variável e ordem das etapas.

Eu gostaria de encontrar a duração de cada transação. Se eu puder fazer isso no Excel, então ótimo, como ele já está nesse formato. Se não houver uma maneira simples e direta de fazer isso no Excel, vou carregá-lo em um banco de dados e fazer a análise com o SQL. Se há uma maneira Excel rodada isso, vai economizar uma configuração de algumas horas no entanto:)

Um exemplo simplificado dos meus dados é a seguinte:

TransID, Subetapa,
Tempo 1, etapa A, 15:00:00
1, etapa B, 15:01:00
1, passo C, 15:02:00
2, etapa B, 15:03:00
2, etapa C, 15:04:00
2, passo E, 15:05:00
2, etapa F, 15:06:00
3, passo C, 15:07:00
3, passo D, 15:08:00
etc.

Eu gostaria de produzir um conjunto de resultados da seguinte forma:

TransID, Duração
1, 00:02:00
2, 00:03:00
3, 00:01:00
etc.

A minha primeira tentativa foi com uma coluna extra com um tempo final fórmula subtraindo hora de início, mas sem um número de repetição de etapas, ou o mesmo início e fim as etapas que eu estou tendo dificuldade em ver como esta fórmula iria funcionar.

Eu também tentei criar uma tabela dinâmica com base nesses dados com ID como as linhas e tempo como os dados. Eu posso mudar as configurações de campo nos dados de tempo para retornar valores agrupados, tais como contagem ou máximo, mas estou lutando para ver como isso pode ser configurado para mostrar max (tempo) - min (tempo) para cada ID, daí porque eu sou pensar em ir para SQL. Se alguém pode apontar nada óbvio que estou em falta, porém, eu ficaria muito grato.

Como sugerido por Hobbo, eu agora utilizada uma tabela dinâmica com TransID como as linhas e duas vezes adicionado Time como os dados. Depois de definir as definições de campo sobre o Tempo de Max no primeiro e no segundo min, uma fórmula pode ser adicionada imediatamente fora da tabela de pivô para calcular as diferenças. Uma coisa que eu tinha sido vista aqui é que o mesmo valor pode ser adicionado à seção de dados mais de uma vez!

A follow-on problema era que a fórmula I add é da forma = GETPIVOTDATA ( "Max of Time", $ A $ 4, "ID", 1) -GETPIVOTDATA ( "Min of Time", $ A $ 4, "ID", 1), whici não, em seguida, incrementar ao copiar e colar. As soluções para este uso são: ou a barra de ferramentas tabela pivô para desligar fórmulas GetPivotData, ou em vez de clicar sobre a mesa de articulação quando a selecção de células na fórmula, escreva as referências de células em vez (por exemplo = H4-G4)

Foi útil?

Solução

Você estava no caminho certo com tabelas dinâmicas. Arrastar em TransID como um campo de linha de arrasto, em seguida, em duas cópias do tempo como campos de dados na tabela de pivô; clique direito em cada e especifique Min como a função de resumo para um e Max para o outro. À direita da tabela dinâmica adicionar uma fórmula para calcular a diferença.

alt texto http://img296.imageshack.us/img296/5866/pivottableey5 .jpg

"Parece bom, o único problema que tenho é que a fórmula I add é da forma = GETPIVOTDATA (" Max of Time, $ A $ 4, "ID", 1) - GETPIVOTDATA ( "Max of Time, $ a $ 4, "ID", 1) Quando eu copiar isso para as células abaixo, o 1 não atualiza a 2, 3 etc modo que todos eles mostram ao mesmo tempo -.. Kris Coverdale "

Use este botão na barra de ferramentas tabela dinâmica para mudar fórmulas GetPivotData off.

alt texto http://img117.imageshack.us/img117/9937/pivottabletoolbarjn3 .jpg

Outras dicas

Em sua fórmula "GETPIVOTDATA (" Max of Time, $ A $ 4, "ID", 1) - GETPIVOTDATA ( "Max of Time, $ A $ 4, "ID", 1)' as referências de célula são tratadas entre o símbolo "$'. Por exemplo $ A $ 4. Quando as referências de célula tendo símbolo $ e você copiar a fórmula para outra célula, em seguida, fazer referência a células não são atualizados automaticamente. Daí você obter o mesmo tipo.

Talvez você modificar a fórmula como se segue e, em seguida, copiar a fórmula para outras células. A fórmula deve ser como:

"GETPIVOTDATA (" Max of Time, A4, "ID", 1) -. GETPIVOTDATA ( "Max of Time, A4, "ID", 1)"

Graças.

Talvez algo tão simples como uma consulta como esta.

SELECT TransID, DateDiff(mi, Min(Time),Max(Time)) AS Duration
FROM MyTable
GROUP BY TrandID

No Excel:

  A     B        C
1 1, step A, 15:00:00
2 1, step B, 15:01:00
3 1, step C, 15:02:00
4 2, step B, 15:03:00
5 2, step C, 15:04:00
6 2, step E, 15:05:00
7 2, step F, 15:06:00
8 3, step C, 15:07:00
9 3, step D, 15:08:00

11 1, =max(if($A$1:$A$9=$A11,$C$1:$C$9,"")-min(if($A$1:$A$9=$A11,$C$1:$C$9,"")
12 2, =max(if($A$1:$A$9=$A12,$C$1:$C$9,"")-min(if($A$1:$A$9=$A12,$C$1:$C$9,"")

Nota: as fórmulas são funções de matriz de modo Pressione Ctrl-Shift-Enter depois editá-los

.

Para adicionar ao post de Kibbee, em referência ao comentário, você pode usar o ADO com o Excel:

'From: http://support.microsoft.com/kb/246335 '

strFile = Workbooks(1).FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = "SELECT TransID, DateDiff('n', Min([MyTime]),Max([MyTime])) AS Duration " _
         & "FROM [Sheet1$] GROUP BY TransID"

rs.Open strSQL, cn

'Write out to another sheet '
Worksheets(2).Cells(2, 1).CopyFromRecordset rs

EDIT: eu ter corrigido alguns erros no post original e mudou o nome da coluna tempo para MyTime. O tempo é uma palavra reservada no SQL e causa dificuldades em consultas. Esta agora trabalha em um teste muito simples.

Às vezes é possível fazer alguma coisa uma vez em Excel com muito mais facilidade do que está a fazer alguma coisa repetidamente.

Assumindo que você está apenas tentando obter a resposta uma ou duas vezes, e depois jogue fora a planilha (ao contrário de executá-lo todas as noites, ou dá-lo a alguém para pista), aqui está como eu faria isso.

Eu assumo seus dados crus é nas colunas A, B e C, com títulos na linha 1, e os dados que começam na linha 2.

Classificar tabela por transID como sua chave primária, e tempo como seu secundário, tanto ascendente. (O seguinte não funcionará se isso não é feito.)

Adicionar uma nova coluna, D, intitulado Duração com uma fórmula que assim (fórmulas do Excel não formatação ou comentários; eu adicionei os para ajudar a explicar, mas eles precisam ser retirados):

=IF(B2=B3,           // if this row's TransId is the same as the next one
    "",              // leave this field blank
    C3-              // else find the difference between the last timestamp and...
     VLOOKUP(        // look for the first value
        A2,          // matching this TransId
        A:C,         // within the entire table,
        3)           // Return the value in the third column - i.e. timestamp
    )

Agora, os dados que você quer é na coluna D, mas não no formato desejado.

Selecionar colunas A-D e copiá-los. Use Colar especial para copiar os valores única em uma nova planilha.

Excluir coluna B e coluna C na nova planilha, então tudo o que resta é TransID e Duração.

Classificar por Duração, para trazer todas as linhas com valores ao lado do outro.

Classificar apenas as linhas com valores por transID.

Voila, e não é a sua solução! Espero que você não precisa repetir isso!

P.S. Este não foi testado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top