Notifications
Clear all

Juntar arquivos bas, frm e cls num xls sem usar o Excel

7 Posts
3 Usuários
0 Reactions
1,325 Visualizações
Issamu
(@issamu)
Posts: 605
Honorable Member
Topic starter
 

Tenho uma dúvida que creio não haver solução, mas vale a pena perguntar.

Eu quero saber se existe alguma maneira de juntar arquivos ".bas", ".frm" e ".cls" num arquivo xls, mas sem abrir este xls, gerando um novo arquivo xlsm.

Pode soar estranho, mas a necessidade é em virtude de um ambiente restritivo que contém um programa de proteção, que não é possível desabilitar, o qual restringe a criação de arquivos xlsm. No entanto é possível criar arquivos xls e também exportar arquivos bas, frm e cls.

A grande questão é como juntar estes arquivos num novo xlsm neste ambiente, mas sem usar o Excel, ou usando o Excel de forma que não seja a tradicional (Abrir o arquivo, abrir o VBE, importar os arquivos bas, frm e cls, e salvar como xlsm).

Será que alguém tem alguma ideia se existe uma alternativa?

Rafael Issamu F. Kamimura
Moderador Oficial Microsoft Community - MCC (Contribuidor do Microsoft Community)
http://zip.net/bjrt0X - http://zip.net/bhrvbR
Foi útil? Clique na mãozinha
Conheça: http://excelmaniacos.com/

 
Postado : 22/04/2015 7:40 am
(@edcronos)
Posts: 1006
Noble Member
 

só uma pergunta
mesmo existindo essa possibilidade
esse programa de proteção tbm não iria bloquear essa intervenção ?
já que um programa assim envolve criação e alteração de arquivos , oq pode ser categorizado até como viros

bem como esses arquivos poderiam ser lidos como texto, binario, batsh
algo que acho quase impossível mas talvez montar esses aquivos semanticamente

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"

 
Postado : 22/04/2015 8:33 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu tenho um método, estou procurando o arquivo e assim que eu encontrar, eu passo pra vc o código!

FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 22/04/2015 9:38 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu encontrei ontem lá em casa, mas deu uma pane no computador antes de eu conseguir abrir o arquivo e pegar o código!
Em resumo, só pra ir adiantando, tem o assemble.vbs e o disassemble.vbs, ambos em vbscript, tem objetivo de desmantelar um arquivo com macro, e remontá-lo a partir de um modelo em branco. É bem louco, hj a noite eu mando.

FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 23/04/2015 6:56 am
Issamu
(@issamu)
Posts: 605
Honorable Member
Topic starter
 

Legal FF! Se isso funcionar vai ser muito útil mesmo para mim e vou ficar te devendo uma!
Abraços!

Rafael Issamu F. Kamimura
Moderador Oficial Microsoft Community - MCC (Contribuidor do Microsoft Community)
http://zip.net/bjrt0X - http://zip.net/bhrvbR
Foi útil? Clique na mãozinha
Conheça: http://excelmaniacos.com/

 
Postado : 23/04/2015 6:59 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Esses códigos são em VBS, ou seja, coloque num arquivo por exemplo disassemble.vbs e assemble.vbs *(ou quaisquer nomes que vc quiser)
Leia, entenda, edite o que achar necessário. Use con cuidado. Faça cópias de segurança de tudo antes de se aventurar aqui ;-)

Para usar, bastará dar duplo clique no vbs, ou na linha de comando do DOS, digitar o nome do VBS.

Segue os códigos para:

a) Desmontar o xlsm:

Dim shell, fso
Dim objExcel, objWorkbook, objVBComp
Dim fileName, file, codeDir, sfx, blackstone, programFile

Set objExcel = CreateObject("Excel.Application") 
objExcel.EnableEvents = False

Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = WScript.CreateObject("WScript.Shell")

blackstone = fso.GetFolder("C:Program FilesiLevelExcel")

If WScript.Arguments.Count = 0 Then
    fileName = "MDET.xls"
Else
    fileName = WScript.Arguments.Item(0)
    blackstone = shell.currentDirectory
End If
programFile = fso.BuildPath(blackstone, fileName)


If Not fso.FileExists(programFile) Then
    WScript.Echo "File '" & programFile & "' doesn`t exist."
    WScript.Quit
End If

codeDir = fso.BuildPath(shell.CurrentDirectory, "NewCode")
If Not fso.FolderExists(codeDir) Then
    fso.CreateFolder codeDir
End If

ClearFolder codeDir

Set objWorkbook = objExcel.Workbooks.Open(programFile)

For Each objVBComp in objWorkbook.VBProject.VBComponents
'    WScript.Echo "   Name: " & objVBComp.Name & "    Type: " & objVBComp.Type
    Select Case objVBComp.Type
        Case 1 ' vbext_ct_StdModule
            sfx = ".bas"
        Case 2 ' vbext_ct_ClassModule
            sfx = ".cls"
        Case 3 ' vbext_ct_MSForm
            sfx = ".frm"
        Case 100 ' vbext_ct_Document
