Usuário(a):Vinickw/Macros/Gerador de lista de episódios

Origem: Wikipédia, a enciclopédia livre.

Listas de episódios podem ser bastante chatas de serem criadas, são tantos parâmetros para serem inseridos, e o editor visual não facilita tanto assim. Essa macro cria uma lista de episódios utilizando as predefinições {{Tabela de episódios}} e {{Lista de episódios}} a partir de uma tabela Excel.

Como usar macros[editar | editar código-fonte]

Para criar macros você tem duas opções:

  1. Clique em ArquivoOpçõesPersonalizar Faixa de Opções e marque a opção Desenvolvedor. Será habilitado a aba Desenvolvedor, clique nela e então Visual Basic.
  2. Precione Ctrl + F11, se não funcionar tente Ctrl + Fn + F11.

Nesta área poderá ser criado códigos para a realização automática de tarefas.

Criar pasta de trabalho[editar | editar código-fonte]

Inicialmente, deverá ser criado a pasta de trabalho. Para isso, crie uma nova pasta em branco. Em seguida acesse o painel VBA (ver § Como usar macros) e no canto superior esquerdo clique na setinha que está à direita do botão com a logo do excel (Positivo) e à esquerda do botão se salvar (ícone de disquete 💾), e selecione a opção Módulo. Será aberto uma nova janela para inserir texto, copie o código abaixo e cole lá, em seguida clique em executar (localizado na mesma barra do botão anterior, poderá também ser apertado F5). Se tudo ocorrer corretamente, será criado quatro planilhas, Lista episódio, Tabela episódio, Saída e Log. As demais planinhas podem ser excluídas tranquilamente. Após rodar esta sub ela não será mais necessária, por isso até sugiro que todo o código seja apagado.

Módulo para criar pasta de trabalho
Sub CriarPasta()
Dim Ws As Worksheet

Set Ws = Worksheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))
Ws.[_CodeName] = "ListaEpisodio"
Ws.Name = "Lista episódio"
Ws.Cells(1, 1).Value2 = "NúmeroEpisódio"
Ws.Cells(1, 2).Value2 = "NúmeroEpisódio2"
Ws.Cells(1, 3).Value2 = "Título"
Ws.Cells(1, 4).Value2 = "Rtítulo"
Ws.Cells(1, 5).Value2 = "TítuloAlter"
Ws.Cells(1, 6).Value2 = "RTítuloAlter"
Ws.Cells(1, 7).Value2 = "Aux1"
Ws.Cells(1, 8).Value2 = "Dirigido"
Ws.Cells(1, 9).Value2 = "Escrito"
Ws.Cells(1, 10).Value2 = "Aux2"
Ws.Cells(1, 11).Value2 = "Aux3"
Ws.Cells(1, 12).Value2 = "DataTransmissãoOriginal"
Ws.Cells(1, 13).Value2 = "CódigoProd"
Ws.Cells(1, 14).Value2 = "Audiência"
Ws.Cells(1, 15).Value2 = "Aux4"
Ws.Cells(1, 16).Value2 = "Sinopse"
Ws.Columns("L:L").NumberFormat = "dd/mm/yyyy"
Ws.Columns("A:P").EntireColumn.AutoFit

