Página 1 de 2

tentando aprende C para fazer DLL's para o excel

Enviado: Dom Out 18, 2015 2:11 pm
por Edcronos
estou tentando aprender a programar em C para transformar minhas macros em DLL

https://sites.google.com/site/jrlhost/links/excelcdll

http://www.cprogressivo.net/p/o-basico- ... gem-c.html

Deveria ser muito simples reescrever minhas macros
isso por que apenas uso Arrays, variaveis, laços for next, e comparadores iF
mas enquanto o vb ou basic te dá um visão clara "contextual" do que vai ser feito
O C inicia o corpo das instruções com { e termina com }

Código: Selecionar todos

    If Direção1esq_2dir = 1 Then
        For L = lia To lfa
            If ArrayNome(L, cw) = v Then
                For QL = 1 To nc
                    i = ArrayNome(L, nci)
                    For cl = 1 To Pfa - 1
                        ArrayNome(L, cl) = ArrayNome(L, cl + 1)
                    Next
                    ArrayNome(L, Pfa) = i
                Next
            End If
        Next
    End If

Código: Selecionar todos


if (Direção1esq_2dir == 1) //esquerda
{
		for (void *L = lia; L <= lfa; L++) //varre linha
		{
			if (ArrayNome[L][cw] == v)
			{
				for (void *QL = 1; QL <= nc; QL++)
				{
					i = ArrayNome[L][nci];
					for (void *cl = 1; cl < 2000; cl += 2)
					{
						ArrayNome[L][cl] = ArrayNome[L][cl + 1];
					}
					ArrayNome[L][Pfa] = i;
				}
			}
		}
	}
	
como pode ver
não existe o Then no if para iniciar a instrução se o teste for verdadeiro no lugar entra um {, e no lugar do End if entra }

no laço for que é quase um do loop
For cl = 1 To 2000 - 1 step2
for (void *cl = 1; cl < 2000; cl += 2)
void é para iniciar a variavel cl que vai contar enquanto cl for menor que 2000 com incremento cl+=2

nos arrays a dificuldade seria definir as dimensões

a maior dificuldade para mim vai ser os {}
se com next, end if e afins eu já tenho que colocar algo discriminando de qual pertence como essa

Código: Selecionar todos

Sub Macro1()

    With Sheets("Sheet3")

        For rw = .Cells(Rows.Count, "E").End(xlUp).Row To 6 Step -1    'a
           If .Cells(rw, "E").Value2 = "Contractor" Then    '-1
               v = .Cells(rw, "O").Value2
                For c = Cells(3, "E").Column To Cells(3, "m").Column    'b
                   If v = Sheets("Sheet4").Cells(3, c).Value2 Then    '1
                       vq = .Cells(rw, "Q").Value2
                        For r2 = 4 To 19    'c
                           If vq = Sheets("Sheet4").Cells(r2, "C").Value2 Then    '2
                           vq2 = UCase(Sheets("Sheet4").Cells(r2, "d").Value2)
                           
                                If vq2 = "AUX" Or vq2 = "CONTRACTOR" Then  '3
                                   c2 = Cells(1, "e").Column
                                    .Rows(rw + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                                    .Range("a" & rw + 1, "q" & rw + 1).Value2 = .Range("a" & rw, "q" & rw).Value2
                                    If c < 12 Then .Cells(rw + 1, "e").Value2 = "Aux"
                                    For r4 = r2 To r2 + 3  'd
                                       c2 = c2 + 1
                                        If c2 = 7 Or c2 = 10 Then c2 = c2 + 1
                                        .Cells(rw + 1, c2).Value2 = Sheets("Sheet4").Cells(r4, c).Value2
                                    Next    'd
                                   GoTo proximo:
                                End If    '3
                           End If    '2
                       Next    'c
                   End If    '1
               Next    'b
           End If '-1
proximo:
        Next    'a
     
    End With
End Sub
imagina com uma macro que tenho aqui com algo em torno de 20 for next, 50 if e mais algumas coisas e tudo em cascata

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Seg Out 19, 2015 8:20 am
por Mikel Silveira Fraga
Edcronos, bom dia.

Normalmente esse tipo de situação não é novidade. Como você mesmo disse, as sintaxes, ou no caso os { }, para C são diferentes para VB.

Por este motivo, eu havia postado um tópico mencionando sobre aprender a trabalhar com VB6 e VBScript, pois são linguagens mais robustas e profissionais, como o C; podem ser gerados DLL com essas linguagens, que é seu objetivo; além de possuir as mesmas sintaxes do VBA.

Agora, o C é muito bom e o site que você esta buscando, CProgressivo, é excelente. Comecei a aprender um pouco de Java com os autores desse site e digo que vale muito a pena.

Porém, gostaria de lhe advertir sobre uma coisa: cuidado para não estar querendo absorver muita coisa ao mesmo tempo. Aprender outras linguagens é uma iniciativa muito boa, mas acredito que seja mais viável primeiro estar bem acostumado com uma linguagem de programação, para ai sim buscar novos conhecimentos. Mas essa é apenas uma dica, de quem vem aprendendo as coisas sozinho e na marra, assim como sei que você tem feito.

Abraços e excelente semana.

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Seg Out 19, 2015 8:35 am
por webmaster
Edcronos,

É um esforço mais do que admirável. A escolha do C é algo bem corajoso para os dias de hoje, caso o objetivo seja somente criar bibliotecas para o Excel fora do VBA. Já tentou C# ou VB.NET?

Quanto à sintaxe, garanto que é só questão de costume. ;)

