2015-10-04 42 views
0

我曾經在幾個項目中工作過,現在我被MS Excel和MS Access難住,我無法在設計視圖中使用VBA來操作對象。它們是非常簡單的任務,例如在MS Excel中更改用戶窗體上的標籤名稱,或者將新的文本框添加到MS Access中的報表中,但它們似乎是不可能的,因爲任何宏只會在激活所述用戶窗體或報表時使用,所以一切都是在運行時完成的。在設計視圖中操作對象

要專注於一個,在MS Excel中,我希望能夠運行一個代碼,它將遍歷我的用戶窗體上的所有標籤,並將它們從「Label1」,「Label2」等重命名爲「Lbl1 「,」Lbl2「等等,但是我不能只是點擊一個按鈕來運行一個用戶表單的設計上的一個宏,它會遍歷所有的標籤並更改他們的名字。如果我能夠做到這一點,那麼我可以對我的其他運行時代碼更有效率。沒有它,我可以選擇重命名我擁有的每一個標籤,但有近100個標籤,我希望通過VBA來實現,因爲我已經可以看到知道如何在這些設計視圖中運行代碼非常有用Visual Basic元素。

請你能建議是否有可能在設計視圖中操作這些VB對象?

回答

0

您可以從普通模塊運行代碼來更改用戶窗體的設計。您必須在信任中心設置中擁有對VBA項目的信任訪問權限。然後,它只是使用相關VBComponentDesigner財產的問題:

Sub foo() 
    Dim ctl     As MSForms.Control 
    Dim lCounter    As Long 

    lCounter = 1 

    For Each ctl In ThisWorkbook.VBProject.VBComponents("Userform1").Designer.Controls 
     If TypeName(ctl) = "Label" Then 
      ctl.Name = "lbl" & lCounter 
      lCounter = lCounter + 1 
     End If 
    Next ctl 
End Sub 

當您運行此表格必須不會被加載。

+0

非常好,謝謝你Rory! – Sammir

1

不,這是不可能的。如果您的設計人員在即時窗格中打開Form1並鍵入Form1.Show,則VBE將在設計窗體之前關閉設計器。就是那樣子。

現在,如果您有標籤Label1Label2Label3,您有我喜歡稱之爲無意義的標識符。將它們重命名爲Lbl1Lbl2Lbl3會使事情變得更糟。

如果你在代碼中的任何地方引用它們,重命名它們將會破壞你的代碼。更糟糕的是,按鈕或其他事件與您正在處理的事件有關:重命名Button1Btn1將不會將Button1_Click()過程重命名爲Btn1_Click()

使用有意義的名稱。如果Label1正坐在文本框頂部,我不知道,一些用戶名,然後將其命名爲lblUserNameUserNameLabel。使用有意義的名字總是。

我寫了一個重構工具,用於重命名事件,它處理事件處理程序和許多其他事情;您可以在代碼中右鍵單擊對Label1的引用,從上下文菜單中選擇Refactor > Rename,輸入一個新名稱,然後該工具將重命名所有引用以及控件本身。有問題的工具叫做Rubberduck,它的作用不僅僅是讓你重命名一些東西。

如果代碼中沒有引用標籤,那麼它們不需要名稱。何必?

+0

你好馬特,我明白給所有控件有意義的名字是最好的做法,但在這種情況下,我實際上會使用我的代碼中的單詞「標籤」後面的數字。例如:Controls(「Label」&i&j).caption = ...因爲它會使整個過程對我所做的更有效。我對你不能在設計階段使用代碼編寫感到失望,我認爲這會對我能夠處理事情的速度產生巨大影響。 – Sammir

+0

@Sammir或者您可以放棄設計階段並在運行時生成UI。 –