Set Ws = Worksheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))
Ws.[_CodeName] = "TabelaEpisodio"
Ws.Name = "Tabela episódio"
Ws.Cells(1, 1).Value2 = "Legenda"
Ws.Cells(2, 1).Value2 = "CorFundo"
Ws.Cells(3, 1).Value2 = "CorLinha"
Ws.Cells(4, 1).Value2 = "LarguraTotal"
Ws.Cells(5, 1).Value2 = "Pais"
Ws.Range("A1:B6").Borders.LineStyle = xlContinuous
Ws.Cells(6, 1).Value2 = "Lançado/Exibido"
Ws.Cells(8, 2).Value2 = "Largura"
Ws.Cells(8, 3).Value2 = "Título"
Ws.Cells(8, 4).Value2 = "Referência"
Ws.Cells(9, 1).Value2 = "NúmeroEpisódio"
Ws.Cells(10, 1).Value2 = "NúmeroEpisódio2"
Ws.Cells(11, 1).Value2 = "Título"
Ws.Cells(12, 1).Value2 = "Aux1"
Ws.Cells(13, 1).Value2 = "Dirigido"
Ws.Cells(14, 1).Value2 = "Escrito"
Ws.Cells(15, 1).Value2 = "Aux2"
Ws.Cells(16, 1).Value2 = "Aux3"
Ws.Cells(17, 1).Value2 = "DataTransmissãoOriginal"
Ws.Cells(18, 1).Value2 = "CódigoProd"
Ws.Cells(19, 1).Value2 = "Audiência"
Ws.Cells(20, 1).Value2 = "Aux4"
Ws.Range("A8:D20").Borders.LineStyle = xlContinuous
Ws.Columns("A:D").EntireColumn.AutoFit

Set Ws = Worksheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))
Ws.[_CodeName] = "Saida"
Ws.Name = "Saída"
Ws.Columns("A:A").EntireColumn.Font.Name = "Lucida Console"
Ws.Activate
ActiveWindow.DisplayGridlines = False

Set Ws = Worksheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))
Ws.[_CodeName] = "sLog"
Ws.Name = "Log"
Ws.Cells(1, 1).Value2 = "Mensagem"
Ws.Activate
ActiveWindow.DisplayGridlines = False

End Sub

Criar macro para gerar lista[editar | editar código-fonte]

Com a pasta de trabalho já criada adequadamente (não realizar o passo anterior fará com que a macro não execute) poderá ser criado um módulo (ou reutilizar o módulo anterior se você tiver apagado tudo) para a macro que gera a lista, para isso é só colar o código abaixo. Sugiro que você adicione "botões" para executar a macro. A forma mais simples é InserirFormas e escolher qualquer uma (sugiro retângulo). Insira-as onde achar conveniente e então clique com o botão direito na forma e Atribuir macro... e escolha GerarLista e CopiarTexto (uma forma para cada uma das macros).

Módulo para gerar lista
' Macro criada por Vinickw
' Versão 1.0 (2024/05/13)
'
' CC BY-SA 4.0
' Você pode compartilhar e adaptar esta pasta de trabalho e
' seu código desde que você dê o crédito apropriado.
'
' Para mais informações acesse:
' https://pt.wikipedia.org/wiki/User:Vinickw/Macros/Gerador_de_lista_de_episódios

Option Explicit
Global LinhaSaida As Integer
Global SemDia As Boolean

Sub GerarLista()

Saida.Range("A:A").Clear
sLog.Range("A2:A100000").Clear
LinhaSaida = 1
SemDia = False

Dim NumeroEpisodio  As Boolean
Dim NumeroEpisodio2 As Boolean
Dim Titulo          As Integer
Dim Rtitulo         As Boolean
Dim TituloAlter     As Boolean
Dim RTituloAlter    As Boolean
Dim Aux1            As Boolean
Dim Dirigido        As Boolean
Dim Escrito         As Boolean
Dim Aux2            As Boolean
Dim Aux3            As Boolean
Dim DataOriginal    As Boolean
Dim CodigoProd      As Boolean
Dim Audiencia       As Boolean
Dim Aux4            As Boolean
Dim Sinopse         As Boolean
Dim CorTopo         As String
Dim CorLinha        As String

Dim x As Byte
Dim ep As Integer

Titulo = ListaEpisodio.Cells(100000, 3).End(xlUp).Row
CorTopo = TabelaEpisodio.Cells(2, 2).Value2
CorLinha = TabelaEpisodio.Cells(3, 2).Value2

NumeroEpisodio = IsUsed(1)
NumeroEpisodio2 = IsUsed(2)
Rtitulo = IsUsed(4)
TituloAlter = IsUsed(5)
RTituloAlter = IsUsed(6)
Aux1 = IsUsed(7)
Dirigido = IsUsed(8)
Escrito = IsUsed(9)
Aux2 = IsUsed(10)
Aux3 = IsUsed(11)
DataOriginal = IsUsed(12)
CodigoProd = IsUsed(13)
Audiencia = IsUsed(14)
Aux4 = IsUsed(15)
Sinopse = IsUsed(16)