Att

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Seg Out 19, 2015 10:27 am
por Edcronos
ola mikel
nem é questão de estar querendo absorver muita coisa "nem consigo decorar nada mesmo"
deste o inicio tenho uma ideia na cabeça, e no caminho aprendi e busquei ferramentas para concluir essa ideia

inicio-->(ideia claro)_Excel: já tem uma interface visual e de fácil manipulação e muitas ferramentas
Automação: precisava ser algo que trabalhasse rapidamente com grandes quantidades de dados
fui trabalhando a estrutura junto da facilidade de uso e visual fora ser facilmente manipulável e dinâmico, e acabou ficando igual a banco de dados

e como não decoro nada fiquei na estrutura simples, mas muito mais rápido, Arrays, Laços, e comparadores
precisei de dados para ir testando a planilha, então coloquei a aquisição de dados da Bolsa de valores e de loterias pela internet " o internet explore está uma droga", como a planilha é dinâmica pode aceitar dados de quase qualquer tipo , criei varias ferramentas para reajustar os dados

como vc mesmo viu entrei no banco de dados , isso para ter um relacionamento robustos já que a finalidade da planilha é levantamentos de dados
mas a linguagem SQL para mim é muito complicada e não achei uma maneira de correr um arrays como se faz no vb e no C, então está em pausa

eu tenho criado varios filtros bastante robustos usando array, e para facilitar estou na criação de um a partir de formulas " como vc deve ter visto aqui no forum"
Apesar de ter ficado super rápido com vba ainda não faz oq eu idealizo,
tenho uma macro que faz milhoes de interações fora as chamadas de outras funções e já chegou a 9 minutos de processamento, para algo que ainda está em teste levar mais que 2 segundos é inapropriado,e nem dá para diminuir a quantidade de dados pq a macro é para cruzamento de dados

o fato da linguagem C/C++ é , de baixo nivel
"para mim é mais facil criar uma estrutura mental cheio de loops e comparações do que decorar o nome de uma função e o funcionamento dela"
o uso do VB envolve ferramentas pagas, mas pelas semelhanças ao vba acho que dá para aprender paralelamente ao C, isso deve dar mais apoio na dificuldade que estou tendo na interface de saida de dados

Sobre o uso dos {} e as sintaxes diferentes nas tantas linguagens, acho que é pura vontade de ser diferente, daria para se ter um compilador C com uma sintaxe igual ao basic,
é igual as formulas, excel tem uma estrutura de escrever E(ou();OU()),
no vba fazer a mesma coisa detona um pouco mais de trabalho "eu uso teste em cascata para facilitar o raciocínio.
no sql tem uma maneira parecida ao vb mas com a facilidade do uso da (), ((V or V2) And (V3 or V4)) pelo menos foi isso que entendi no select

e como falou o tomas
Quanto à sintaxe, garanto que é só questão de costume. ;)
Tomas, não é bem somente criar as bibliotecas , a minha vontade mesmo seria fazer a minha ferramenta algo totalmente independente, mas não sei se terei capacidade para isso, então no caminho de criar as ferramentas eu já deixo o mapa pronto

Mas não entendi essa parte
A escolha do C é algo bem corajoso para os dias de hoje,

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Seg Out 19, 2015 12:20 pm
por webmaster
Quando digo corajoso, me refiro ao fato de que, para aplicações comerciais, portais, sistemas baseados em bancos de dados, entre outros, existem alternativas mais novas, mais simples e absurdamente mais produtivas.

O C ainda é (muito) usado, mas para o tipo de programação que o Mikel citou, de baixo nível. Ou seja, o mercado deixa o C para aplicações mais próximas do hardware e consequentemente, mais complexas, matematicamente falando.

Acredito que o mais importante é definir o objetivo do aprendizado. Aprender C por aprender, você vai com certeza ganhar o conhecimento, mas com o risco de não ter no que utilizar.

Recomendo que pense da seguinte forma: "Que tipo de problema quero resolver?" e " Qual a melhor ferramenta para resolvê-lo?". Se a resposta para a segunda pergunta for "linguagem C", então está no caminho certo.

Entretanto e finalmente, você é livre para aprender o que quiser, mesmo que por simples hobby. Todo conhecimento novo, desde que lhe dê a chance de fazer algo bom, é mais do que válido. Espero não ter viajado muito. :D

Boa sorte!

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Seg Out 19, 2015 1:53 pm
por Edcronos
Tomas,
para falar a verdade não pretendo entrar no mercado de trabalho nessa area, então vou aprender apenas para uso nesse projeto
isso porque apesar de ter boa capacidade logica eu tenho péssima memoria

