Membro da equipe que questiona a mudança do VBA para o C #


20

fundo

No ano passado, fui convidado a criar uma ferramenta para ser usada no planejamento de negócios para cerca de 10 usuários. Isso foi feito em nome de outra equipe de TI que "subcontratou" o trabalho para mim e, como os prazos do projeto eram um pouco imprevisíveis, tive que implementá-lo rapidamente.

Na época, decidimos que a maneira mais rápida seria criar uma pasta de trabalho do Excel com o VBA e solicitar aos usuários que baixassem essa pasta de trabalho aprimorada pelo VBA de uma Intranet para usar em seus PCs. O Excel era uma restrição nesse caso, porque o sistema de planejamento (ou seja, banco de dados) que usamos só pode interagir por meio de um suplemento do Excel que deve ser carregado ao mesmo tempo em que a pasta de trabalho de planejamento está aberta. No entanto, o VBA não era uma restrição naquele momento.

A pasta de trabalho que criei em torno de 4.000 linhas de código VBA e enquanto tentava separar as camadas de dados e apresentação, não conseguia em todos os casos devido aos prazos do projeto. Para ser sincero, embora tenha orgulho de criar esta pasta de trabalho, estou ao mesmo tempo um pouco decepcionado por ter sido melhor, tanto em termos de codificação quanto de implantação para os usuários.

Hoje

Hoje em dia, a equipe de TI voltou a solicitar uma pasta de trabalho semelhante (para que eu pudesse reutilizar partes da outra pasta de trabalho acima), mas desta vez é muito mais complicado e será usado por um número maior de usuários ( cerca de 200).

No entanto, desta vez, é um pouco melhor planejado e posso ver que temos um pouco mais de tempo para planejar as coisas. Com base nisso, pensei na solução e na infraestrutura, pois a programação para 100 usuários tem mais impacto do que para 10 usuários. Portanto, sugeri à equipe que talvez devêssemos considerar a migração do código existente para uma solução C # para podermos gerenciar o código de uma maneira mais refinada. Ainda estou considerando isso como um suplemento escrito usando o VSTO / Excel-DNA, que pode ser implantado nos usuários.