x = MsgBox("Sua tabela contém " & Titulo - 1 & " episódio e os seguintes campos:" & Chr(13) & Chr(10) _
    & IIf(NumeroEpisodio, "NumeroEpisodio" & Chr(13) & Chr(10), "") _
    & IIf(NumeroEpisodio2, "NumeroEpisodio2" & Chr(13) & Chr(10), "") _
    & "Titulo" & Chr(13) & Chr(10) _
    & IIf(Rtitulo, "Rtitulo" & Chr(13) & Chr(10), "") _
    & IIf(TituloAlter, "TituloAlter" & Chr(13) & Chr(10), "") _
    & IIf(RTituloAlter, "RTituloAlter" & Chr(13) & Chr(10), "") _
    & IIf(Aux1, "Aux1" & Chr(13) & Chr(10), "") _
    & IIf(Dirigido, "Dirigido" & Chr(13) & Chr(10), "") _
    & IIf(Escrito, "Escrito" & Chr(13) & Chr(10), "") _
    & IIf(Aux2, "Aux2" & Chr(13) & Chr(10), "") _
    & IIf(Aux3, "Aux3" & Chr(13) & Chr(10), "") _
    & IIf(DataOriginal, "DataTransmissãoOriginal" & Chr(13) & Chr(10), "") _
    & IIf(CodigoProd, "CodigoProd" & Chr(13) & Chr(10), "") _
    & IIf(Audiencia, "Audiencia" & Chr(13) & Chr(10), "") _
    & IIf(Aux4, "Aux4" & Chr(13) & Chr(10), "") _
    & IIf(Sinopse, "Sinopse" & Chr(13) & Chr(10), "") _
    & Chr(13) & Chr(10) & "Confirma?", vbYesNo)

If x = vbNo Then
    Exit Sub
End If


If IIf(Aux1, TabelaEpisodio.Cells(12, 3).Value2 = "", False) _
    Or IIf(Aux2, TabelaEpisodio.Cells(15, 3).Value2 = "", False) _
    Or IIf(Aux3, TabelaEpisodio.Cells(16, 3).Value2 = "", False) _
    Or IIf(Aux4, TabelaEpisodio.Cells(20, 3).Value2 = "", False) _
    Then
    MsgBox "Os campos Aux requerem que o requerem um título." & Chr(13) & Chr(10) _
        & "Consulte a documentação da predefinição Tabela de episódios para mais informações."
    Exit Sub
End If

For ep = 2 To Titulo
    If IsNumeric(ListaEpisodio.Cells(ep, 12).Value2) Then
        If Day(ListaEpisodio.Cells(ep, 12).Value2) = 1 Then
            SemDia = True
        End If
    Else
        sLog.Cells(100000, 1).End(xlUp).Offset(1, 0).Value2 = "O valor da célula L" & ep & _
            "(" & ListaEpisodio.Cells(ep, 12).Value2 & ") não foi reconhecido como data."
    End If
Next ep
If SemDia Then
    x = MsgBox("Algumas das datas inseridas na coluna data possuem dia igual a 1, deseja suprimir o dia dessas datas, mantendo somente o mês e o ano?" _
        & vbCrLf & "(Nem sempre é possível encontrar o dia específico de lançamento, deste modo, pode ser mantido somente o mês e o ano.)", vbYesNo)
    If x = vbNo Then
        SemDia = False
    End If
End If

fPrint "{{Tabela de episódios"
If NumeroEpisodio Then
    fPrint "| overall                   = " & TabelaEpisodio.Cells(9, 2).Value2
    fPrint "| overallT                  = " & TabelaEpisodio.Cells(9, 3).Value2, TabelaEpisodio.Cells(9, 3).Value2 <> ""
    fPrint "| overallR                  = " & TabelaEpisodio.Cells(9, 4).Value2, TabelaEpisodio.Cells(9, 4).Value2 <> ""