sobre o C/C++, foi algo que me identifiquei "visualmente falando"
pensei no Python, mas não tem o Goto, e eu uso muito para pular loops e verificações desnecessárias quando tenho um código em cascata,
"apesar de ser possível implementar"
a maioria das coisas que faço é nesse estilo.
tá, eu sei que o goto e o Gosub são odiados, "mas se é para mim, pq não posso usar ?"

Sei que em C/C++ vou ter que lidar com ponteiros, pilhas filas e criar um método para trabalhar com arrays com dimensões dinâmicas
mas vi que já existe varias ferramentas que auxiliam na programação
Recomendo que pense da seguinte forma: "Que tipo de problema quero resolver?" e " Qual a melhor ferramenta para resolvê-lo?". Se a resposta para a segunda pergunta for "linguagem C", então está no caminho certo.
"Que tipo de problema quero resolver?"
relacionamento de dados, busca e comparações, envolvendo matemática, datas, e até textos , (é algo bem mais complexos que isso )

" Qual a melhor ferramenta para resolvê-lo?"
Cara, não tenho nem ideia de como resolver, seria algo como um conjunto de ferramentas trabalhando junto
foi uma ideia que entrou na minha cabeça,
é como uma equação, eu sei que tem uma forma de ter o resultado, mas não tenho nem ideia de como resolver, então eu vou tentando até chegar em um resultado satisfatório.
no meio caminho já tive um monte de falsos positivos

mas bem, minha mente só larga o osso depois de roer completamente.
Espero não ter viajado muito. :D
o único viajando aqui sou eu (muito além da imaginação)

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Ter Out 20, 2015 8:44 am
por webmaster
Edcronos,

O argumento parece lógico. Mas, fica a dica com os cuidados ao usar o goto. Ele de fato é um recurso e deve ser utilizado, mas a quebra de lógica que ele causa no programa é o que faz ser tão odiado.

É só usar com moderação. Quanto a linguagens, só posso dizer que ADDOOORROO o Python! É uma pena que não tenha agradado.

Sucesso!

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Ter Out 20, 2015 10:12 am
por Edcronos
e , já li debates em foruns a respeito, e até já tive discussões sobre macros que fiz

mas quem aceita o uso, fala da moderação, e fala para uso de melhorar a estrutura da macro
os que não aceitam parece que é apenas pela palavra, pois preferem complicar o codigo usando outros métodos que em nada melhoram a logica e abominando completamente o uso.

meu uso é esse

Código: Selecionar todos

  For L = LxO To 1 Step -1
        If ResulFolm(L, 1) <> 2 Then
            For C2 = c2x To Cfco
                v = Comand(C2)
                For c = Cid To Cfd
                    Dd = Array_valor(L, c)
                    Call Convert_tipo(Dd, Tipo, v)
                    If v = Dd Then GoTo pula_Ev
                Next
                ResulFolm(L, 1) = 2   
                GoTo pula_Ef
pula_Ev:
            Next
            ResulFolm(L, 1) = 1
        End If
pula_Ef:
    Next
    Return
eu tbm gostei do que vi no Python, mas a falta do goto dificulta meu raciocínio no momento,
logica desse codigo aí de cima eu faço muito facilmente,
eu sei fazer sem o goto, mas no desenvolvimento me atrapalha

o uso de funções em macros pequenas somente se essa função tem uso reaproveitável,
fora isso prefiro usar um gosub, senão me perco, e mesmo enquanto estou escrevendo eu esqueço de como funciona :(

mas bem, ainda estou analisando, e estudando como vou fazer e no meio caminho posso mudar de ideia

Ps. eu tinha escrito algo que nem eu iria le :roll: , então mandei para o rascunho

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Ter Out 20, 2015 12:29 pm
por Edcronos
seguindo com meu aprendizado

como vou trabalhar com arrays estou definindo como eles trabalham

diferenças basicas "muitassssssssss"
não tem como saber os limites das arrays
sempre começa com 0 " eu uso arrays de base 1 e variante obrigatório para pegar e passar valores para planilha sem ter que construir loops"

passar valores de um array para outro no excel é : Array_destino = Array_origem
no C/C++ provavelmente terei que fazer um loop

sobre a dimensão da array tenho 2 opções,
criar função para varrer e retornar
tamanho passar o tamanho por argumentos

criar a função para retornar o tamanho torna mais fcil de usar
passar as dimensões torna tudo mais rápido

e agora qual escolher ?

as informações que eu achei a respeito são bem fragmentadas e praticamente tenho que pesquisar cada detalhe separadamente

Re: tentando aprende C para fazer DLL's para o excel

Enviado: Ter Out 20, 2015 2:36 pm
por webmaster
Edcronos,

No caso do seu código, a saída do loop poderia usar simplesmente um Exit For. Neste caso, você sai do loop e nada mais.

O goto significa, vá para qualquer lugar, não importar o que ocorra. Isso em muitos casos pode causar problemas de variáveis sem valor, esquecimento de tarefas como desalocar memória, entre outros. Arrisco que o uso do goto será desnecessário quando você conhecer todos as formas de laço e decisão da linguagem em questão.

Att