2017-08-02 114 views
1

我在工作中使用VBA創建文檔(因爲這是我可以在工作中使用的唯一東西)。設置後,我的變量返回一個空字符串。我試圖從一個方法帽傳遞數據給用戶窗體,這個方法帽是在運行時動態生成的。公共變量返回空字符串

我設置變量,像這樣在內的ThisDocument模塊的頂部

Public theName As String 

然後我運行此當複選框被選中

With tblNew 
    '.Cell(Row:=rowCount, Column:=2).Merge MergeTo:=.Cell(Row:=rowCount, Column:=3) 
    .Rows(rowCount).SetHeight RowHeight:=InchesToPoints(0.35), HeightRule:=wdRowHeightExactly 
    .Cell(Row:=rowCount, Column:=1).SetWidth ColumnWidth:=InchesToPoints(0.75), RulerStyle:=wdAdjustNone 
    .Cell(Row:=rowCount, Column:=2).SetWidth ColumnWidth:=InchesToPoints(2.08), RulerStyle:=wdAdjustNone 
    .Cell(Row:=rowCount, Column:=3).SetWidth ColumnWidth:=InchesToPoints(1), RulerStyle:=wdAdjustNone 
    .Cell(Row:=rowCount, Column:=4).SetWidth ColumnWidth:=InchesToPoints(2), RulerStyle:=wdAdjustNone 
    .Cell(Row:=rowCount, Column:=5).SetWidth ColumnWidth:=InchesToPoints(1.85), RulerStyle:=wdAdjustNone 
    .Cell(rowCount, 1).Range.InsertAfter "Name:" 
    .Cell(rowCount, 3).Range.InsertAfter "Type:" 
    .Cell(rowCount, 2).Range.InlineShapes.AddOLEControl ClassType:="Forms.TextBox.1" 
    Set myCB = .Cell(rowCount, 4).Range.InlineShapes.AddOLEControl(ClassType:="Forms.TextBox.1") 
     Dim uofCode As String 
     Dim doc As Word.Document 

     Set doc = ActiveDocument 

     theName = myCB.OLEFormat.Object.Name 
     MsgBox theName ‘this message works fine 
      uofCode = "Private Sub " & myCB.OLEFormat.Object.Name & "_GotFocus()" & vbCrLf & _ 
      vbCr & "Load uofForm" & vbCr & "uofForm.Tag = theName" & vbCr & "uofForm.Show" & vbCr & vbCrLf & _ 
      "End Sub" 
      doc.VBProject.VBComponents("ThisDocument").CodeModule.AddFromString uofCode 

      End With 

我設置變量theName與此線theName = myCB.OLEFormat.Object.Name和確保它設置爲使用MsgBox進行測試MsgBox theName此消息正常工作。現在問題是當它生成變量爲空的函數時。任何想法爲什麼變量theName沒有設置?

+1

我有一種感覺,你的'&「uofForm.Tag = theName」&'只是一種複雜的方式來實現'&「uofForm.Tag =」「」&myCB.OLEFormat.Object.Name&「」「」 &'。 (我的猜測是爲什麼你的變量沒有保持設置是因爲代碼重置變量的一些變化,所以你的代碼添加可能是原因,你可以嘗試在你後面移動'theName = myCB.OLEFormat.Object.Name'行更新代碼並查看會發生什麼。) – YowE3K

回答

2

您在運行時動態地將子例程添加到相同的模塊。這將觸發項目重置 - 結束程序執行,並清除所有變量。

如果您嘗試手動添加到正在運行的模塊的情況(在調試模式下),你會得到這樣的警告:

enter image description here

但程序添加代碼,當你沒有得到警告。

在任何情況下,您都可以將過程添加到ThisWorkbook模塊,但您可能希望將其添加到託管控件的工作表的模塊中。

+0

那麼如果您在運行時添加過程,那麼如何存儲數據? –