End If
If NumeroEpisodio2 Then
    fPrint "| season                    = " & TabelaEpisodio.Cells(10, 2).Value2
    fPrint "| seasonT                   = " & TabelaEpisodio.Cells(10, 3).Value2, TabelaEpisodio.Cells(10, 3).Value2 <> ""
    fPrint "| seasonR                   = " & TabelaEpisodio.Cells(10, 4).Value2, TabelaEpisodio.Cells(10, 4).Value2 <> ""
End If
'Não precisa de if
    fPrint "| title                     = " & TabelaEpisodio.Cells(11, 2).Value2
    fPrint "| titleT                    = " & TabelaEpisodio.Cells(11, 3).Value2, TabelaEpisodio.Cells(11, 3).Value2 <> ""
    fPrint "| titleR                    = " & TabelaEpisodio.Cells(11, 4).Value2, TabelaEpisodio.Cells(11, 4).Value2 <> ""
'End If
If Aux1 Then
    fPrint "| aux1                      = " & TabelaEpisodio.Cells(12, 2).Value2
    fPrint "| aux1T                     = " & TabelaEpisodio.Cells(12, 3).Value2, TabelaEpisodio.Cells(12, 3).Value2 <> ""
    fPrint "| aux1R                     = " & TabelaEpisodio.Cells(12, 4).Value2, TabelaEpisodio.Cells(12, 4).Value2 <> ""
End If
If Dirigido Then
    fPrint "| director                  = " & TabelaEpisodio.Cells(13, 2).Value2
    fPrint "| directorT                 = " & TabelaEpisodio.Cells(13, 3).Value2, TabelaEpisodio.Cells(13, 3).Value2 <> ""
    fPrint "| directorR                 = " & TabelaEpisodio.Cells(13, 4).Value2, TabelaEpisodio.Cells(13, 4).Value2 <> ""
End If
If Escrito Then
    fPrint "| writer                    = " & TabelaEpisodio.Cells(14, 2).Value2
    fPrint "| writerT                   = " & TabelaEpisodio.Cells(14, 3).Value2, TabelaEpisodio.Cells(14, 3).Value2 <> ""
    fPrint "| writerR                   = " & TabelaEpisodio.Cells(14, 4).Value2, TabelaEpisodio.Cells(14, 4).Value2 <> ""
End If
If Aux2 Then
    fPrint "| aux2                      = " & TabelaEpisodio.Cells(15, 2).Value2
    fPrint "| aux2T                     = " & TabelaEpisodio.Cells(15, 3).Value2, TabelaEpisodio.Cells(15, 3).Value2 <> ""
    fPrint "| aux2R                     = " & TabelaEpisodio.Cells(15, 4).Value2, TabelaEpisodio.Cells(15, 4).Value2 <> ""
End If
If Aux3 Then
    fPrint "| aux3                      = " & TabelaEpisodio.Cells(16, 2).Value2
    fPrint "| aux3T                     = " & TabelaEpisodio.Cells(16, 3).Value2, TabelaEpisodio.Cells(16, 3).Value2 <> ""
    fPrint "| aux3R                     = " & TabelaEpisodio.Cells(16, 4).Value2, TabelaEpisodio.Cells(16, 4).Value2 <> ""
End If
If DataOriginal Then
    fPrint "| airdate                   = " & TabelaEpisodio.Cells(17, 2).Value2
    fPrint "| airdateT                  = " & TabelaEpisodio.Cells(17, 3).Value2, TabelaEpisodio.Cells(17, 3).Value2 <> ""
    fPrint "| airdateR                  = " & TabelaEpisodio.Cells(17, 4).Value2, TabelaEpisodio.Cells(17, 4).Value2 <> ""
End If
If CodigoProd Then
    fPrint "| prodcode                  = " & TabelaEpisodio.Cells(18, 2).Value2
    fPrint "| prodcodeT                 = " & TabelaEpisodio.Cells(18, 3).Value2, TabelaEpisodio.Cells(18, 3).Value2 <> ""
    fPrint "| prodcodeR                 = " & TabelaEpisodio.Cells(18, 4).Value2, TabelaEpisodio.Cells(18, 4).Value2 <> ""
