2013-01-25 91 views
2

我有大約數千個Excel(xls,舊格式)文件分佈在硬盤上的許多文件夾中。這些文件具有連接到數據庫的相同宏。宏包含連接字符串。宏受密碼保護,但幸運的是我知道密碼。以編程方式在Excel中更改宏文本

問題:在所有文件中的宏中更改連接字符串的最佳方法是什麼?

我有使用NPOI創建/修改xls文件的經驗。我已經看到Interop庫解鎖受密碼保護的Word文件並進行一些編輯。但是我從來沒有見過在Excel文件中編程改變宏文本的例子。這甚至有可能嗎?

p.s.編寫代碼時我沒有問題。問題是選擇正確的工具。

+2

我不會輸入此作爲答案,因爲我沒有時間投入工作以提高質量,但如果您在此處閱讀我的答案,可能會給您一些建議:http ://stackoverflow.com/questions/14491613/can-i-evaluate-an-excel-vb-constant-that-is-in-string-format/14492230#14492230 – mkingston

+0

這是一個很好的起點!謝謝! – trailmax

+0

沒有問題,祝你好運:)。如果你真的陷入困境,請在這裏給我評論一下,當我有機會的時候,我會對它進行破解。聽起來你可能會自己得到它,雖然! – mkingston

回答

3

您可能需要使用以下代碼作爲起點。此代碼使用COM Interop來提取VBA腳本並執行查找替換。我用一個非常基本的腳本在密碼保護的電子表格上嘗試了這一點,它運行良好。無可否認,這是基本的,但你可能能夠提取你所需要的東西。

string filename = "Test.xls"; 
string password = "password"; 

Excel._Application app = new Excel.Application(); 
Excel._Workbook workbook = app.Workbooks.Open(Filename: filename, Password: password); 

if (workbook.HasVBProject) 
{ 
    VBProject project = workbook.VBProject; 

    foreach (VBComponent component in project.VBComponents) 
    { 
     if (component.Type == vbext_ComponentType.vbext_ct_StdModule || 
      component.Type == vbext_ComponentType.vbext_ct_ClassModule) 
     { 
      CodeModule module = component.CodeModule; 

      string[] lines = 
       module.get_Lines(1, module.CountOfLines).Split(
        new string[] { "\r\n" }, 
        StringSplitOptions.RemoveEmptyEntries); 

      for (int i = 0; i < lines.Length; i++) 
      { 
       if (lines[i].Contains("A1")) 
       { 
        lines[i] = lines[i].Replace("A1", "D1"); 
        module.ReplaceLine(i + 1, lines[i]); 
       } 
      } 
     } 
    } 
} 

workbook.Save(); 
workbook.Close(); 
app.Quit(); 
+0

感謝代碼Brett。我自己有點差不多了。現在遇到了麻煩,只要我嘗試訪問project.VBComponents,我就會得到異常「自從項目受到保護後無法執行操作」。 VBA受保護,而不是xls文件。這些是不同的。目前正在研究這些問題的解決方法。 Application.SendKeys()似乎是唯一可能的解決方案。 – trailmax

+0

SendKeys()看起來是一個潛在的可行解決方案。您可能還想嘗試第三方宏程序。 AutoHotKey對我來說是一個巨大的生產力推動器,我毫不懷疑它可以用來有效地自動化這個過程。 –

相關問題