IMECC - Instituto de Matemtica, Estatstica e Computao Cientfica
Projeto Supervisionado II
utorial so!re modela"em em #$%
%luna& atiana Suem' (tsu)a (rientador& Prof* +r* %ntonio Carlos Moretti , +pto* de matemtica aplicada
- de .ul/o de 0120
2 3ndice
(!jetivo (!jetivo (!jetivo (!jetivo 44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444444 44 44 4415 Introdu Introdu Introdu Introdu o o o o 44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444416 2* 2* 2* 2* ( 7ue 8 #$% ( 7ue 8 #$% ( 7ue 8 #$% ( 7ue 8 #$%9 99 9 1- 0* 0* 0* 0* (!jetos do E:cel (!jetos do E:cel (!jetos do E:cel (!jetos do E:cel 4444444444444444444444444444444444444444444444444444444 1; 5* 5* 5* 5* Conceitos !sicos Conceitos !sicos Conceitos !sicos Conceitos !sicos 44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 444444444444444444444444444444444444444444444444444444 4444444444444444444444 4444444444444444444444 44444444444444444444441< 5*2 Su!-rotinas 1< 5*0 #ariveis e Constantes 1< 5*5 Cai:as de Entrada e Mensa"ens 21 5*6 Comentrios, Concatenao de Strin" e Pular =in/as 22 5*- #etores 20 5*; Propriedade offset 25 5*< Propriedade End 26 5*> Constru?es com @it/ 26 5*A Estruturas de Condi?es 2- 5*21 Estruturas de =oopin"s 2- 6* @or)!oo)s 6* @or)!oo)s 6* @or)!oo)s 6* @or)!oo)s 44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444 44444444444444444444444444444 44444444444444444444444444444 444444444444444444444444444442; -* -* -* -* Event Bandler Event Bandler Event Bandler Event Bandler 44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444 44444444444444444444444444 44444444444444444444444444 444444444444444444444444442; ;* User Corms ;* User Corms ;* User Corms ;* User Corms 4444444444444444444444444444444444444444444444444444444444444 2; ;*2 Parte Drfica 2< ;*0 Event Bandler para User Corms 2> <* <* <* <* C/amando o Solver pelo #$% C/amando o Solver pelo #$% C/amando o Solver pelo #$% C/amando o Solver pelo #$% 4444444444444444444444444444444444444444444 2A >* Importando +ados do %ccess >* Importando +ados do %ccess >* Importando +ados do %ccess >* Importando +ados do %ccess 4444444444444444444444444444444444444444444 00 >*2 Eelational +ata!ases 00 >*0 %+( 05 A* A* A* A* ( Pro!lema de transporte ( Pro!lema de transporte ( Pro!lema de transporte ( Pro!lema de transporte 4444444444444444444444444444444444444444444444 0- A*2 Pr8-Modela"em 0- A*0 E:ecuo da %plicao 0; 21* 21* 21* 21* % % % % Pro"rama Pro"rama Pro"rama Pro"rama o em #$% o em #$% o em #$% o em #$% 4444444444444444444444444444444444444444444444 0A 21*2 Confi"ura?es iniciais 0A 21*0 Criando o m:imo no modo "rfico 51 21*5 .anela /is@or)!oo) 52 21*6 Inserindo Cormul 21*6 Inserindo Cormul 21*6 Inserindo Cormul 21*6 Inserindo Cormulrios e Event Bandlers rios e Event Bandlers rios e Event Bandlers rios e Event Bandlers 4444444444444444444444444444444 50 21*- Constru 21*- Constru 21*- Constru 21*- Constru o de Su!rotinas o de Su!rotinas o de Su!rotinas o de Su!rotinas 44444444444444444444444444444444444444444444 56 Concluso Concluso Concluso Concluso 44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 444444444444444444444444444444446- Eefer Eefer Eefer EeferFncias Fncias Fncias Fncias 44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444 4444444444444444444444444444444 44444444444444444444444444444446; $i!lio"r $i!lio"r $i!lio"r $i!lio"rafia afia afia afia44444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444 44444444444444444444444444444444 44444444444444444444444444444444 444444444444444444444444444444446<
3 (!jetivo
( presente projeto tem como o!jetivo servir de um !reve tutorial para a7ueles interessados em utiliGar a plataforma Microsoft E:cel e a lin"ua"em, #isual $asic for %pplications H#$%I como ferramentas para a modela"em de pro!lemas de otimiGao* Procura-se com este tutorial poder e:emplificar a funcionalidade dessa ferramenta para modelos de suporte de deciso*
4 Introduo
( propJsito deste tra!al/o no 8 ensinar em detal/es a lin"ua"em #$%, nem desenvolver a modela"em de um novo pro!lema, mas sim ser um "uia para iniciar a construo de modelos faGendo uso dessa lin"ua"em e e:plorando seus diferenciais e praticidades*
%trav8s do #$%, modelos relativamente comple:os podem ser acessveis a 7ual7uer usurio de E:cel, sendo apresentados de forma ami"vel atrav8s de simplificadas telas de entrada de dados e claros relatJrios finais*
% primeira parte deste tutorial consiste em uma !reve e:plicao das principais ferramentas, conceitos e comandos utiliGados nos modelos* Em se"uida 8 desenvolvido um modelo de transporte clssico, aplicando o 7ue foi mostrado primeiramente*
Pr8-re7uisitos& Este tutorial assume 7ue os leitores estejam familiariGados com modelos clssicos de pes7uisa operacional, 7ue ten/am e:periFncia com al"uma lin"ua"em de pro"ramao e sejam usurios da interface do E:cel*
(!servao& % construo deste tutorial foi !aseada na verso do E:cel 011<, contudo para as outras vers?es / poucas mudanas na lin"ua"em #$% em si*
5 2* ( 7ue 8 #$%9
#$% H#isual $asic for %pplicationsI 8 uma lin"ua"em de pro"ramao com elementos tpicos, como loopin"s, constru?es de if-t/en-else, vetores, fun?es, etc*
( Kfor applicationsL do nome #$%, si"nifica 7ue 7ual7uer softMare de aplicao, como E:cel, %ccess, @ord, ou at8 mesmo pacotes 7ue no sejam da Microsoft, podem ser manipulados pro"ramando-se em #$%* % diferena !sica entre eles consiste em seus o!jetos especficos* Por e:emplo, al"uns o!jetos do E:cel so c8lulas e planil/as* . o @ord possui par"rafos, e o PoMerPoint Slides*
odos 7ue possuem o Microsoft (ffice instalado no computador, podem utiliGar o #$%* No E:cel, o #isual $asic Editor H#$EI, #isual $asic Editor H#$EI, #isual $asic Editor H#$EI, #isual $asic Editor H#$EI, 7ue 8 a rea onde 8 feita a pro"ramao, pode ser acessado pressionando-se %ltOC22 %ltOC22 %ltOC22 %ltOC22*
6 0* (!jetos do E:cel
Para e:emplificar um o!jeto do E:cel, considere uma Pnica c8lula* Essa c8lula 8 um o!jeto do tipo Ean"e Ean"e Ean"e Ean"e, 7ue tem propriedades, como a propriedade #alue #alue #alue #alue Hte:to ou nPmero di"itado na c8lulaI* Esse o!jeto tem tam!8m m8todos, por e:emplo, o m8todo Cop' Cop' Cop' Cop' Hfuno 7ue copia o Ean"eI, , , , 7ue possui ar"umentos como o +estination +estination +estination +estination H=ocal aonde ser colado o 7ue foi copiadoI* %l"uns o!jetos do E:cel possuem eventos* Por e:emplo, o o!jeto @or)!oo) @or)!oo) @or)!oo) @or)!oo) possui o evento (pen (pen (pen (pen*
am!8m e:istem as cole?es de o!jetos 7ue similarmente aos o!jetos, possuem m8todos e propriedades, por8m estes nem sempre so os mesmos dos o!jetos 7ue contFm* Cole?es so diferenciadas por serem nomeadas no plural* Por e:emplo, a coleo de o!jetos @or)s/eets @or)s/eets @or)s/eets @or)s/eets, , , , 8 a coleo de todas as planil/as do ar7uivo, e cada planil/a 8 um o!jeto do tipo @or)s/eet @or)s/eet @or)s/eet @or)s/eet*
Uma Jtima ferramenta para verificar todos os o!jetos, suas propriedades, m8todos, eventos 8 o Pes7uisador de o!jeto Pes7uisador de o!jeto Pes7uisador de o!jeto Pes7uisador de o!jeto 7ue pode ser acessado dentro do editor #$E em E:i!ir E:i!ir E:i!ir E:i!ir - -- -Q Pes7 Q Pes7 Q Pes7 Q Pes7uisador de o!jeto uisador de o!jeto uisador de o!jeto uisador de o!jeto*
(utra ferramenta de ajuda 7ue sempre deve ser utiliGada 8 o Intellisense Intellisense Intellisense Intellisense* %o di"itar em um MJdulo, o nome de um o!jeto, se"uido de um ponto, todas as propriedades e m8todos desse o!jeto sero listados, veja fi"ura 0*2* Essa ferrmamenta tam!8m lista todos os ar"umentos de um m8todo ao di"itar o m8todo e pressionar a tecla de espao, como mostra a fi"ura 0*0* Rual7uer ar"umento e:i!ido em c/aves 8 opcional, os outros so o!ri"atJrios*
Ci"ura 0*2 Ci"ura 0*0 7 5* Conceitos !sicos
Esse captulo pretende mostrar de forma !reve como 8 a sinta:e dos comandos necessrios para o entendimento da modela"em 7ue ser feita no captulo HI*
Uma modela"em "eralmente possui muitas tarefas, o 7ue em #$% 8 c/amado de su! su! su! su!- -- -rotina, macro rotina, macro rotina, macro rotina, macro ou simplesmente su!* su!* su!* su!* Uma su! "eralmente 8 um "rupo de cJdi"os di"itados em um MJdulo MJdulo MJdulo MJdulo, 7ue e:ecutam uma determinada tarefa* Para inserir um mJdulo entre no editor #$E em HInserir HInserir HInserir HInserir - -- -Q MJduloI Q MJduloI Q MJduloI Q MJduloI* Uma su!-rotina tem um nome e pode ou no ter ar"umentos como em&
Para e:emplificar, esta su!-rotina pode ser c/amada da se"uinte forma&
%o c/amar uma su!-rotina com ar"umentos, eles devem coincidir em tipo, ordem e nPmero, mas no precisam ter os mesmo nomes*
5*0 5*0 5*0 5*0 #ari #ari #ari #ari veis e Constantes veis e Constantes veis e Constantes veis e Constantes
Como em muitas lin"ua"ens, as variveis precisam ser declaradas* Isso pode ser feito atrav8s da sentena +im +im +im +im* (s tipos de variveis mais utiliGados so&
Strin" Strin" Strin" Strin" Hpara palavrasIS Inte"er Inte"er Inte"er Inte"er Hpara valores inteirosIS =on" =on" =on" =on" Hpara valores inteiros "randesIS Sub Teste(Name As String, Number As Integer)
End Sub Sub Chamar() Dim Nome As Sting, Numero As Integer ... Call Teste(Nome, Num) End Sub 8 $oolean $oolean $oolean $oolean Hassume os valores rue ou CalseIS Sin"le Sin"le Sin"le Sin"le Hpara nPmeros decimaisIS +ou!le +ou!le +ou!le +ou!le Hpara nPmeros decimais com mais casasIS Currenc' Currenc' Currenc' Currenc' Hpara valores monetriosIS #ariant #ariant #ariant #ariant Hpode ser de 7ual7uer tipo a ser decidido pelo #$%I*
E:emplo& && &
(u, simplificando&
(ption E:plicit& (ption E:plicit& (ption E:plicit& (ption E:plicit& UtiliGando o Comando (ption E:plicit (ption E:plicit (ption E:plicit (ption E:plicit no incio de um mJdulo foramos a declarao das variveis, antes de 7ual7uer uso dela* Se al"uma no for declarada, uma mensa"em de erro aparecer na tela*
(!jetos& (!jetos& (!jetos& (!jetos&
Um o!jeto tam!8m 8 uma varivel e deve ser declarado como em&
CaGendo isso, podemos atri!uir um ran"e a KcelulaL e tra!al/ar com essa varivel*
E:emplo& && &
Sub Var() Dim j As Integer Dim name As String Dim Test As Boolean End Sub
Sub Var() Dim j As Integer, name As String, Test As Boolean End Sub Dim celula As Range Dim celula As Range Set celula = ActiveWorkbook.Worksheets(Data).Range(Nomes) celula.Font.Size=12 9
( comando Set sempre 8 usado para atri!uir valor ou definir uma varivel do tipo (!jeto, mas nunca 8 usado para outros tipos de variveis* Por e:emplo, para uma varivel do tipo KInte"erL, atri!umos valor desta forma&
Se o pro"ramador declarar uma varivel dentro de certa su!-rotina, esta varivel ser local, ou seja, ser acessada apenas por essa su!-rotina* Caso deseje-se utiliGar uma varivel em mais de uma su!-rotina do mJdulo, 8 necessrio declarar a varivel da forma como foi e:plicado, por8m no incio do mJdulo, antes de 7ual7uer su!- rotina* %"ora, se o modelo tiver mais de um mJdulo, ou, por e:emplo, um Event Bandler para UserCorms, e deseja-se 7ue certa varivel seja visvel para todos os mJdulos e Event Bandlers, ento declara-se a varivel tam!8m no incio do mJdulo mas da se"uinte forma&
Pelo padro do #$%, su!-rotinas so pP!licas, ou seja, podem ser c/amadas por 7ual7uer outra su!-rotina do projeto* Para 7ue essa su!-rotina sJ possa ser c/amada dentro de um mJdulo, a declaramos desta forma&
Dim j As Integer j=20 Const Taxa=0.9 Public variavel As Integer Private Sub Test() 10 5*5 5*5 5*5 5*5 Cai:as de Entrada e Mensa"ens Cai:as de Entrada e Mensa"ens Cai:as de Entrada e Mensa"ens Cai:as de Entrada e Mensa"ens
+uas das mais comuns tarefas de pro"ramas em #$% so& pe"ar dados do usurio e mostrar mensa"ens ou resultados* Para isso e:istem as fun?es Input$o: Input$o: Input$o: Input$o: e Ms"$o:, Ms"$o:, Ms"$o:, Ms"$o:, respectivamente*
( Input$o: rece!e pelo menos um ar"umento, uma mensa"em informando o usurio o 7ue se espera 7ue ele di"ite como entrada* Um se"undo ar"umento 7ue pode ser usado 8 o ttulo da cai:a*
E:emplo& && &
( Ms"$o: rece!e pelo menos um ar"umento, a mensa"em 7ue deseja-se informar* +ois ar"umentos opcionais so& um !oto de indicao e o ttulo da cai:a*
E:emplo& && &
Ci"ura 5*2 Dim Cor As String Cor = InputBox(Entre com a cor desejada, Escolhendo a cor) MsgBox A cor laranja., vbInformation, Cor escolhida 11
5*6 5*6 5*6 5*6 Comentrio Comentrio Comentrio Comentrios ss s, Concatenao de Strin" e Pular =in/as , Concatenao de Strin" e Pular =in/as , Concatenao de Strin" e Pular =in/as , Concatenao de Strin" e Pular =in/as
Se"ue a!ai:o as sentenas desses 5 tJpicos&
Comentrios Comentrios Comentrios Comentrios
Coloca-se o caracter K T K antes da lin/a a ser comentada*
Ruando uma lin/a de cJdi"o e:ceder o taman/o da tela, 8 possvel cort-la e continuar na prJ:ima lin/a atrav8s dos caracteres Hespao O underlineI* Por e:emplo&
MsgBox InputBox(Digite um nmero a ser exibido na caixa de mensagem, _ Entrada de dados), vbInformation, Nmero digitado
Ci"ura 5*0 Esta linha um comentrio 12 Concatenao de Strin"s Concatenao de Strin"s Concatenao de Strin"s Concatenao de Strin"s
Ruando 7uereremos escrever uma mensa"em com partes literais e outras variveis, por e:emplo, o valor de uma varivel, devemos concatenar uma strin", separando as partes com o caractere KU UU UL& && &
E:emplo& && &
5*- #etores 5*- #etores 5*- #etores 5*- #etores
+eclara-se um vetor desta forma&
Ruando no se sa!e de antemo o taman/o do vetor, o declaramos desta forma&
Se o taman/o do vetor for con/ecido ao lon"o da e:ecuo do pro"rama, deve- se redimension-lo para o armaGenamento necessrio de memJria* Para isso, utiliGa- se a sentena Eedim Eedim Eedim Eedim& && &
Pode-se usar a declarao Eedim toda veG 7ue se deseja mudar a dimenso de um vetor* Por8m ao faGer isso, todo o contePdo do vetor ser apa"ado* Para 7ue isso no ocorra, 8 necessrio utiliGar a declarao Preserve Preserve Preserve Preserve&
Dim product As Integer product=12 MsgBox O nmero do produto & product & . Dim vetor(100) As String Dim vetor() As String numero= InputBox(Quantos ndices o vetor ter?) Redim vetor(Numero) numero=numero+1 Redim Preserve vetor(1 to Numero) 13 % declarao K(ption $aseL % declarao K(ption $aseL % declarao K(ption $aseL % declarao K(ption $aseL
( padro do #$% para o primeiro ndice de um vetor 8 1 e no 2, o 7ue 8 c/amado de K1-!ase inde:in"L* Para 7ue o primeiro ndice seja 2, 8 necessrio acrescentar a se"uinte lin/a no incio de um mJdulo&
am!8m pode-se forar o primeiro ndice de um vetor a ser 2 mesmo 7ue o sistema esteja no padro K1-!ase inde:in"L, declarando-o desta forma&
Essa propriedade rece!e dois ar"umentos, o primeiro referente V lin/a e o se"undo V coluna, indicando 7ue a partir de determinada c8lula, move-se para a c8lula referente ao deslocamento definido pelos ar"umentos* Para ir V uma lin/a acima o ar"umento 8 posivito, e a!ai:o, ne"ativo* Para ir V uma coluna V direita o ar"umento 8 positivo, V es7uerda, ne"ativo* Por e:emplo&
Pode-se tam!8m especificar um "rupo de c8lulas, como&
Option Base 1 Dim vetor(1 to 100) Range(B3).Offset(-1,1).Select With Range(A1) Range(.Offset(1,1), .Offset(2,2)).Select End With 14
5* 5* 5* 5*< << < Propriedade End Propriedade End Propriedade End Propriedade End
Essa propriedade seleciona a partir de uma c8lula 7ue conten/a um valor, uma cai:a de c8lulas 7ue conten/am valores, at8 encontrar uma c8lula vaGia* Ele toma um ar"umento 7ue determina uma direo* Por e:emplo&
Esse comando funciona da mesma forma 7ue selecionar a c8lula %2, manter pressionado a tecla S/ift e pressionar a tecla End, +oMn e Ei"/t sucessivamente*
5* 5* 5* 5*> >> > Constru?es com @it/ Constru?es com @it/ Constru?es com @it/ Constru?es com @it/
Este 8 um comando muito Ptil para evitar a repetio de palavras 7uando se tra!al/a com o!jetos, seus m8todos e propriedades* Se"ue um e:emplo da construo&
Ci"ura 5*6 With Range(A1) Range(.Offset(0,0),.End(xlDown).End(xlToRight)).Select End With Workbooks(Condomnio).Worksheets(Casas).Range(A1).Value=Azul Workbooks(Condomnio).Worksheets(Casas). Range(A1).Font.Name=Arial Workbooks(Condomnio).Worksheets(Casas). Range(A1).Font.Bold=True Workbooks(Condomnio).Worksheets(Casas). Range(A1).Font.Size=12
Agora usando With
With Workbooks(Condomnio).Worksheets(Casas). Range(A1) .Value=Azul With.Font .Name=Arial .Bold=True .Size=12 End With End With 15 5*A 5*A 5*A 5*A Estruturas de condi?es Estruturas de condi?es Estruturas de condi?es Estruturas de condi?es
Se"uem a!ai:o as estruturas de condi?es do #$%&
Estrutura IC Estrutura IC Estrutura IC Estrutura IC Estrutura Case Estrutura Case Estrutura Case Estrutura Case
5* 5* 5* 5*21 21 21 21 Estru Estru Estru Estrutu tu tu turas de =oopin"s ras de =oopin"s ras de =oopin"s ras de =oopin"s
Estrutura Estrutura Estrutura Estruturas ss s +o =oops +o =oops +o =oops +o =oops
For counter=first To last [Step increment] Statements Next [counter] Dim item as Object For Each item in Collection Statements Next Select Case someVariable Case value1 Statements1 Case value2 Statements2
[Case Else OtherStatements] End Select If condition1 Then Statements1 [ElseIf condition2 Then Statements2
Else OtherStatements] End If Do Statements Loop Until condition
Do Until condition Statements Loop
Do While condition Statements Loop
Do Statements Loop While condition
16 6* @or)!oo)s
Um @or)!oo) @or)!oo) @or)!oo) @or)!oo) 8 !asicamente o ar7uivo em E:cel*, ou seja, toda a rea de tra!al/o* Uma coleo @or)!oo)s 8 a coleo de todos os Mor)!oo)s a!ertos* Rual7uer mem!ro dessa coleo pode ser especificado por um nome como @or)!oo)sHK%r7uivo :LI* Cada Mor)!oo) individual possui as cole?es @or)s/eets e C/arts, por e:emplo* (utro conceito 8 o de 7ue @or)!oo)s, @or)s/eets e C/arts tam!8m so o!jetos, e possuem m8todos e propriedades* Uma importante propriedade 8 o Count Count Count Count, 7ue conta o nPmero de Mor)s/eets, Mor)!oo)s ou c/artsS e um m8todo importante 8 o %dd %dd %dd %dd, 7ue adiciona uma nova coleo dentre essas*
-* Event Bandler
Um Event Bandler 8 uma su!-rotina 7ue 8 e:ecutada sempre 7ue certo evento ocorre* Um dos mais importantes 8 o se"uinte&
Esse Event Bandler responde ao evento de a!rir uma pasta de tra!al/o, ou seja, ele ocorre ao a!rir um ar7uivo em E:cel* Ele sempre 8 colocado na janela /is@or)!oo) ou EstaPasta4de4tra!al/o do #$E* Esta janela 8 reservada para eventos relacionados V um Mor)!oo)*
;* User Corms
User Corms so janelas para a entrada de dados do usurio* Para constru-los 8 necessrio ela!orar a parte "rfica com a funcionalidade desejada e de forma a ser atrativa e prtica para o usurio* %l8m disso, 8 necessrio implementar a parte da pro"ramao 7ue e:ecuta as tarefas determinadas pelo usurio*
17
;*2 Parte "rfica ;*2 Parte "rfica ;*2 Parte "rfica ;*2 Parte "rfica
Primeiramente, entre no editor #$E e torne visvel as janelas Project E:plorer HE:i!ir E:i!ir E:i!ir E:i!ir- -- -Q Project E:plor Q Project E:plor Q Project E:plor Q Project E:plorer er er erI e .anela de propriedades HE:i!ir E:i!ir E:i!ir E:i!ir- -- -Q .anela de propriedades Q .anela de propriedades Q .anela de propriedades Q .anela de propriedadesI* Para inserir um User Corm cli7ue em HInserir Inserir Inserir Inserir- -- -Q User Corm Q User Corm Q User Corm Q User CormI* Uma janela como essa ser e:i!ida&
%l8m das ferramentas e:i!idas na cai:a de ferramentas, outras podem ser adicionadas clicando com o !oto direito na cai:a e em controles adicionais*
odas as ferramentas da cai:a de ferramentas so !astante intuitivas de serem usadas, por8m para e:plica?es mais detal/adas consulte a !i!lioteca MSCorms no Pes7uisador de (!jetos*
% janela de propriedades mostra as propriedades de cada controle se este estiver selecionado* +uas propriedades importantes so Name e Caption* % propriedade Name 8 usada como referFncia para um UserCorm e a Caption confi"ura os te:tos e:i!idos na tela* Essas propriedades, assim como todas as outras podem ser alteradas diretamente na janela de propriedades* Ci"ura ;*2
18
Para visualiGar o resultado final do Userform cli7ue em E:ecutar-QE:ecutar Su!WuserCorm ou a tecla C-*
;*0 Event Bandler para User Corms ;*0 Event Bandler para User Corms ;*0 Event Bandler para User Corms ;*0 Event Bandler para User Corms
Um Event Bandler de uma User Corm so colocados na janela de cJdi"o de uma User Corm* Para visualiG-la insira uma User Corm como foi e:plicado anteriormente, e cli7ue em HE:i!ir HE:i!ir HE:i!ir HE:i!ir - -- -Q cJdi"oI* Q cJdi"oI* Q cJdi"oI* Q cJdi"oI* Nesta janela esto todas as su!-rotinas de cada item da User Corm* (s nomes das su!-rotinas iniciam-se com o nome do item se"uido por KunderlineL e um evento* Na janela de cJdi"os, e:istem duas listas, uma controla os itens da User Corm e a User Corm em si, e a outra controla os eventos correspondentes ao 7ue foi selecionado na primeira lista* #eja as fi"uras a!ai:o&
Ci"ura ;*0
Ci"ura ;*5
+entro de cada su!-rotina 8 necessrio escrever o cJdi"o para a e:ecuo de determinada tarefa* % id8ia de Event Bandler para User Corm 8 decidir 7ual tarefa ser e:ecutada como resposta a certo evento*
19 <* C/amando o S(=#EE pelo #$%
Este tJpico assume 7ue o leitor sai!a usar o S(=#EE da forma usual atrav8s da interface do E:cel* Mesmo com o uso do S(=#EE pelo #$%, 8 necessrio 7ue as entradas e as fJrmulas 7ue relacionam os dados j estejam di"itadas em uma planil/a* Para informa?es mais detal/adas, consultar a referFncia X2Y*
Solver 8 um aplicativo 7ue foi desenvolvido pela Crontline S'stems, os 7uais feliGmente escreveram vrias fun?es em #$%, permitindo assim manipul-lo atrav8s da pro"ramao* Para utiliGar essas fun?es, o primeiro passo 8 criar uma referFncia para o S(=#EE no #$E* Isso pode ser feito em Cerramentas Cerramentas Cerramentas Cerramentas- -- -QEeferFncias QEeferFncias QEeferFncias QEeferFncias, marcando S(=#EE na lista e:i!ida&
Uma referFncia ir aparecer na janela de Projeto&
Ci"ura <*2 20
odas as fun?es do Solver comeam com a palavra Solver Solver Solver Solver* %s mais usadas so SolverEeset, Solver(), Solver%dd, Solver(ptions e SolverSolver, 7ue sero e:plicadas a!ai:o* Para visualiGar a lista completa, entre no Pes7uisador de (!jeto, selecione a !i!lioteca Solver, e ento, o "rupo #$%4Cunctions*
Cun?es& Cun?es& Cun?es& Cun?es&
- -- -SolverEeset SolverEeset SolverEeset SolverEeset %pa"a todas as confi"ura?es anteriores para um novo clculo*
H2I H2I H2I H2I Identifica a c8lula 7ue cont8m a funo o!jetivo H0I H0I H0I H0I Especifica se o pro!lema 8 de ma:imiGao ou minimiGao H5I H5I H5I H5I Identifica as c8lulas com as variveis de deciso*
E:emplo&
( ar"umento Ma:Min#al, rece!e 2 para pro!lemas de ma:imiGao e 0 de minimiGao*
- -- -Solver%dd Solver%dd Solver%dd Solver%dd Essa funo adiciona uma nova restrio cada veG 7ue 8 c/amada e tem trFs ar"umentos*
Ci"ura <*0 SolverOK SetCell:=Range(Profit), MaxMinVal=:1, ByChange:=Range(Quantities) 21 ( ar"umento central 8 um ndice de relao 7ue tem valores 2 para K[\ [\ [\ [\L, 0 para K\ \\ \L, 5 para KQ\ Q\ Q\ Q\L, 6 para Kinteiro inteiro inteiro inteiroL e - para K!inrio !inrio !inrio !inrioL* (s outros ar"umentos sero as c8lulas relacionadas* Para as desi"ualdades, o primeiro ar"umento 8 sempre especificado como um Ean"e, e o terceiro como uma strin" ou nPmero*
E:emplo&
-Solver(p Solver(p Solver(p Solver(ptions tions tions tions Essa funo permite escol/er 7ual7uer uma das op?es da janela de op?es do Solver&
Pelo fato de todas as op?es no serem o!ri"atJrias, !asta listar somente os ar"umentos desejados, separando-os por vr"ula* Uma dica 8 utiliGar o Intelicensse di"itando Solver(ptions e espao para ver os nomes dos vrios ar"umentos possveis*
- -- -SolverSolve SolverSolve SolverSolve SolverSolve Essa funo 8 e7uivalente a clicar no !oto KEesolverL na usual janela do Solver para e:ecutar a otimiGao* SolverSolve retorna um valor inteiro, sendo 1 sinaliGando 7ue o Solver foi e:ecutado com sucesso, 6 para no conver"Fncia e - para soluo no factvel* ] conveniente usar o ar"umento UserCinis/&\rue, para 7ue a janela de resultados padro no aparea ao final, evitando interrup?es ao lon"o da e:ecuo*
E:emplo&
>* Importando dados do %ccess
Muitas veGes o desenvolvimento de uma modela"em e:i"e o acesso a uma maior 7uantidade de dados de forma 7ue a entrada destes dados por uma User Corm torna-se ineficiente* Estes dados podem estar em um outro ar7uivo de E:cel, ou at8 em um servidor de !anco de dados* E:istem vrias tecnolo"ias para a importao destes dados, sendo o %+(H%ctive^ +ata (!jectsI uma das mais recentes e compatveis com o #$% para o E:cel*
( %ccess 8 um softMare 7ue lida com Krelational +ata!asesL, 7ue so !anco de dados 7ue tem al"uma relao entre si* Esse tipo de !anco reduG a duplicao de lin/as 7ue e:istiriam se todas as informa?es estivessem em um Pnico !anco de dados* SolverOptions AssumeLinear:=True, AssumeNonneg:=True, Precision:=0.00001 Dim result As Integer result = SolverSolve(UserFinish:=True) If result = 5 Then MsgBox No existe nenhuma soluo factvel. End if 23
% lin"ua"em Structured Ruer' =an"ua"e HSR=I foi desenvolvida para retornar dados de !ancos de dados relacionados* Ele se aplica de certa forma V todos os sistemas de !ancos de dados como o %ccess, SR= Server, (racle, etc* Por8m esta lin"ua"em no 8 perce!ida ao tra!al/ar com o %ccess, pois este possui uma interface ami"vel ao usurio, 7ue esconde as sentenas da lin"ua"em*
Para desenvolver a modela"em sero utiliGados !ancos de dados do %ccess e portanto, a lin"ua"em SR= dentro do #$%, por8m de forma !em simples* Para informa?es mais detal/adas a referFncia X5Y*
> >> >*0 %+( *0 %+( *0 %+( *0 %+(
% tecnolo"ia %+( permite ao desenvolvedor escrever cJdi"os relativamente simples para !uscar um !anco de dados e:ternos* Para utiliGar o %+(, 8 necessrio inserir uma referFncia a ele* No editor #$E, entre em Cerramentas Cerramentas Cerramentas Cerramentas- -- -QEeferFncias QEeferFncias QEeferFncias QEeferFncias, procure a !i!lioteca Microsoft %ctive^ +ata (!jects Microsoft %ctive^ +ata (!jects Microsoft %ctive^ +ata (!jects Microsoft %ctive^ +ata (!jects 0*: 0*: 0*: 0*: e cli7ue em (Z* Essa referFncia no ir aparecer no Project E:plorer como o Solver, pois nesse campo sJ aparecem items no desenvolvidos pela Microsoft* Para se referir V um o!jeto do %+(, use o prefi:o %+(+$ %+(+$ %+(+$ %+(+$, como em %+(+$*Connection* %ssim 7ue di"itar %+(+$* e um espao, uma ajuda so!re a !i!lioteca ser dada pelo Intellisense* Pode-se consultar ajuda tam!8m pelo Pes7uisador de (!jetos*
% %% %!rir uma cone:o com o !anco de dados& !rir uma cone:o com o !anco de dados& !rir uma cone:o com o !anco de dados& !rir uma cone:o com o !anco de dados&
Primeiramente, declarar uma varivel no formato de um o!jeto do tipo Connection, especificar aonde o ar7uivo est, e 7ual seu provedor, no caso do %ccess o provedor 8 Microsof .et 6*1 (=E +$ Provider* Ento, a!rir o ar7uivo e fec/ar a cone:o* Se"ue um e:emplo&
24
%!rir %!rir %!rir %!rir um Ee"istro um Ee"istro um Ee"istro um Ee"istro
Um re"istro 8 um !anco de dados temporrio 7ue fica armaGenado na memJria* Para acess-lo, declara-se uma varivel no formato de um o!jeto do tipo Eecordset, depois utiliGando uma varivel do tipo strin" 7ue cont8m declara?es em SR=, a!rimos o re"istro com o m8todo (pen* (s dois primeiros ar"umentos deste m8todo so uma SR= strin" e o o!jeto de cone:o 7ue j foi a!erto* Se"ue o cJdi"o do procedimento&
( %+( pode ser usado para a!rir outros tipos de !ancos de dados sem ser no formato %ccess, como por e:emplo, !ancos de dados armaGenados em servidores* % Pnica diferena nos cJdi"os acima para a!rir estes !ancos so nas propriedades ConnectionStrin" e Provider*
Pr Pr Pr Procurar al"uma informao no !anco de dados& ocurar al"uma informao no !anco de dados& ocurar al"uma informao no !anco de dados& ocurar al"uma informao no !anco de dados&
Dim cn as New ADOBD.Connection Esse cdigo procura o arquivo Arquivo.mdb na pasta de trabalho atual em que o arquivo de Excel se encontra. With cn .ConnectionString=Data Source & ThisWorkbook.Path & \Arquivo.mdb .Provider = Microsof Jet 4.0 OLE DB Provider .Open End With
cn.Close rs as New ADOBD.Recordset Abrir o registro rs.Open SQL, cn Fecha o registro rs.Close
Este cdigo executa as declaraes em cada linha do registro at encontrar o fim do arquivo, (EOF significa end of file). With rs Do Until .EOF Delacraes .MoveNext Loop End With
25
%l"uns comandos Pteis em SR=& %l"uns comandos Pteis em SR=& %l"uns comandos Pteis em SR=& %l"uns comandos Pteis em SR=&
SE=EC& SE=EC& SE=EC& SE=EC& lista os campos 7ue cont8m os dados desejados* CE(M& CE(M& CE(M& CE(M& especifica a ta!ela ou ta!elas 7ue cont8m estes dados* @BEEE& @BEEE& @BEEE& @BEEE& =ista um crit8rio especfico* DE(UP $_ DE(UP $_ DE(UP $_ DE(UP $_& && & permite o a"rupamentos de al"uns dados, por e:emplo o total de carros de certa marca* Neste caso o comando seria DE(UP $_ marca* (E+EE $_& (E+EE $_& (E+EE $_& (E+EE $_& Permite ordenar o !anco desejado*
A* Implementando a Modela"em
A AA A*2 Pr8 *2 Pr8 *2 Pr8 *2 Pr8- -- -Modela"em Modela"em Modela"em Modela"em
%ntes de iniciar uma modela"em em #$%, 8 Ptil 7ue o pro"ramador pense nos se"uintes tJpicos&
2 22 2-Como os dados sero inseridos 0 00 0-Como criar o modelo com os dados de entrada e o!ter a resoluo do pro!lema 5 55 5-Como os resultados sero e:i!idos
Para solucionar o se"undo tJpico 8 necessrio con/ecimento matemtico de modela"em, e isso no ser tratado neste tutorial* Para mais informa?es so!re a modela"em a ser desenvolvida consulte a referFncia X0Y*
Como resposta do primeiro tJpico, o pro"ramador pode escol/er a entrada de dados por cai:as de dilo"o, construindo User Corms* Mas como na maioria das veGes e:iste uma "rande 7uantidade de dados a ser tra!al/ada, essa opo torna-se invivel* Muitas veGes os dados esto em outros ar7uivos do E:cel, ou em !ancos de dados e:ternos, como no %ccess* ( modelo 7ue se"ue tratar desta Pltima opo*
( terceiro tJpico tem como opo !asicamente o uso de "rfico ou ta!elas, e 8 prefervel decidir de antemo 7uais dados sero analisados e 7uais tipos de "rficos sero reportados* 26
(!serva?es Importantes (!serva?es Importantes (!serva?es Importantes (!serva?es Importantes
2* 2* 2* 2* ] importante dei:ar claro ao usurio o 7ue a aplicao faG e suas limita?es* Uma forma de se faGer isso 8 faGer uma criando uma planil/a e:plicativa com a descrio do modelo a ser desenvolvido, 7ue o usurio ir ver assim 7ue a!rir o ar7uivo em E:cel* %s e:plica?es mais detal/adas podem ser dadas em cai:as de dilo"o, por e:emplo*
0* 0* 0* 0* en/a o /!ito de criar uma su!-rotina principal 7ue c/ama as outras su!- rotinas* ] prefervel 7ue estas e:ecutem pe7uenas tarefas ao inv8s de se usar uma Pnica su!-rotina 7ue realiGe muitas tarefas*
5* 5* 5* 5* +ecida o 7ue pode ser feito "raficamente em veG de em tempo real* % interface do E:cel oferece maneiras muito rpidas de criar "rficos ou ta!elas, ou inserir fJrmulas* Portanto se no modelo, por e:emplo, ser e:i!ido um "rfico, pode- se criar uma planil/a com o KtemplateL desse "rfico e ento manipul-lo pelo #$%, alterando o 7ue for necessrio* % id8ia 8 7ue 7uanto mais elementos puderem ser feitos "raficamente pela interface do E:cel, menos esforo ser despendido na pro"ramao*
A AA A*0 *0 *0 *0 E:ecuo da %plicao E:ecuo da %plicao E:ecuo da %plicao E:ecuo da %plicao
% aplicao est no ar7uivo ransporte*:lsm* Ruando esse ar7uivo 8 a!erto, a planil/a KE:plicativaL da fi"ura A*2 aparece* Ruando o !oto HE:ecutar a aplicaoI 8 clicado, 8 apresentado ao usurio uma cai:a de dilo"o como o da fi"ura A*0, contendo uma lista com todas as f!ricas e revendedores disponveis no !anco de dados* ( usurio pode selecionar 7uantos locais desejar e os dados destes locais so importados do !anco de dados para a planil/a KModeloL Hfi"ura A*5I* Ento, o modelo em si 8 desenvolvido atrav8s da c/amada do Solver, e os resultados so transferidos para a planil/a KEesultadosL Hfi"ura A*6I* ( usurio pode ento, e:ecutar novamente a aplicao selecionando diferentes f!ricas e revendedores*
27
Ci"ura A*2
Ci"ura A*0
28
Ci"ura A*5
Ci"ura A*6
Para 7ue a aplicao funcione corretamente, 8 necessrio 7ue o ar7uivo em %ccess se c/ame ransporte*md! e esteja na mesma pasta 7ue o ar7uivo ransporte*:lsm* Este ar7uivo precisa conter 5 ta!elas H+emand, Capacit' e UnitCostI com o formato como mostra a fi"ura a!ai:o&
29
Ci"ura A*-
Esse ar7uivo pode ser alterado desde 7ue manten/a o formato acima* Pode-se adicionar ou e:cluir mais f!ricas e revendedores ou alterar nomes e custos*
21* Pro"ramao em #$%
Esse captulo mostra todas as macros utiliGadas na construo do modelo* %l"umas so !em simples e outras mais comple:as, por8m com as informa?es 7ue foram dadas at8 a7ui so!re a lin"ua"em e com os comentrios 7ue se"uem dentro de cada su!-rotina, 8 possvel compreendF-las*
21 21 21 21*2 Confi"ura?es in *2 Confi"ura?es in *2 Confi"ura?es in *2 Confi"ura?es ini ii iciais ciais ciais ciais
Como o modelo utiliGar o Solver Solver Solver Solver e o %+( %+( %+( %+(, 8 necessrio inserir uma referFncia a eles como foi e:plicado nos captulos anteriores* #ale lem!rar 7ue a referFncia ao 30 %+( no ir aparecer no Project E:plorer* am!8m cria-se um mJdulo mJdulo mJdulo mJdulo para a insero das su!-rotinas*
21 21 21 21*0 Criando o m:imo no modo "rfico *0 Criando o m:imo no modo "rfico *0 Criando o m:imo no modo "rfico *0 Criando o m:imo no modo "rfico
Primeiramente, cria-se o m:imo do la'out no modo "rfico* udo o 7ue no for variar ao lon"o da e:ecuo do modelo pode ser feito nesse modo* No modelo, criam-se 5 planil/as* % KE:plicativa E:plicativa E:plicativa E:plicativaL pode ser criada totalmente no modo "rfico como estava na fi"ura A*2* Nesta planil/a 8 inserido um !oto li"ado V su!-rotina Mainransport* Como a planil/a KModelo Modelo Modelo ModeloL ser preenc/ida praticamente em tempo real, pois o pro!lema tem taman/o varivel, o 7ue pode ser feito em modo "rfico est na fi"ura 21*2* E o 7ue pode ser feito da planil/a KEesultados Eesultados Eesultados EesultadosL est na fi"ura 21*0* Nesta planil/a tam!8m e:iste um !oto 7ue c/ama a su!-rotina Mainrasport* %o criar as planil/as, automaticamente uma referFncia V elas ir aparecer no Project E:plorer do #$E*
Para "arantir 7ue a planil/a e:plicativa aparea 7uando o ar7uivo 8 a!erto, e 7ue as outras no apaream, o se"uinte cJdi"o 8 implementado na janela /is@or)!oo)*
Ci"ura 21*0
Ci"ura 21*5 Private Sub Workbook_Open() Worksheets("Modelo").Visible = False Worksheets("Resultados").Visible = False Worksheets("Explicativa").Activate Range("G18").Select End Sub 32 21*6 21*6 21*6 21*6 Inserindo Cormulrios e EventBandlers Inserindo Cormulrios e EventBandlers Inserindo Cormulrios e EventBandlers Inserindo Cormulrios e EventBandlers
Cria-se um formulrio HfrmInputsI como foi descrito no captulo ;, com um la'out contendo 0 cai:as de lista"em nomeadas l!Plants e l!Eetailers e dois !ot?es& () e Cancel* #eja a fi"ura a!ai:o&
Cada cai:a possui a propriedade de mPltipla seleo HMultiSelectI escol/ida como 0-fmMultiSelectE:tended, 7ue permite o usurio selecionar mais de um item das cai:as se"urando a tecla Ctrl*
% su!-rotina !tnCancel4Clic) e:ecuta sua funo usual, saindo do formulrio e terminando a aplicao* % su!rotina !tn(Z4clic), usa a propriedade Selected 7ue 8 K1-!ased inde:in"L para capturar as f!ricas e revendedores selecionados em vetores pP!licos K2-!ased inde:in"L HselectedPlants e selectedEetailersI 7ue esto declarados no incio do mJdulo* +epois de capturar esses vetores, constrJi-se com eles duas strin"s Plants=ist e Eetailers=ist 7ue sero usados para capturar os custos unitrios* +essa forma se o usurio selecionar, por e:emplo, as f!ricas $oston, NeM _or), oronto, Plants=ist ser KHT$oston`,`NeM _or),`oronto`IL* % su!-rotina UserCorm4InitialiGe preenc/e as cai:as de lista"em com todas as f!ricas e revendedores e:istentes no !anco de dados, 7ue esto armaGenados nos vetores e:istin"Plant e e:istin"Eetailer*
( cJdi"o completo encontra-se a!ai:o&
Ci"ura 21*6 33
Private Sub btnCancel_Click() Unload Me End End Sub
Private Sub btnOK_Click() ' Preenche um vetor, selectedPlant, com as fbricas selecionadas. nSelectedPlants = 0 For i = 1 To lbPlants.ListCount If lbPlants.Selected(i - 1) Then nSelectedPlants = nSelectedPlants + 1 ReDim Preserve selectedPlant(nSelectedPlants) selectedPlant(nSelectedPlants) = lbPlants.List(i - 1) End If Next If nSelectedPlants = 0 Then MsgBox "Favor selecionar ao menos uma fbrica.", vbExclamation, _ "Seleo requerida" Exit Sub End If
' Constri uma string, PlantList, que tem a seguinte estrutura: ' ('_','_','_'), dependendo das fbricas selecionadas. plantList = "(" For i = 1 To nSelectedPlants If i < nSelectedPlants Then plantList = plantList & "'" & selectedPlant(i) & "'," Else plantList = plantList & "'" & selectedPlant(i) & "')" End If Next
' Preenche um vetor, selectedRev, com os revendedores selecionados. nSelectedRetailers = 0 For i = 1 To lbRetailers.ListCount If lbRetailers.Selected(i - 1) Then nSelectedRetailers = nSelectedRetailers + 1 ReDim Preserve selectedRetailer(nSelectedRetailers) selectedRetailer(nSelectedRetailers) = lbRetailers.List(i - 1) End If Next If nSelectedRetailers = 0 Then MsgBox "Favor selecionar ao menos um revendedor.", vbExclamation, _ "Seleo requerida" Exit Sub End If
34
21* 21* 21* 21*- -- - Construo de Su!rotinas Construo de Su!rotinas Construo de Su!rotinas Construo de Su!rotinas
+entro da janela KModule 2L, antes de iniciar 7ual7uer su!rotina, definimos a opo de inde:ao como K2-!ase inde:in"L e foramos a declarao de variveis antes dela ser usada* am!8m declaramos as variveis pP!licas e as 7ue so visveis em todo mJdulo&
selectedRetailer(nSelectedRetailers) = lbRetailers.List(i - 1) End If Next If nSelectedRetailers = 0 Then MsgBox "Favor selecionar ao menos um revendedor.", vbExclamation, _ "Seleo requerida" Exit Sub End If
' Constri uma string, RevList, que tem a seguinte estrutura: ' ('_','_','_'), dependendo dos revendedores selecionados. retailerList = "(" For i = 1 To nSelectedRetailers If i < nSelectedRetailers Then retailerList = retailerList & "'" & selectedRetailer(i) & "'," Else retailerList = retailerList & "'" & selectedRetailer(i) & "')" End If Next
Unload Me End Sub
Private Sub UserForm_Initialize() ' Preenche as caixas de listagem com os vetores. lbPlants.List = existingPlant lbRetailers.List = existingRetailer End Sub 35
Sub Main Transport() ' Essa a macro que executada quando o boto anexado na planilha ' Explicativa clicado.
' Desliga a funo de atualizao da tela do Excel para aumentar o desempenho da ' aplicao Application.ScreenUpdating = False
' Abre uma conexo com o banco de dados do Access, assumindo que esse ' banco e a pasta de trabalho do Excel estejam na mesma pasta. With cn .ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Transporte.mdb" .Provider = "Microsoft Jet 4.0 OLE DB Provider" .Open End With
' Importa os dados desejados do banco. Call GetPlantAndRetailers frmInputs.Show Call CheckSolverLimit Call EnterModelData
' Fecha a conexo com o banco de dados. cn.Close
' Configura e soluciona o modelo. Call EnterFormulas Call SetAndRunSolver End Sub Option Explicit Option Base 1
Public existingPlant() As String, existingRetailer() As String Public nSelectedPlants As Integer, nSelectedRetailers As Integer Public selectedPlant() As String, selectedRetailer() As String Public plantList As String, retailerList As String
' Declara objetos de conexo e registro do ADO. Dim cn As New ADODB.Connection, rs As New ADODB.Recordset 36
Ruando o !oto KE:ecutar a aplicaoL na ta!ela e:plicativa 8 clicado, a se"uinte macro 8 rodada* Essa macro c/ama outras su!-rotinas 7ue e:traem os dados do !anco de dados do %ccess, desenvolvem o modelo, e:ecutam o Solver e informam o resultado*
Essa macro importa os dados das ta!ela KCapacit'L e K+emandL* Isso pode ser feito atrav8s de uma sentena em SR=& KSelect Plant Crom Capacit'L* Ento, os nomes das f!ricas so armaGenados em vetores* ( mesmo ocorre com os nomes dos revendedores*
Sub GetPlantAndRetailers() ' Essa subrotina pega os nomes das fbricas e revendedores no banco de dados ' para posteriormente preencher as caixas de listagem
Dim nExisitingPlants As Integer, nExisitingRetailers As Integer Dim i As Integer, j As Integer Dim SQL As String
' Pega os nomes das fbricas na tabela Capacity para preencher o vetor existingPlant. SQL = "Select Plant From Capacity" With rs .Open SQL, cn nExisitingPlants = 0 Do While Not .EOF nExisitingPlants = nExisitingPlants + 1 ReDim Preserve existingPlant(nExisitingPlants) existingPlant(nExisitingPlants) = .Fields("Plant").Value .MoveNext Loop .Close End With
' Pega os nomes dos revendedores na tabela Demand para preencher ' o vetor existingRetailers. SQL = "Select Retailer from Demand" With rs .Open SQL, cn nExisitingRetailers = 0 Do While Not .EOF nExisitingRetailers = nExisitingRetailers + 1
37
Mac Mac Mac Macro C/ec)Solver=imit ro C/ec)Solver=imit ro C/ec)Solver=imit ro C/ec)Solver=imit
Essa macro c/eca se o limite de variveis de deciso do S(=#EE foi e:cedido*
M MM Macro EnterModel acro EnterModel acro EnterModel acro EnterModel+ata +ata +ata +ata
Essa macro importa as demandas, capacidades e custos unitrios correspondentes Vs f!ricas e revendedores selecionados* Ento coloca-os nas c8lulas apropriadas da planil/a KModeloL*
Sub CheckSolverLimit() Dim nChangingCells As Integer nChangingCells = nSelectedPlants * nSelectedRetailers If nChangingCells > 200 Then MsgBox "De acordo com suas selees, existem " & nChangingCells _ & " clulas variveis no modelo (" & nSelectedPlants & " x " _ & nSelectedRetailers & "). O mximo que o Solver suporta so 200. " _ & "Escolha menos fbricas or revendedores.", _ vbExclamation, "Modelo muito grande" frmInputs.Show End If End Sub ReDim Preserve existingRetailer(nExisitingRetailers) existingRetailer(nExisitingRetailers) = .Fields("Retailer").Value .MoveNext Loop .Close End With
End Sub 38
Sub EnterModelData() ' A seguinte macro utiliza o ADO para trasnportar os dados ' do banco de dados para as clulas da planilha Modelo. Dim SQL As String Dim i As Integer, j As Integer Dim topCell As Range
' Apaga tudo da plhanilha Modelo. With Worksheets("Modelo") .Cells.Clear .Activate End With
'Nomeia as clulas. Range("A1").Value = "Problema de Transporte" Range("B3").Value = "Custos Unitrios" Range("B5").Value = "Fbricas" Range("D3").Value = "Revendedores"
Set topCell = Range("C4") ' Adiciona os nomes das fbricas e revendedores. With topCell For i = 1 To nSelectedPlants .Offset(i, 0).Value = selectedPlant(i) Next For j = 1 To nSelectedRetailers .Offset(0, j).Value = selectedRetailer(j) Next End With
' Pega os dados com a seguinte sentena em SQL, e preenche as clulas de 'Custo Unitrio. SQL = "Select UC.UnitCost " _ & "From (UnitCost UC Inner Join Capacity C On UC.PlantID = C.PlantID) " _ & "Inner Join Demand D On UC.RetailerID = D.RetailerID " _ & "Where C.Plant In " & plantList & " And D.Retailer In " & retailerList With rs .Open SQL, cn For i = 1 To nSelectedPlants For j = 1 To nSelectedRetailers topCell.Offset(i, j).Value = .Fields("UnitCost").Value .MoveNext Next Next .Close End With
39
.Open SQL, cn For i = 1 To nSelectedPlants For j = 1 To nSelectedRetailers topCell.Offset(i, j).Value = .Fields("UnitCost").Value .MoveNext Next Next .Close End With
' Nomeia as clulas de Custo Unitrio With topCell Range(.Offset(1, 1), .Offset(nSelectedPlants, nSelectedRetailers)) _ .Name = "UnitCosts" End With
' Preenche os valores de capacidade. Set topCell = Range("C4").Offset(0, nSelectedRetailers + 2) topCell.Value = "Capacitidades" SQL = "Select Capacity From Capacity " & _ "Where Plant In " & plantList With rs .Open SQL, cn For i = 1 To nSelectedPlants topCell.Offset(i, 0).Value = .Fields("Capacity").Value .MoveNext Next .Close End With
' Nomeia as clulas de capacidades. With topCell Range(.Offset(1, 0), .Offset(nSelectedPlants, 0)).Name = "Capacities" End With
' Preenche os valores de demanda. Set topCell = Range("C4").Offset(nSelectedPlants + 2, 0) topCell.Value = "Demandas" SQL = "Select Demand From Demand " & _ "Where Retailer In " & retailerList With rs .Open SQL, cn For j = 1 To nSelectedRetailers topCell.Offset(0, j).Value = .Fields("Demand").Value .MoveNext Next .Close End With
40
%o final dessa macro, todos os dados necessrios para o pro!lema esto devidamente dispostos na planil/a KModelo*
SQL = "Select Demand From Demand " & _ "Where Retailer In " & retailerList With rs .Open SQL, cn For j = 1 To nSelectedRetailers topCell.Offset(0, j).Value = .Fields("Demand").Value .MoveNext Next .Close End With
' Nomeia as clulas de demanda. With topCell Range(.Offset(0, 1), .Offset(0, nSelectedRetailers)).Name = "Demands" End With
Essa macro confi"ura e e:ecuta o Solver* am!8m c/eca se al"uma soluo 8 infactvel*
.BorderAround Weight:=xlMedium, ColorIndex:=3 End With
' Entra com as formulas para as somas das linhas e colunas das "Quantidades enviadas" e "Quantidade recebidas". Set topCell = Range("Shipments").Cells(1) With topCell .Offset(-1, nSelectedRetailers).Value = "Quantidades enviadas" .Offset(nSelectedPlants, -1).Value = "Quantidades recebidas" Set outOfRange = Range(.Offset(0, nSelectedRetailers), _ .Offset(nSelectedPlants - 1, nSelectedRetailers)) Set intoRange = Range(.Offset(nSelectedPlants, 0), _ .Offset(nSelectedPlants, nSelectedRetailers - 1)) End With With outOfRange .Name = "SentOut" .FormulaR1C1 = "=SUM(RC[-" & nSelectedRetailers & "]:RC[-1])" End With With intoRange .Name = "SentIn" .FormulaR1C1 = "=SUM(R[-" & nSelectedPlants & "]C:R[-1]C)" End With End With ' Calcula a clula de custo total. Set topCell = Range("SentIn").Item(1).Offset(2, 0) With topCell .Formula = "=SumProduct(UnitCosts,Shipments)" .Name = "TotalCost" .NumberFormat = "R$#,##0_);(R$#,##0)" .Offset(0, -2).Value = "Custo Total"
ransfere o custo total e as informa?es so!re as rotas com remessas positivas para a planil/a KEesultadosL* am!8m ser informado se no e:istir nen/um transporte a partir de uma determinada f!rica*
Sub SetupAndRunSolver() Dim solverStatus As Integer
With Worksheets("Model") .Visible = True .Activate End With
' Executa o Solver. Se no existir nenhuma soluo factvel, ' o problema retorna ao incio pedindo para o usurio selecionar outras entradas. solverStatus = SolverSolve(UserFinish:=True) If solverStatus = 5 Then MsgBox "No existe soluo factvel. Tente uma combinao diferente de " _ & "fbricas e revendedores.", vbExclamation, "Infactibilidade" Call MainTransport Else Worksheets("Model").Visible = False Call CreateReport End If End Sub
43
Sub CreateReport() Dim i As Integer, j As Integer Dim nShippedTo As Integer, amountShipped As Integer Dim topCell As Range
' Apaga todo o contedo da planilha menos o boto para executar outro problema. With Worksheets("Resultados") .Cells.Clear .Visible = True .Activate End With
' Entra com os valores da clulas e configuraes de cor e estilo. With Range("B1") .Value = "Soluo tima" With .Font .Size = 14 .Bold = True End With End With With ActiveWindow .DisplayGridlines = False .DisplayHeadings = False End With Cells.Interior.ColorIndex = 40 Columns("B:B").Font.ColorIndex = 1 Columns("C:C").Font.ColorIndex = 5 Range("B1").Font.ColorIndex = 1
' Para cada rota com quantidades positivas, imprime quanto transportado. Set topCell = Range("B3") For i = 1 To nSelectedPlants If Range("SentOut").Cells(i).Value > 0.1 Then With topCell .Value = " Produtos enviados de " & selectedPlant(i) .Font.Bold = True End With nShippedTo = 0 For j = 1 To nSelectedRetailers amountShipped = Range("Shipments").Cells(i, j).Value If amountShipped > 0.01 Then nShippedTo = nShippedTo + 1 topCell.Offset(nShippedTo, 1).Value = _ amountShipped & " unidades para " & selectedRetailer(j) End If Next Set topCell = topCell.Offset(nShippedTo + 2, 0) Else
44
With topCell .Value = "Nenhum produto enviado de " & selectedPlant(i) .Font.Bold = True End With Set topCell = topCell.Offset(2, 0) End If Next
' Imprime o custo total With Range("G3") .Value = "O custo total de trasponte " & _ Format(Range("TotalCost").Value, "R$#,##0;(R$#,##0)") .Font.Bold = True End With Range("A1").Select End Sub
45 Concluso
Pode-se notar pontos favorveis e desfavorveis ao implementar uma modela"em utiliGando #$%* % mel/or vanta"em em utiliGar essa lin"ua"em 8 7ue ela possui uma ilimitada fle:i!ilidade* (u seja, com o E:cel podemos realiGar os clculos, importar e e:portar dados com outras e:tens?es, incluir !i!liotecas 7ue faGem uso de outras lin"ua"ens, criar visualiGa?es convenientes para o usurio, etc* %o final, todo o contePdo est em um Pnico ar7uivo 7ue pode ser "ravado e e:ecutado em 7ual7uer outra m7uina 7ue possua o softMare* %l8m disso, provavelmente todas as empresas possuem o Microsoft E:cel instalado em suas m7uinas, e a muitas pessoas esto de al"uma maneira familiariGadas com sua interface* % lin"ua"em #$% 8 uma lin"ua"em fcil de se aprender, visto a "rande 7uantidade de livros e Me!sites so!re o assunto* %l8m do mais, o pes7uisador de o!jetos e o intellisense so ferramentas 7ue facilitam ainda mais o aprendiGado*
Como desvanta"em, temos a lenta performance* % e:ecuo de uma su!-rotina 8 feita lin/a por lin/a* Cada lin/a 8 lida, c/ecada para ver se no / erros na sinta:e, compilada e e:ecutada* Isso torna a e:ecuo muito lenta dependendo do taman/o do pro!lema, se comparada com outras aplica?es desenvolvidas em C, por e:emplo* %l8m disso, e:iste a limitao do nPmero de c8lulas, cerca de ;-*-5; lin/as para as vers?es 0115 ou anteriores* +eve-se tam!8m ter cuidado ao manipular o ar7uivo, pois al"umas altera?es nas planil/as podem modificar o cJdi"o, "erando conflitos*
Conclui-se 7ue deve-se ter !om senso ao escol/er o #$% como ferramenta para o desenvolvimento de modelos de otimiGao* %pesar da "rande funcionalidade, essa 8 uma opo vivel apenas para pro!lemas de pe7uena e m8dia escala, e em 7ue minimiGar o tempo de e:ecuo no seja o principal o!jetivo*
46 EeferFncias
2I utorial so!re modela"em utiliGando o Solver& /ttp&WWMMM*ime*unicamp*!rWamorettiWms60>W0sem0121WutorialE:cel*doc
0I =inear pro"rammin" and netMor) floMs W Mo)/tar S* $aGaraa, .o/n .* .arvis, Banif +* S/erali*
5I E%M%=B(, .ose %ntonio %* H.ose %ntonio %lvesI* SR= SR= SR= SR=& a lin"ua"em dos !ancos de dados* So Paulo, SP& $er)ele'*
47 $i!lio"rafia
2I %l!ri"/t, S* C*S #$% for Modelers +evelopin" +ecision Support S'stems Mit/ Microsoft (ffice E:cel* 0121 ed* Sout/-@estern Cen"a"e =earnin"*