End If
If Audiencia Then
    fPrint "| viewers                   = " & TabelaEpisodio.Cells(19, 2).Value2
    fPrint "| viewersT                  = " & TabelaEpisodio.Cells(19, 3).Value2, TabelaEpisodio.Cells(19, 3).Value2 <> ""
    fPrint "| viewersR                  = " & TabelaEpisodio.Cells(19, 4).Value2, TabelaEpisodio.Cells(19, 4).Value2 <> ""
End If
If Aux4 Then
    fPrint "| aux4                      = " & TabelaEpisodio.Cells(20, 2).Value2
    fPrint "| aux4T                     = " & TabelaEpisodio.Cells(20, 3).Value2, TabelaEpisodio.Cells(20, 3).Value2 <> ""
    fPrint "| aux4R                     = " & TabelaEpisodio.Cells(20, 4).Value2, TabelaEpisodio.Cells(20, 4).Value2 <> ""
End If

fPrint "| caption                   = " & TabelaEpisodio.Cells(1, 2).Value2, TabelaEpisodio.Cells(1, 2).Value2 <> ""
fPrint "| background                = " & CorLinha, CorLinha <> ""
fPrint "| total_width               = " & TabelaEpisodio.Cells(4, 2).Value2, TabelaEpisodio.Cells(4, 2).Value2 <> ""
fPrint "| country                   = " & TabelaEpisodio.Cells(5, 2).Value2, TabelaEpisodio.Cells(5, 2).Value2 <> ""
fPrint "| released                  = y", TabelaEpisodio.Cells(6, 2).Value2 = "y"
fPrint "| episodes                  = "

For ep = 2 To Titulo
    fPrint "{{Lista de episódio"
    fPrint "| CorTopo                   = " & CorTopo, CorTopo <> ""
    fPrint "| CorLinha                  = " & CorLinha, CorLinha <> ""
    fPrint "| NúmeroEpisódio            = " & ListaEpisodio.Cells(ep, 1).Value2, NumeroEpisodio
    fPrint "| NúmeroEpisódio2           = " & ListaEpisodio.Cells(ep, 2).Value2, NumeroEpisodio2
    fPrint "| Título                    = " & ListaEpisodio.Cells(ep, 3).Value2
    fPrint "| RTítulo                   = " & ListaEpisodio.Cells(ep, 4).Value2, Rtitulo
    fPrint "| TítuloAlter               = " & ListaEpisodio.Cells(ep, 5).Value2, TituloAlter
    fPrint "| RTítuloAlter              = " & ListaEpisodio.Cells(ep, 6).Value2, RTituloAlter
    fPrint "| Aux1                      = " & ListaEpisodio.Cells(ep, 7).Value2, Aux1
    fPrint "| Dirigido                  = " & ListaEpisodio.Cells(ep, 8).Value2, Dirigido
    fPrint "| Escrito                   = " & ListaEpisodio.Cells(ep, 9).Value2, Escrito
    fPrint "| Aux2                      = " & ListaEpisodio.Cells(ep, 10).Value2, Aux2
    fPrint "| Aux3                      = " & ListaEpisodio.Cells(ep, 11).Value2, Aux3
    fPrint "| DataTransmissãoOriginal   = " & ConverteData(ListaEpisodio.Cells(ep, 12).Value2), DataOriginal
    fPrint "| CódigoProd                = " & ListaEpisodio.Cells(ep, 13).Value2, CodigoProd
    fPrint "| Audiência                 = " & ListaEpisodio.Cells(ep, 14).Value2, Audiencia
    fPrint "| Aux4                      = " & ListaEpisodio.Cells(ep, 15).Value2, Aux4
    fPrint "| Sinopse                   = ", Sinopse
    fPrint ListaEpisodio.Cells(ep, 16).Value2, ListaEpisodio.Cells(ep, 16).Value2 <> ""
    fPrint "}}"
Next ep

fPrint "}}"

