2016-11-07 957 views
-1

我一直在使用VBA上的宏一段時間,並且還有一些我想隱藏的信息。由於excel是一種非常不安全的語言,因此我提出了創建編譯腳本的.exe文件以避免人們訪問我的代碼的想法。 我一直在尋找使用Visual Studio做到這一點的方法,但無法得到答案。 有人可以告訴我如何做到這一點? 非常感謝提前:)在Visual Studio中運行並編譯vba腳本

+0

我不知道這是否解決了你的問題,但也許你可以使用插件?請參閱[創建Excel 2007 vsto添加](http://www.clear-lines.com/blog/post/create-excel-2007-vsto-add-in-getting-started.aspx) – Stefan

+0

@Stefan感謝您的支持你的答案。我從你的鏈接開始做了一些研究,我想我會發現它很有用。我沒有考慮到它,但這是我尋找的起點。 = D –

+0

好的,很高興聽到這個消息。如果你發現你在找什麼,分享你的知識。 ;) – Stefan

回答

0

我不認爲你可以通過使用vba創建EXEs/DLLs。 EXEs/DLL是編譯程序集,因此您需要一個可編譯的編程語言/環境。編譯意味着「預譯成機器語言」。 VBA只是一種解釋型語言,這意味着它將在VBA環境中實時翻譯。我認爲你必須使用C#,C++等來做到這一點。如需進一步infromation請參閱:

Create a DLL using VBA editor

http://www.geeksengine.com/article/create-dll.html

https://msdn.microsoft.com/en-us/library/dt232c9t(VS.80).aspx

您可以鎖定和隱藏你的VBA代碼,而無需創建一個DLL:

http://www.excel-easy.com/vba/examples/protect-macro.html

http://www.ozgrid.com/VBA/protect-vba-code.htm

Best way to protect Excel VBA code?

但我不知道是否能解決你的問題:你說過,Excel的VBA似乎是一個不安全的語言。我不確定我是否明白你的意思。如果您只想隱藏腳本的內容,請參閱上文。到目前爲止,這將比在其他版本的Excel中更好地保​​護您的代碼。但我認爲還有一種方法可以解決這個問題, G。蠻力攻擊等通常是增強的方法,但如果你想確保你(或更好的經驗豐富的程序員必須爲此創建一個程序(exe),如果安全意味着不同的東西(爲什麼你想隱藏你的代碼? )比讓我知道,也許是有其他的方式來實現你想要做的事。

+0

非常感謝您的回答,非常感謝。我將進一步瞭解您發送給我的鏈接,我現在沒有太多時間... 我的意思是不安全的是,正如您可能已經注意到的,這些使用密碼保護vba代碼的方法是非常容易闖入。 我目前正在從數據庫導入數據,所以數據庫IP:端口和ID和PASS在腳本上,這是完全不可接受的。這是內部使用的業務,但你知道......比對不起更安全...... –

+0

我理解編譯和解釋語言之間的差異......但是,直到現在我所做的所有工作都是在VBA中完成的,所以.. 。改變編程代碼的方式將是一件非常乏味的事情......這就是爲什麼我正在考慮在與數據庫的連接部分中創建一個.DLL的可能性,這樣,所有的功能都可以,而UserID和PASSWORD在編譯部分是安全的。我希望我能夠解釋我的問題,以便你能理解我。正如我所說,我會看看你寄給我的鏈接,希望我能得到一個好的結果。如果是的話,我會告訴你! –

+0

是的,當然,我知道你的意思。到目前爲止,我沒有在vba中開發自己的dll。但據我瞭解的鏈接,它應該有可能只是移動你的一部分功能。有可能是你創建了一個類似於代理的dll。我發現下面的帖子可以幫助你[http://stackoverflow.com/questions/3217014/how-to-securely-store-connection-string-details-in-vba](http://stackoverflow.com/questions/3217014/how-to-secure-store-connection-string-details-in-vba) – Stefan

0
using ADODB; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 

namespace HiddenConnectionString 
{ 
[InterfaceType(ComInterfaceType.InterfaceIsDual), 
Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")] 
public interface IMyServer 
{ 
    Connection GetConnection(); 
    void Shutdown(); 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")] 
public class MyServer : IMyServer 
{ 
    private Connection cn; 

    private string cnStr = "Provider=MSDAORA.1;Password=YourPass;User ID=YourID;Data Source=YourServer"; 
    public MyServer() 
    { 

    } 

    public Connection GetConnection() 
    { 
     cn = new Connection(); 
     cn.ConnectionString = cnStr; 
     cn.Open(); 
     return cn; 
    } 

    public void Shutdown() 
    { 
     cn.Close(); 
    } 
} 
} 

你可能會得到這個錯誤...這是因爲InterfaceType的Guid

訪問是(來自HRESULT的異常:0x80070005(E_ACCESSDENIED)) 查看此鏈接的解決方案:

https://social.msdn.microsoft.com/Forums/en-US/26accc30-9cfb-4d86-9c27-780f51929ecb/access-is-denied-exception-from-hresult-0x80070005-eaccessdenied?forum=vsreportcontrols

這是代碼,但我會訪問Stefan建議的鏈接。