<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Fernando Mertins</title>
	<atom:link href="http://fernando.digitins.com.br/feed" rel="self" type="application/rss+xml" />
	<link>http://fernando.digitins.com.br</link>
	<description>Desenvolvimentos e Pensamentos</description>
	<pubDate>Mon, 23 Nov 2009 22:36:11 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Frase da Semana #39</title>
		<link>http://fernando.digitins.com.br/archives/325</link>
		<comments>http://fernando.digitins.com.br/archives/325#comments</comments>
		<pubDate>Mon, 23 Nov 2009 22:36:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Frases & pensamentos]]></category>

		<guid isPermaLink="false">http://fernando.digitins.com.br/?p=325</guid>
		<description><![CDATA[Sabe-se que o típico do gênio é fornecer idéias aos cretinos cerca de vinte anos depois. L. Aragon
]]></description>
			<content:encoded><![CDATA[<p><em>Sabe-se que o típico do gênio é fornecer idéias aos cretinos cerca de vinte anos depois.</em> L. Aragon</p>
]]></content:encoded>
			<wfw:commentRss>http://fernando.digitins.com.br/archives/325/feed</wfw:commentRss>
		</item>
		<item>
		<title>Frase da Semana #38</title>
		<link>http://fernando.digitins.com.br/archives/322</link>
		<comments>http://fernando.digitins.com.br/archives/322#comments</comments>
		<pubDate>Sun, 15 Nov 2009 17:22:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Frases & pensamentos]]></category>

		<guid isPermaLink="false">http://fernando.digitins.com.br/?p=322</guid>
		<description><![CDATA[Viver bem é a melhor vingança. George Herbert
]]></description>
			<content:encoded><![CDATA[<p><em>Viver bem é a melhor vingança.</em> George Herbert</p>
]]></content:encoded>
			<wfw:commentRss>http://fernando.digitins.com.br/archives/322/feed</wfw:commentRss>
		</item>
		<item>
		<title>Frase da Semana #37</title>
		<link>http://fernando.digitins.com.br/archives/320</link>
		<comments>http://fernando.digitins.com.br/archives/320#comments</comments>
		<pubDate>Thu, 15 Oct 2009 00:11:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Frases & pensamentos]]></category>

		<guid isPermaLink="false">http://fernando.digitins.com.br/?p=320</guid>
		<description><![CDATA[O mundo está cheio de pessoas honestas. São reconhecidas porque dão golpes baixos com a maior falta de habilidade. C. Péguy
]]></description>
			<content:encoded><![CDATA[<p><em>O mundo está cheio de pessoas honestas. São reconhecidas porque dão golpes baixos com a maior falta de habilidade.</em> C. Péguy</p>
]]></content:encoded>
			<wfw:commentRss>http://fernando.digitins.com.br/archives/320/feed</wfw:commentRss>
		</item>
		<item>
		<title>Frase da Semana #36</title>
		<link>http://fernando.digitins.com.br/archives/316</link>
		<comments>http://fernando.digitins.com.br/archives/316#comments</comments>
		<pubDate>Sun, 04 Oct 2009 16:15:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Frases & pensamentos]]></category>

		<guid isPermaLink="false">http://fernando.digitins.com.br/?p=316</guid>
		<description><![CDATA[Nem sempre informação é poder - basta perguntar a um bibliotecário. David Brake
]]></description>
			<content:encoded><![CDATA[<p><em>Nem sempre informação é poder - basta perguntar a um bibliotecário.</em> David Brake</p>
]]></content:encoded>
			<wfw:commentRss>http://fernando.digitins.com.br/archives/316/feed</wfw:commentRss>
		</item>
		<item>
		<title>O problema dos múltiplos intervalos simultâneos no Excel</title>
		<link>http://fernando.digitins.com.br/archives/292</link>
		<comments>http://fernando.digitins.com.br/archives/292#comments</comments>
		<pubDate>Mon, 28 Sep 2009 01:33:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Excel]]></category>

		<category><![CDATA[hora]]></category>

		<category><![CDATA[interseção]]></category>

		<category><![CDATA[simultâneo]]></category>

		<category><![CDATA[união]]></category>

		<guid isPermaLink="false">http://fernando.digitins.com.br/?p=292</guid>
		<description><![CDATA[Alguns meses atrás, postaram um problema da comunidade de Excel, que achei muito interessante, sobre calcular o tempo total de funcionamento de bombas d&#8217;água, sendo que as mesmas operam simultaneamente. Isto é, digamos que existam 5 bombas, elas trabalham independente umas das outras e se deseja obter o tempo total de funcionamento delas, porém não faz diferença se [...]]]></description>
			<content:encoded><![CDATA[<p>Alguns meses atrás, <a href="http://www.orkut.com.br/Main#CommMsgs?cmm=96432&amp;tid=5319786869817928889&amp;kw=bomba" target="_blank">postaram um problema da comunidade de Excel</a>, que achei muito interessante, sobre calcular o tempo total de funcionamento de bombas d&#8217;água, sendo que as mesmas operam simultaneamente. Isto é, digamos que existam 5 bombas, elas trabalham independente umas das outras e se deseja obter o tempo total de funcionamento delas, porém não faz diferença se apenas uma funcionou sozinha, ou duas em conjunto, ou três ou todas.</p>
<p>Logo me ocorreu que se tratava de analisar intervalos simultâneos, e a maior dificuldade parecia ser desconsiderar as interseções entre os períodos. Após as primeiras tentativas de cabeça e sem muito esforço, não achei nada fácil de resolver <img src='http://fernando.digitins.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> e decidi planejar mais e fazer menos. Para isso, nada melhor do que um quadro e algumas canetas:</p>
<p style="text-align: center;"><a href="http://fernando.digitins.com.br/wp-content/uploads/2009/09/multiplos-intervalos.jpg"><img class="size-thumbnail wp-image-294 aligncenter" title="multiplos-intervalos" src="http://fernando.digitins.com.br/wp-content/uploads/2009/09/multiplos-intervalos-147x150.jpg" alt="multiplos-intervalos" width="147" height="150" /></a></p>
<p>Claro que folha A4 e lápis também servem, mas afinal de contas assistir filmes na tela gigante do cinema geralmente é melhor não é mesmo? <img src='http://fernando.digitins.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> O bom de fazer esses esboços e diagramas é que você pode parar, ficar olhando e analisando, apagar, refazer, complementar, etc&#8230; as possibilidades são infinitas.</p>
<p>Nas linhas temos os horários (períodos) e nas colunas temos as horas. Comecei a inventar aleatoriamente alguns intervalos, para servirem de exemplos na análise do problema. Ter exemplos sempre ajuda ;-). No caso destes intervalos, a soma total deve ser de 14 horas, pois no período entre 15 e 17 horas não existe intervalo cadastrado, e ao mesmo tempo, nos outros períodos existem alguns intervalos simultâneos.</p>
<p>Com este desenho conseguir organizar um pouco melhor as ideias de como atacar o problema. Partindo para o Excel, comecei com os lançamentos, algo bem típico, neste estilo tabular:</p>
<p style="text-align: center;"><a href="http://fernando.digitins.com.br/wp-content/uploads/2009/09/planilha.png"><img class="aligncenter size-thumbnail wp-image-299" title="planilha" src="http://fernando.digitins.com.br/wp-content/uploads/2009/09/planilha-138x150.png" alt="planilha" width="138" height="150" /></a></p>
<p>O objetivo geral era o de controlar uma lista dos intervalos, processando-os um de cada vez. Se um intervalo possuir interseção com outro, eles devem ser unidos num intervalo único, como por exemplo em 12:00-14:00 com 09:00-15:00. Mas se não possuir interseção, ambos os intervalos devem ser considerados. Só que ao unir dois intervalos com interseção, o novo intervalo talvez tenha interseção com outro(s) intervalo(s), então isto requer um novo processamento, o que parece ser algo meio recursivo&#8230;</p>
<p>Antes de planejar o processamento principal, comecei a tentar resolver problemas menores (periféricos), que já imaginava que iriam ocorrer durante a <span style="text-decoration: line-through;">diversão</span>lógica toda; coisas como saber se dois intervalos têm interseção ou não e unir dois intervalos em um único intervalo. Aqui é um exemplo típico de <strong>dividir-e-conquistar</strong>, ou seja, transforme (quebre, divida) um problema grande e complexo em vários problemas menores e simples, preocupando-se com um de cada vez.</p>
<p>Então as duas primeiras funções que criei foram a <strong>temIntersecao</strong> e a <strong>uniaoIntervalo</strong>, conforme abaixo:</p>
<pre>' Retorna FALSO/VERDADEIRO se entre dois intervalos existir interseção.
Function temIntersecao(ByVal inicio1 As Date, ByVal fim1 As Date, _
                       ByVal inicio2 As Date, ByVal fim2 As Date) As Boolean
   Dim ret As Boolean
   ret = True

   If fim1 &lt; inicio2 Or fim2 &lt; inicio1 Then
      ret = False
   End If

   temIntersecao = ret
End Function</pre>
<pre>' A partir do parâmetro do tipo (I-Início ou F-Fim) retorna a hora a ser utilizada
' para calcular a união de dois intervalos.
Function uniaoIntervalo(ByVal d1 As Date, ByVal d2 As Date, tipo As String) As Date
   Dim ret As Date

   If tipo = "I" Then
      If d1 &lt; d2 Then
         ret = d1
      Else
         ret = d2
      End If
   Else
      If d1 &gt; d2 Then
         ret = d1
      Else
         ret = d2
      End If
   End If

   uniaoIntervalo = ret
End Function</pre>
<p>Para processar a lista de intervalos, criei um <em>array</em> do VBA, inicialmente contendo apenas 100 posições (mais do que o suficiente para a primeira versão da solução do problema):</p>
<pre>Dim intervalos(1 To 100) As String</pre>
<p>onde cada elemento contem a hora inicial e final, no formato 99:99:99|99:99:99 (uma string contendo as duas horas separadas por um <em>pipe</em>). O preenchimento deste array é feito pela subrotina abaixo:</p>
<pre>Private Sub populaIntervalos()
   Dim inicio As Date, fim As Date
   Dim contaElemento As Long

   contaElemento = 1
   [H3].Select

   While ActiveCell.Value &lt;&gt; ""
      inicio = ActiveCell.Value
      fim = ActiveCell.Offset(0, 1).Value

      intervalos(contaElemento) = CStr(inicio) + "|" + CStr(fim)
      ActiveCell.Offset(1).Select

      contaElemento = contaElemento + 1
   Wend
End Sub</pre>
<p>Em conjunto com este formato/padrão de gravar as horas iniciais e finais nos elementos do array, precisei criar mais uma função auxiliar, que converte duas datas (horas inicial e final) para a string:</p>
<pre>Function intervalo2String(ByVal inicio As Date, ByVal fim As Date) As String
   Dim ret As String
   ret = CStr(inicio) &amp; "|" &amp; CStr(fim)
   intervalo2String = ret
End Function</pre>
<p>Feito isso, parti para o laço de repetição principal, onde utilizei dois &#8220;for .. next&#8221; para comparar cada elemento com todos os outros elementos (menos ele próprio). Para cada iteração, verifica se existe interseção entre dois intervalos; se existir faz a união entre eles.</p>
<p>A última etapa, ao concluir a iteração principal, é gerar uma lista única dos intervalos e finalmente então somar os intervalos, para obter o total de horas. <a href="http://www.digitins.com.br/fernando/blog/multiplos_intervalos.xls">A planilha do Excel pode ser baixada aqui.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fernando.digitins.com.br/archives/292/feed</wfw:commentRss>
		</item>
		<item>
		<title>Frase da Semana #35</title>
		<link>http://fernando.digitins.com.br/archives/290</link>
		<comments>http://fernando.digitins.com.br/archives/290#comments</comments>
		<pubDate>Sun, 13 Sep 2009 17:56:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Frases & pensamentos]]></category>

		<guid isPermaLink="false">http://fernando.digitins.com.br/?p=290</guid>
		<description><![CDATA[Não se deve lutar contra o futuro. O tempo está do nosso lado. William Gladstone
]]></description>
			<content:encoded><![CDATA[<p><em>Não se deve lutar contra o futuro. O tempo está do nosso lado.</em> William Gladstone</p>
]]></content:encoded>
			<wfw:commentRss>http://fernando.digitins.com.br/archives/290/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