MsgBox "Concluído"

End Sub

Function ConverteData(dt As String)
Dim meses
meses = Array("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro")

If IsNumeric(dt) Then
    ConverteData = IIf(SemDia And Day(dt) = 1, meses(Month(dt) - 1), Day(dt) & " de " & LCase(meses(Month(dt) - 1))) & " de " & Year(dt)
Else
    ConverteData = dt
End If

End Function

Function IsUsed(vCol As Integer) As Boolean

IsUsed = ListaEpisodio.Cells(100000, vCol).End(xlUp).Row <> 1

End Function

Sub fPrint(Texto As String, Optional Condicao As Boolean = True)

If Condicao Then
    Saida.Cells(LinhaSaida, 1).Value2 = "'" & Texto
    LinhaSaida = LinhaSaida + 1
End If

End Sub


Sub CopiarTexto()

Saida.Range("A1:A" & Cells(1000000, 1).End(xlUp).Row).Select
Selection.Copy

End Sub

Como gerar a lista[editar | editar código-fonte]

Com a pasta de trabalho já configurada é bastante fácil de gerar a lista. A primeira planilha que sugiro preencher é a Lista episódio, essa seria referente às entradas que seriam inseridas em {{Lista de episódios}}, então recomendo que leia a documentação para saber preencher adequadamente. Por exemplo, para geração de Lista de episódios de Oreimo foi preenchido da seguinte maneira para as duas primeiras entradas:

NúmeroEpisódio ··· Título ··· TítuloAlter ··· Aux1 ··· DataTransmissãoOriginal ···
1 ··· Eu não Posso me Apaixonar pela Minha Irmãzinha ··· {{japonês|Ore ga Imōto to Koi o Suru Wake ga Nai|俺が妹と恋をするわけがない}} ··· {{Nihongo|"Imōto, Plea~se!"|妹プリ〜ズ!|Imōto Purīzu!}} por [[Ayana Taketatsu]] ··· 3/10/2010 ···
2 ··· Eu não Posso Sair com Minha Irmãzinha na Vida Real ··· {{japonês|Ore ga Imōto to Ofu Kai ni Iku Wake ga Nai|俺が妹とオフ会に行くわけがない}} ··· "Shine!" por Ayana Taketatsu ··· 10/10/2010 ···

As colunas podem ser redimensionadas ou ocultas sem nenhum problema, no entanto, jamais elimine colunas, isso fará a macro se perder. A única coluna necessária de ser preenchida é Título.

Após isso pode ser preenchido Tabela episódio, referente à predefinição {{Tabela de episódios}}, essa etapa pode não ser necessária, pois a macro é esperta suficiente para preencer a predefinição adequadamente. Porém às vezes pode ser necessário adicionar referencias ou alterar o rótulo. No mesmo exemplo anterior foi preenchido da seguinte maneira

··· ···
CorLinha 2020C9
··· ···
Largura Título Referência
NúmeroEpisódio 5
··· ··· ··· ···
Título 50 {{nre|name=Crunchyroll}}
Aux Tema de encerramento
··· ··· ··· ···
DataTransmissãoOriginal 15
··· ··· ··· ···

Note que é obrigatório haver um Título para os parâmetros aux, se eles forem utilizados.

Após isso, poderá ser executado a macro GerarLista (ver § Criar macro para gerar lista). Se houver algum erro será exibido uma caixa de mensagem avisando sobre o erro e a macro será abortada, exceto se uma data não for reconhecida, neste caso a macro não converterá a data por extenso, ela apenas será inserida sem modificação e haverá um aviso na planilha Log. Caso tudo ocorra como esperado, o código será gerado em Saída. Poderá ser selecionado todo o código e então copiado, ou apenas execurat a macro CopiarTexto para facilitar (note que o texto do código só estará na coluna A).

Atribuição[editar | editar código-fonte]

Se for utilizar esta macro, por favor, dê os créditos no sumário de edição. Um exemplo de de atribuição é Lista de episódios gerada utilizando [[User:Vinickw/Macros/Gerador de lista de episódios|macro]].