Eu discuti isso com a equipe de TI há duas semanas e tudo parecia estar bem, até ontem recebi um email de uma equipe (que não conhece VBA ou C #) questionando por que deveríamos iniciar esse novo projeto em C # versus usar o mesma abordagem de antes. Algumas de suas preocupações eram:

  • É um projeto bastante importante, portanto, ele tem que funcionar - uma solução C # não seria tão estável ou funcionaria tão bem quanto a solução existente baseada em VBA.
  • Teríamos que jogar fora o que fizemos na solução VBA e recriá-la do zero em C #.
  • Alguém precisará oferecer suporte a duas soluções separadas, uma em VBA e outra em C #. [atualmente, eles atualmente não têm ninguém para apoio, geralmente eu passo].

Agora, posso entender algumas de suas preocupações até certo ponto, mas preciso tomar uma decisão sobre os próximos passos e com o que voltar a eles. Pessoalmente, eu gostaria de implementar em C # porque acho que seria melhor criar uma solução "Enterprise" como essa. Além disso, gostaria de aproveitar esta oportunidade para aprimorar minhas habilidades em C #, pois atualmente não sou tão competente em C # quanto sou VBA e gostaria de um projeto como esse para me levar ao "próximo nível".

Eu preparei uma lista de pontos que eu poderia usar para tentar convencê-los de que uma solução C # seria melhor para este projeto, é o que tenho até agora:

  • Teste de unidade.
  • Fonte de controle.
  • Documentação do código - para transferência de conhecimento para outras pessoas de suporte.
  • Melhores convenções de codificação - pode usar coisas como ReSharper para impor uma melhor nomeação e estrutura.
  • Melhor IDE - menos erros devido ao realce do erro.
  • Mais modularidade através de montagens - pode promover a reutilização em ferramentas futuras.
  • Implantação gerenciada - pode controlar por quem essa ferramenta é usada.

Pergunta: Que outros pontos eu poderia acrescentar para convencê-los? Ou estou tentando morder mais do que posso mastigar com este projeto? Devo ficar quieto e fazê-lo no VBA de qualquer maneira?

Estou ciente de que apenas mudar para um novo idioma porque seu "mais novo" ou visto como "mais frio" não deve ser a base de uma decisão e, como tal, resisti a incluí-lo como um ponto de decisão - trata-se de fatos.

Além disso, não estou pedindo uma comparação literal entre C # e VBA como idiomas, pois há muitas comparações no SO.



2
Eu acho que você precisa ver isso. Apenas no caso de ir para o sul e você acabar preso no VBA. Disclaimer: Eu sou um dos desenvolvedores do projeto. rubberduck-vba.com
RubberDuck

7
Por que c # em vez de vb.net?
Taemyr

2
Estou na mesma posição, de ter um aplicativo muito grande (20k + linhas de código VBA) incorporado em uma pasta de trabalho do Excel. Ao testar com o Office 2013, ele simplesmente não funciona, acredita-se devido a alterações na sequência do evento de inicialização no novo modelo de escritório e possivelmente à aplicação mais rigorosa do EMET. Portanto, estou na posição de fazer uma conversão de falha em C # e VB.NET antes da implantação do Office 2013 este ano. Outras pastas de trabalho mais simples (aprimoradas pelo VBA) usadas em toda a organização não são imunes, algumas funcionam e outras não.
precisa saber é o seguinte

3
C # agora e C # há 7 anos não são os mesmos. Os idiomas baseados em VB estão ficando cada vez mais obsoletos. Se você deseja uma correção de curto prazo, faça-o no VBA. Se deve durar e possivelmente estendido no futuro, vá em C #.
Mast

Respostas:


30

Os três pontos que você listou parecem justos:

É um projeto bastante importante, portanto, ele tem que funcionar - uma solução C # não seria tão estável ou funcionaria tão bem quanto a solução existente baseada em VBA.

De fato, mais tarde, você diz: "Gostaria de aproveitar esta oportunidade para aprimorar minhas habilidades em C #, pois atualmente não sou tão competente em C # quanto em VBA " (ênfase minha).

Em outras palavras, você tem uma solução que funciona e passou por testes intensivos do usuário. Você quer jogar tudo isso e reescrever tudo em um idioma que não conhece bem. Vê o problema?

Teríamos que jogar fora o que fizemos na solução VBA e recriá-la do zero em C #.

Coisas que você nunca deve fazer vem à mente. Você está jogando o código, bem como o teste do usuário. Não é uma coisa boa.

Alguém precisará oferecer suporte a duas soluções separadas, uma em VBA e outra em C #. [atualmente, eles atualmente não têm ninguém para apoio, geralmente eu passo].

Se a versão do VBA ainda fosse usada, a reescrita é realmente ainda mais problemática. Por que você teria dois sistemas díspares que requerem sua atenção, quando você pode ter apenas um que já funciona e ao qual pode refatorar e adicionar recursos?


Alguns de seus pontos, por outro lado, podem ser criticados:

  • Teste de unidade.

    Você também pode testar seu projeto atual. Se não houver uma estrutura conveniente para isso, crie uma.

  • Fonte de controle.

    O controle de origem lida com texto. Seu código atual é texto, portanto, você pode usar o controle de origem para ele.

    A linguagem, o sistema operacional, a estrutura ou o ecossistema são completamente irrelevantes. Você pode (e deve) usar o controle de origem para qualquer código que você escreve: código no Visual Studio ou um pedaço de código que você redige em alguns minutos nos scripts LINQPad ou PowerShell que automatizam uma tarefa, esquema de banco de dados ou macros do Excel.

  • Documentação do código - para transferência de conhecimento para outras pessoas de suporte.

    Acordado.

  • Melhores convenções de codificação - pode usar coisas como ReSharper para impor uma melhor nomeação e estrutura.

    Defina "melhor". Existem convenções de codificação para macros do Excel? Se sim, use-os: eles não são melhores ou piores do que qualquer outro. Caso contrário, crie um e publique-o para que outras pessoas também possam usá-lo. As respostas para uma pergunta postada em 2010 parecem bastante decepcionantes, mas pode haver novas ferramentas disponíveis desde então.

    Observe que a parte importante das convenções de codificação é que elas devem ser aplicadas no commit.

  • Melhor IDE - menos erros devido ao realce do erro.

    Acordado. O fato de não podermos escrever macros no Visual Studio é muito lamentável.

  • Mais modularidade através de montagens - pode promover a reutilização em ferramentas futuras.

    Tenho certeza de que seu produto atual também pode usar algum grau de modularidade.

  • Implantação gerenciada - pode controlar por quem essa ferramenta é usada.

    Acordado.


Em vez de uma reescrita completa, você pode procurar uma maneira de mover progressivamente o código da macro para um assembly comum escrito no VB.NET. Por que no VB.NET? Três razões:

  • Há menos diferença entre o VBA e o VB.NET, assim como entre o VBA e o C #.

  • Você conhece melhor o VBA, e isso por si só é um bom motivo para usar o VB.NET em vez do C #. Se você deseja "aprimorar suas habilidades em C #", faça isso com seus projetos pessoais, não com assuntos críticos para os negócios.

  • Qualquer reescrita de um idioma para outro leva a possíveis erros. Você não precisa disso para este projeto.

Mover para um assembly .NET pode fornecer o ambiente conveniente do Visual Studio, com o teste de unidade conveniente, o TFS e o erro destacando o uso atualmente em outros projetos.

Ao mesmo tempo, se você mover seu código passo a passo, não corre o risco de reescrever completamente (ou seja, passar quatro meses criando algo que ninguém quer usar devido ao grande número de novos bugs). Por exemplo, você precisa trabalhar em um recurso específico? Pense em como você pode mover esse recurso específico para o .NET primeiro.

Isso é bastante semelhante à refatoração. Em vez de reescrever tudo porque aprendeu alguns novos padrões de design e recursos de linguagem, basta fazer pequenas alterações no código no qual trabalha agora.


7
Indo com o VBA, você acaba com muita meta-programação extra. Escrevi, entre outras coisas (testes, importador / exportador de macros etc.), uma ferramenta de distribuição para vba-excelsheets, que abre planilhas remotas e troca macros, executa macros de atualização e garante que as planilhas estejam em boa forma novamente (em C # , graças a Deus). No entanto, acho que, por si só, foi mais esforço do que o código VBA. Não estou dizendo que você deve usar C # a qualquer custo, mas pensar em migrar para uma plataforma mais moderna deve ser do interesse de todos.
SBI

3
O VB.NET é realmente tão semelhante ao VBA que seu segundo e terceiro pontos ainda permanecem quando você faz essa substituição?
precisa

1
Uma vantagem adicional do VB.NET é que você pode facilmente combinar componentes escritos em diferentes linguagens .NET. Portanto, você pode (por exemplo) migrar do VBA para o VB.NET e adicionar novas funcionalidades em C #, VB.NET ou qualquer outra coisa que faça sentido para o seu projeto.
Theodoros Chatzigiannakis

12

Eu apoiaria ir para C #. Outros abordaram seus pontos muito bem, então não vou repetir o que eles disseram. Definitivamente, existem muitas boas razões para manter o VBA.

No entanto , um dos meus empregadores fez um trabalho impecável na criação de documentação significativa. Tanto que as decisões de design foram escritas com justificativa - se todos os projetos de software tivessem isso! Meu ponto? Uma das decisões de design foi "Estamos optando por escrever este programa em Java, porque o Sr. Fulano quer colocar x anos de experiência em Java em seu currículo". Se esse é um motivo forte para você mudar para o C #, não pode ser ignorado como uma trivialidade. Apenas não pode ser um dos motivos que você usa para justificá-lo para a equipe de TI, porque eles realmente não se importam com o que você deseja no seu currículo, mas com o produto que está funcionando.

Há também a percepção do VBA para pensar. Sei que não é verdade, mas conheço algumas pessoas que veem 'VBA' em um currículo e pensam "O que, esse cara estava preso fazendo trabalho de estagiário? Por que ele não tem experiência com uma linguagem real ?" Eles veem 'VBA' e pensam 'excel macro developer'. Como copiar / colar uma célula para outra, fazer cálculos simples etc. Geralmente, o tipo de pessoa que pode apreciar o desenvolvimento real no VBA é aquele que o fez, e isso parece um pool cada vez menor, pelo menos na minha experiência. Você pode ter uma noção melhor da percepção do VBA em sua área, mas eu tenho visto muita negatividade injustificada em relação a isso.

A outra coisa que quero focar: o MainMa mencionou as semelhanças entre VBA e C #. Isso é absolutamente verdade, e a resposta da JMK oferece algumas tecnologias para você ler. Tente copiar / colar seu código VBA em um projeto C # e veja como é fácil corrigir os erros de sintaxe.

Você disse que tinha 4.000 linhas de código, o que é um bom pedaço de código e provavelmente inclui muitas funcionalidades ... mas são apenas 4.000 linhas de código. Tente copiar e colar. Eu realmente não ficaria surpreso se você pudesse limpar esses erros de sintaxe e ter um projeto funcionando. Sem conhecer os detalhes do seu código ou a quantidade de tempo livre disponível para você, acho que você pode resolver isso em um fim de semana.

Pode não seguir as práticas recomendadas de C #, pode ser ineficiente, mas você acabaria com um projeto funcionalmente equivalente em C #. Você também pode estar relativamente certo de que seu novo código C # não é mais propenso a defeitos do que o seu código VBA antigo.

A conversão do seu código VBA em C # no seu próprio tempo faria algumas coisas para você:

  • Ao pesquisar erros de sintaxe, você se familiarizará com as práticas de C # - uma espécie de iniciador para trabalhar realmente em C #
  • Ele esclarecerá quaisquer problemas óbvios ao carregar o plug-in no Excel (já que o Excel ainda é um requisito). Talvez haja um problema que você ainda não tenha considerado que possa ser um obstáculo.
  • Ele mostrará uma prova de conceito ao seu cliente (a equipe de TI). Se eles perceberem que você tem um plug-in C # funcionando com a funcionalidade atual, reduzirá o nível de risco percebido com o C #.

E voltando aos três pontos da TI:

• É um projeto bastante importante, portanto, ele tem que funcionar - uma solução C # não seria tão estável ou funcionaria tão bem quanto a solução baseada em VBA existente.

Como mencionado, seu código C # cobrirá a mesma funcionalidade e será tão estável quanto seu VBA. Estritamente falando, não é uma chance que você introduzir erros / defeitos ou ineficiências, mas isso parece improvável. Não estamos falando de uma porta do iOS / Objective C para Android / Java, estamos falando de uma porta entre duas linguagens que compartilham muitas semelhanças na sintaxe e podem utilizar exatamente a mesma tecnologia - pastas de trabalho do excel.

• Teríamos que jogar fora o que fizemos na solução VBA e recriá-la do zero em C #.

Com isso, você não está jogando fora nenhum esforço ou código.

Alguém precisará oferecer suporte a duas soluções separadas, uma no VBA e outra no C #. [atualmente, eles atualmente não têm ninguém para apoio, geralmente eu passo].

Você terá apenas uma solução, tudo em C #.

Em suma, seu cliente vê muitos riscos. Se você pode executar as etapas para reduzir esse risco, elas podem adotar a alteração em C #.


2
Você faz alguns contra-argumentos muito válidos para a minha resposta. ++ por apenas fazê-lo e ver como vai. Você está certo. O projeto provavelmente poderia ser portado em uma tarde.
precisa

11

Eu odeio dizer isso, mas seus argumentos simplesmente não retêm água.

Teste de unidade.

Este é um problema resolvido há muito tempo. Existem muitas estruturas de teste de unidade por aí. Escolha um. Você já deveria estar fazendo isso. Eu recomendo o nosso , porque ele se integra ao IDE e oferece outros ótimos recursos.

Fonte de controle

Essa é um pouco mais difícil, existem poucas soluções prontas, mas é realmente apenas uma questão de obter e inserir seu código em um repositório. Aqui está uma maneira de fazer isso , mas também existem outras opções melhores .

Documentação de código

Também é um problema resolvido. O MZ-Tools possui um recurso de documentação XML que funciona de maneira muito semelhante aos documentos de comentários XML do .Net.

Melhores convenções de codificação

Assim como o Visual Studio possui o plug-in ReSharper, o MZ-Tools e o Rubberduck têm esses recursos.

IDE melhor

Novamente, existem plug-ins disponíveis para o VBA IDE.

Mais modularidade através de montagens - pode promover a reutilização em ferramentas futuras.

Também é um problema resolvido. Não, você não pode criar montagens, mas pode fazer referência a outros projetos do VBA.

Implantação gerenciada - pode controlar por quem essa ferramenta é usada.

Um adesivo de bit, você precisará escrever um código para controlar quem pode acessar o programa e quem não pode, mas você (novamente) provavelmente já deve ter escrito um código de segurança.

Quanto à implantação, também é um problema resolvido. Sim, requer código, mas existem exemplos por aí que você pode usar / modificar .


Além disso, está o fato de você começar do zero. Eu também recomendarei o artigo de Joel Spolsky .

Eles fizeram isso cometendo o pior erro estratégico que qualquer empresa de software pode cometer:

Eles decidiram reescrever o código do zero.

Seu pessoal de TI está certo. Você não deve reescrever isso do zero. Você deve resolver os problemas com sua solução atual.

Agora, com tudo isso dito, eu posso entender absolutamente por que você desejaria fazer isso em C # ou VB.Net. Eles realmente são uma solução melhor, se você está iniciando um novo projeto , mas pelo que parece, não é um projeto novo. É muito melhor melhorar o que você tem do que quebrá-lo, começando de novo.


4

Você pode salientar que até a Microsoft declara neste artigo:

A atualização do código para aprimorar os recursos ou corrigir os erros exigiria que o artefato do Office fosse reenviado por email, reestruturado e retrabalhado por cada usuário e em cada arquivo que estava usando a personalização.

O artigo trata de diferentes abordagens para o desenvolvimento de itens baseados no Office; talvez você também possa usar outros prós e contras em sua discussão.


Sim. A entrega é o fator chave aqui. Tudo o resto é semântica.
precisa

10
Há um número inacreditável de razões pelas quais cheguei à conclusão pessoal de que você deve executar ... corra o mais rápido possível do VBA. No entanto, um dos melhores argumentos que seus usuários podem entender é que, como esse código está contido em uma planilha, toda vez que o arquivo é copiado, esse é mais um arquivo que precisa ser atualizado com as correções, que é um processo manual. Se, por exemplo, você encontrar um erro grave em 9 meses, todos os arquivos afetados precisarão ser atualizados. Isso pode se tornar uma tarefa impossível se eles forem distribuídos em muitos OCs. Por uma questão de sanidade, empacote o aplicativo em um plug-in para Excel.
RLH

Acho que não concordo com tudo isso @RLH. O VBA continua sendo uma solução sensata para vários problemas de pequena escala. É quando a distribuição se torna um problema que falha.
precisa

4

Realmente depende de como você pretende mudar para C # (ou seja, qual tecnologia você vai usar).

Se você vai usar o OpenXML, está falando de uma reescrita total que, se você tiver uma solução que funcione, não é recomendada.

Se você está falando sobre o uso da Interop, pode achar que o processo é surpreendentemente tranquilo. Mudei muito código do VBA para C # (com Interop) no passado e depois que você estiver conectado à pasta de trabalho, assim:

var excelApplication = new Application();
var workbook = excelApplication.Workbooks.Open(@"C:\location.xlsx");

Em muitos casos, você pode copiar / colar seu código VBA, prefixando as chamadas de função workbook., substituindo Dim por var etc., quando apropriado, e adicionando ponto e vírgula no final.

É essencialmente o mesmo Framework abaixo do Excel, você está apenas mudando a sintaxe de VBA para C #.

Quando terminar, salve e feche o aplicativo:

workbook.Save();
excelApplication.Quit();

Em seguida, libere o aplicativo com o Marshal:

Marshal.ReleaseComObject(excelApplication);

Eu provavelmente escreveria uma classe de invólucro implementando IDisposable em torno do objeto Aplicativo do Excel e, em seguida, certifique-se de usar usingquando esse objeto for usado.

Uma boa maneira de argumentar seria gastar uma hora ou mais fazendo isso, o que em um curto espaço de tempo demonstraria a rapidez com que você poderia portar o código e convenceria seus colegas de que essa é uma boa idéia.

De certa forma, o código permaneceria praticamente inalterado, mas você tem todos os benefícios mencionados em ter um projeto C # no Visual Studio.


2

Estou na mesma posição, de ter um aplicativo muito grande (20k + linhas de código VBA) incorporado em uma pasta de trabalho do Excel. Ao testar com o Office 2013, ele simplesmente não funciona, acredita-se devido a alterações na sequência do evento de inicialização no novo modelo de escritório e possivelmente à aplicação mais rigorosa do EMET. Portanto, estou na posição de fazer uma conversão de falha em C # e VB.NET antes da implantação do Office 2013 este ano. Outras pastas de trabalho mais simples (aprimoradas pelo VBA) usadas em toda a organização não são imunes, algumas funcionam e outras não.

Os erros ocorrem no evento Workbook_Open , onde as planilhas da pasta de trabalho não estão mais disponíveis e no código EXCEL interno antes de qualquer código VBA ser referenciado.

Sendo confortável em todos os VBA, C # e VB.NET, estou escrevendo a conversão nos dois últimos. O código do framework está sendo escrito em C # porque os idiomas da linguagem permitem escrever certas construções funcionais nessa linguagem 3-4 vezes mais rápido que no VB.NET. A maior parte do código está no VB.NET, porque minha reescrita é menos extensa e existem certas expressões que não estão presentes no C #.

Antes de tomar qualquer decisão, recomendo fortemente que você teste o aplicativo existente com o OFFICE 2013 e a extensão máxima da aplicação do EMET que a organização prevê implantar nos próximos 2-3 anos. Você pode, como eu, descobrir que o aplicativo existente simplesmente não será executado nesse ambiente sem ser reescrito de qualquer maneira - nesse caso, a reescrita também pode estar no DOT NET e no VSTO.

Termo aditivo:

Escrever um pequeno utilitário de extração automatizada, que percorre todo o conteúdo da pasta de trabalho VBA e exporta todos os módulos, classes e formulários para arquivos, é de um a dois dias de trabalho, dependendo de como você deseja que seja. Da mesma forma, com o inverso para importar os arquivos de um diretório para uma pasta de trabalho em branco. Com esses dois, é bem possível ter todo o seu código VBA no controle de origem adequado e ter um processo de Compilação a partir do código-fonte para sua pasta de trabalho.

OU - use um utilitário gratuito, como o Excel VBA Code Cleaner


2

Gostaria de aproveitar esta oportunidade para aprimorar minhas habilidades de C #, pois atualmente não sou tão competente em C # quanto sou VBA e gostaria de um projeto como esse para me levar ao "próximo nível".

Seja honesto. Você planeja compartilhar essas informações com as outras pessoas envolvidas na tomada dessa decisão? Caso contrário, eu colocaria toda a culpa em você, se o projeto falhar. Como um projeto semelhante já foi criado e lançado em campo, todos formaram o que esperavam que acontecesse em sua própria mente. Eles sabem quanto tempo levou para criar o último e acreditam que você pode criá-lo em menos tempo (o que pode ou não ser verdade com base nos requisitos adicionais). Você está pronto para assumir essa responsabilidade junto com o aprendizado de um novo idioma?

Eu recomendo portar o aplicativo antigo para C # o mais rápido possível. Talvez você possa aprender o suficiente no processo antes de tomar uma decisão. Pelo menos, você alcançará seu objetivo de aumentar suas habilidades com o novo idioma e ainda concluir o projeto no prazo.

Então, novamente, se você se sentir tão forte com isso, e a construção do projeto estiver toda apoiada em seus ombros, faça da maneira que desejar. É sempre mais fácil obter perdão do que permissão.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.