none
Como abrir arquivo do EXCEL e chamar uma MACRO em C#?

    Question

  • Olá pessoal.

    Na minha aplicação tenho um botão que precisa executar 3 funções.

    1 - Salvar os dados do textBox no arquivo x.xls -  Isso já faz!

    2 - Abrir o arquivo x.xls - Isso também já faz!

    3 - Rodar a MACRO CriaGrafico() - Isso ainda não sei fazer.

    Tentei usar o tutorial http://support.microsoft.com/kb/306683.

    Porem não consegui ligar o tutorial com o ambiente de trabalho!

    Estou usando Windows 7 Ultimate, Office Professional 2010 e Visual Studio 2010 Ultimate.

    Alguma dica ou tutorial?

    Agradecido,

    silvio pontes


    silvio pontes

    Sunday, February 12, 2012 8:48 PM

Answers

All replies

  • Olá Silvio,

    Veja se te ajuda: http://www.eggheadcafe.com/articles/create_macro_at_runtime_in_dotnet.asp

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Monday, February 13, 2012 11:04 AM
  • Olá Fernando,

    Li as informações no link, porém ainda não testei o código.

    Se funcionar vai matar a questão.

    Muito agradecido amigo.

    Tenho uma outra questão que esta me tirando o sono.

    Em minha aplicação C# tenho labels, textBox, listBox e arrays multidimensionais.

    Preciso salvar estes objetos em arquivo .xls.

    Ok, salvar um label que tem uma linha com 20 ou 30 caracteres não é realmente o problema.

    Agora, falando de textBox com 4 linhas e que preciso salvar em 4 celulas distintas, ou, listBox com 2 ou mais linhas e 2 ou mais colunas e que tambem preciso salvar em celulas distintas e ainda o array[136,18] que tambem deve ser salvo em celulas distintas.

    Qual a solução para isso?

    Abraços,

    silvio pontes


    silvio pontes

    Tuesday, February 14, 2012 3:10 AM
  • Olá Silvio,

    A solução é tratar cada valor, um de cada vez, como se cada um fosse um TextBox, e adicioná-los a suas respectivas células.

    Consegue visualizar isso?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Tuesday, February 14, 2012 11:42 AM
  • Olá Fernando, entendi.

    Não podemos implementar a tediosa tarefa de salvar o array[136,18] com um laço?

    workSheet.Cells[1, "A"] = "x";
    workSheet.Cells[1, "B"] = "y";
    // igual para C D E F G H I J K L M N O P
    workSheet.Cells[1, "Q"] = "y";
    
                var row = 1;
                foreach (var acct in accounts)
                {
                    row++;
                    workSheet.Cells[row, "A"] = acct.x;
                    workSheet.Cells[row, "B"] = acct.y;
                    // até         [row, "Q"] = acct.y;
                }


    silvio pontes

    Tuesday, February 14, 2012 7:22 PM
  • Olá Silvio,

    Eu estava pensando em fazer desta forma mesmo.

    Quando eu digo para tratar cada valor de uma vez é exatamente isso.

    Varrer sua lista e incluir os dados na planilha.

    Vc gostaria de inserir tudo de uma única vez?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Tuesday, February 14, 2012 7:28 PM
  • Olá Fernando,

    Estou trabalhando desta forma:

    1 - devo salvar o myArray[136,18] e alguns labels e textBox na plan1.

    2 - mudar para a plan2 e salvar outros arrays multidimensionais.

    3 - mudar para a plan3 e salvar outros labels.

    No 1, salvar o myArray[136,18]; preciso que seja tudo de uma única vez e a partir da célula C5(exemplo).

    []s!


    silvio pontes

    Wednesday, February 15, 2012 8:08 PM
  • olá Silvio,

    Acredito que vc terá de atribuir os valores um de cada vez.

    Não me lembro de era possível jogar um grupo de valores de uma única vez.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Thursday, February 16, 2012 2:10 AM
  • Olá Fernando,

    Estou muito próximo de resolver esta parte do array.

    Como salvar dados na plan2 e na plan3?

    []s!


    silvio pontes

    Thursday, February 16, 2012 3:08 AM
  • Olá Silvio,

    Vc deve utilizar um índice do objeto Sheet par escolher qual planilha irá receber seus dados.

    Aqui tem uma referência de como fazer: http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/b6e8a28c-6760-4e86-a1aa-e2ce9ec36380

    Seria algo parecido com isso:

    Excel.Worksheet worksheet1 = (Excel.Worksheet)sheets.get_Item(1);
    Excel.Worksheet worksheet2 = (Excel.Worksheet)sheets.get_Item(2);
    Excel.Worksheet worksheet3 = (Excel.Worksheet)sheets.get_Item(3);

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Thursday, February 16, 2012 10:41 AM
  • Olá Fernando,

    Ok entendi.

    Vou fazer da forma que falamos aqui.

    Retornarei com o resultado.

    silvio pontes


    silvio pontes

    Saturday, February 18, 2012 1:54 PM
  • Fernando legal, consegui salvar o array desta forma: X1

    Salvar os dados no arquivo .xls em Sheets diferentes inclusive, abrir o arquivo no Excel, isso já é feito no código. 

    Porem ainda nao consegui:

    Chamar a MACRO CriaGrafico() quando o arquivo for aberto no Excel.

    Mais alguma dica?

    silvio pontes

    X1

                #region 生データ Sheet2
    
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(2);
                xlWorkSheet.Name = "生データ";
    
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(2);
                xlWorkSheet.Cells[1, 1] = "微粒子計データ";
                xlWorkSheet.Cells[2, 1] = ""; xlWorkSheet.Cells[2, 2] = "ケ-ス1"; xlWorkSheet.Cells[2, 5] = "ケ-ス2"; xlWorkSheet.Cells[2, 8] = "ケ-ス3"; xlWorkSheet.Cells[2, 11] = "ケ-ス4"; xlWorkSheet.Cells[2, 14] = "ケ-ス5"; xlWorkSheet.Cells[2, 17] = "ケ-ス6";
                xlWorkSheet.Cells[3, 1] = ""; xlWorkSheet.Cells[3, 2] = "2μm"; xlWorkSheet.Cells[3, 5] = "2μm"; xlWorkSheet.Cells[3, 8] = "2μm"; xlWorkSheet.Cells[3, 11] = "2μm"; xlWorkSheet.Cells[3, 14] = "2μm"; xlWorkSheet.Cells[3, 17] = "2μm";
                xlWorkSheet.Cells[3, 1] = ""; xlWorkSheet.Cells[3, 3] = "7μm"; xlWorkSheet.Cells[3, 6] = "7μm"; xlWorkSheet.Cells[3, 9] = "7μm"; xlWorkSheet.Cells[3, 12] = "7μm"; xlWorkSheet.Cells[3, 15] = "7μm"; xlWorkSheet.Cells[3, 18] = "7μm";
                xlWorkSheet.Cells[3, 1] = ""; xlWorkSheet.Cells[3, 4] = "10μm"; xlWorkSheet.Cells[3, 7] = "10μm"; xlWorkSheet.Cells[3, 10] = "10μm"; xlWorkSheet.Cells[3, 13] = "10μm"; xlWorkSheet.Cells[3, 16] = "10μm"; xlWorkSheet.Cells[3, 19] = "10μm";
                xlWorkSheet.Cells[4, 1] = "補正係数";
                xlWorkSheet.Cells[5, 1] = "秒";
                xlWorkSheet.Cells[5, 2] = "ケ-ス1"; xlWorkSheet.Cells[5, 3] = "ケ-ス1"; xlWorkSheet.Cells[5, 4] = "ケ-ス1";
                xlWorkSheet.Cells[5, 5] = "ケ-ス2"; xlWorkSheet.Cells[5, 6] = "ケ-ス2"; xlWorkSheet.Cells[5, 7] = "ケ-ス2";
                xlWorkSheet.Cells[5, 8] = "ケ-ス3"; xlWorkSheet.Cells[5, 9] = "ケ-ス3"; xlWorkSheet.Cells[5, 10] = "ケ-ス3";
                xlWorkSheet.Cells[5, 11] = "ケ-ス4"; xlWorkSheet.Cells[5, 12] = "ケ-ス4"; xlWorkSheet.Cells[5, 13] = "ケ-ス4";
                xlWorkSheet.Cells[5, 14] = "ケ-ス5"; xlWorkSheet.Cells[5, 15] = "ケ-ス5"; xlWorkSheet.Cells[5, 16] = "ケ-ス5";
                xlWorkSheet.Cells[5, 17] = "ケ-ス6"; xlWorkSheet.Cells[5, 18] = "ケ-ス6"; xlWorkSheet.Cells[5, 19] = "ケ-ス6";
    
                int M_times = (Convert.ToInt32(nUD_KyuSoku.Value) + Convert.ToInt32(nUD_RyuSoku.Value) + Convert.ToInt32(nUD_Seiti.Value)) / 10;
                //int M_times = 90;
                for (int i = 1; i <= M_times; i++)
                {
    
                    //textBox3.AppendText(Convert.ToString(i) + "," +
                    xlWorkSheet.Cells[i + 5, 1] = i * 10;//Convert.ToString(a_i_sagyou0[i, 0]);
                    xlWorkSheet.Cells[i + 5, 2] = Convert.ToString(a_i_sagyou0[i, 0]);
                    xlWorkSheet.Cells[i + 5, 3] = Convert.ToString(a_i_sagyou0[i, 1]);
                    xlWorkSheet.Cells[i + 5, 4] = Convert.ToString(a_i_sagyou0[i, 2]);
                    xlWorkSheet.Cells[i + 5, 5] = Convert.ToString(a_i_sagyou0[i, 3]);
                    xlWorkSheet.Cells[i + 5, 6] = Convert.ToString(a_i_sagyou0[i, 4]);
                    xlWorkSheet.Cells[i + 5, 7] = Convert.ToString(a_i_sagyou0[i, 5]);
                    xlWorkSheet.Cells[i + 5, 8] = Convert.ToString(a_i_sagyou0[i, 6]);
                    xlWorkSheet.Cells[i + 5, 9] = Convert.ToString(a_i_sagyou0[i, 7]);
                    xlWorkSheet.Cells[i + 5, 10] = Convert.ToString(a_i_sagyou0[i, 8]);
                    xlWorkSheet.Cells[i + 5, 11] = Convert.ToString(a_i_sagyou0[i, 9]);
                    xlWorkSheet.Cells[i + 5, 12] = Convert.ToString(a_i_sagyou0[i, 10]);
                    xlWorkSheet.Cells[i + 5, 13] = Convert.ToString(a_i_sagyou0[i, 11]);
                    xlWorkSheet.Cells[i + 5, 14] = Convert.ToString(a_i_sagyou0[i, 12]);
                    xlWorkSheet.Cells[i + 5, 15] = Convert.ToString(a_i_sagyou0[i, 13]);
                    xlWorkSheet.Cells[i + 5, 16] = Convert.ToString(a_i_sagyou0[i, 14]);
                    xlWorkSheet.Cells[i + 5, 17] = Convert.ToString(a_i_sagyou0[i, 15]);
                    xlWorkSheet.Cells[i + 5, 18] = Convert.ToString(a_i_sagyou0[i, 16]);
                    xlWorkSheet.Cells[i + 5, 19] = Convert.ToString(a_i_sagyou0[i, 17]);
                }
                
                #endregion
    


    silvio pontes

    Saturday, February 25, 2012 9:31 AM
  • Olá Silvio,

    Para rodar a macro faça assim:

    public static void ExecuteMacro(Excel._Workbook oWB)
    {
    Object oMissing = System.Reflection.Missing.Value;
    //The following command executes the macro
                oWB.Application.Run("Nome da Sua Macro"
    , oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
    oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
    oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
    oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
    }
    

    Referência: http://codingsense.wordpress.com/2009/05/11/create-execute-and-delete-macro-in-excel-using-c/

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Saturday, February 25, 2012 1:30 PM
  • Oi Fernando,

    Eu tentei assim, 

    captura da tela

    E tambem retornou que nao coloquei argumentos,

    Error 1 No overload for method 'ExecuteMacro' takes 0 arguments F:\USUARIOS\dtp2\xxx AQUI xxx\フロックシーカーVer.1.5\Form1.cs 5197 13 NanoFX


    silvio pontes

    Monday, February 27, 2012 4:16 PM