'            sfx = ".sheet"
        Case Else
'            sfx = ""
'            WScript.Echo "UNKNOWN Script Type: " & objVBComp.Type & "   Name: " & objVBComp.Name
    End Select
    
    If sfx <> "" Then
'        WScript.Echo "Export Script Type: " & objVBComp.Type & "   Name: " & objVBComp.Name & " to " & sfx & " file"
        objVBComp.Export fso.BuildPath(codeDir, objVBComp.Name & sfx)
    End If
Next

objWorkbook.Close

objExcel.Quit

CompareAndDelete
WScript.Echo "File " & programFile & " has been successfully disassembled."
WScript.Quit

Sub ClearFolder(path)
    Dim folder, file
    If fso.FolderExists(path) Then
        Set folder = fso.GetFolder(path)
        For Each file in folder.Files
            file.Delete true
        Next
    Else
'        WScript.Echo "No such folder. Create."
        fso.CreateFolder path
    End If
End Sub

Sub CompareAndDelete
    Dim shell, fso, oldFolder, oldFile, oldStream, oldContents, newFolder, newFile, newStream, newContents

    Set shell = WScript.CreateObject("WScript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oldFolder = fso.GetFolder("Code")
    Set newFolder = fso.GetFolder("NewCode")

    For Each newFile in newFolder.Files
        oldFile = fso.BuildPath(oldFolder, newFile.Name)
        If fso.FileExists (oldFile) Then
            sfx = LCase(fso.GetExtensionName(newFile.Name))
            If (sfx <> "frx") Then
                Set oldStream = fso.OpenTextFile(oldFile, 1)
                Set newStream = fso.OpenTextFile(newFile, 1)
                oldContents = oldStream.ReadAll
                newContents = newStream.ReadAll
                oldStream.Close
                newStream.Close

                If (oldContents = newContents) Then
                     fso.DeleteFile newFile
                End If
            End If
        End If
    Next
End Sub

b) Montar o xlsm:

Dim shell, fso
Dim objExcel, objWorkbook, objVBComp
Dim file, name, sfx, codeFolder, codeFile, blackstone, programFile, imgFolder, imgFile, targetImgFile


Set objExcel = CreateObject("Excel.Application") 
objExcel.EnableEvents = False

Set fso = CreateObject("Scripting.FileSystemObject")

Set file = fso.GetFile("EmptyDET.xls")
file.Copy "DET.xls", true
Set file = fso.GetFile("DET.xls")
file.Attributes = file.Attributes AND 0

Set objWorkbook = objExcel.Workbooks.Open(file.Path)

Set codeFolder = fso.GetFolder("Code")

For Each codeFile in codeFolder.Files

    sfx = LCase(fso.GetExtensionName(codeFile.Name))
    name = fso.GetBaseName(codeFile.Name)
    
    If (sfx = "cls" or sfx = "frm" or sfx = "bas") Then
        RemoveComponent objWorkbook, name
'        WScript.Echo "Import  " & codeFile.Path
        objWorkbook.VBProject.VBComponents.Import codeFile.Path
    Else
'        WScript.Echo "NOT PROCESSED  " & codeFile.Name
    End If

Next    

objWorkbook.Save
objWorkbook.Close

objExcel.Quit

If Not fso.FolderExists("C:Program FilesiLevel") Then
    fso.CreateFolder "C:Program FilesiLevel"
End If
If Not fso.FolderExists("C:Program FilesiLevelExcel") Then
    fso.CreateFolder "C:Program FilesiLevelExcel"
End If

blackstone = fso.GetFolder("C:Program FilesiLevelExcel")
programFile = fso.BuildPath(blackstone, file.Name)
If fso.FileExists (programFile) Then
    fso.DeleteFile (programFile)
End If
fso.MoveFile file, programFile

WScript.Echo "File " & programFile & " has been successfully created."
WScript.Quit

Sub RemoveComponent(objWorkbook, name)
            On Error Resume Next
    Set objVBComp = objWorkbook.VBProject.VBComponents(name)
    If objVBComp.Type = 1 or objVBComp.Type = 2 or objVBComp.Type = 3  or objVBComp.Type = 100 Then
'        WScript.Echo "Remove   " & name
        objWorkbook.VBProject.VBComponents.Remove objVBComp
    End If
end sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/04/2015 5:52 am
Issamu
(@issamu)
Posts: 605
Honorable Member
Topic starter
 

Olá FF!

Valeu pelo código. Ainda não tive oportunidade de testar no ambiente mencionado, mas assim que conseguir te dou um retorno!

Abraços!

Rafael Issamu F. Kamimura
Moderador Oficial Microsoft Community - MCC (Contribuidor do Microsoft Community)
http://zip.net/bjrt0X - http://zip.net/bhrvbR
Foi útil? Clique na mãozinha
Conheça: http://excelmaniacos.com/

 
Postado : 27/04/2015 8:48 am