2017-08-02 5 views
1

Ich erstelle ein Dokument mit VBA bei der Arbeit (weil das ist das einzige, was ich bei der Arbeit verwenden kann). Meine Variable gibt eine leere Zeichenfolge zurück, nachdem sie festgelegt wurde. Ich versuche, Daten an ein Benutzerformular von einer Methode zu übergeben, die zur Laufzeit dynamisch generiert wird.Öffentliche Variable gibt leere Zeichenfolge zurück

I die Variable, wie dies auf der Oberseite des Thisdocument Modul

Public theName As String 

Dann betreibe ich dies, wenn ein Kontrollkästchen markiert ist

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 

I die Variable theName mit dieser Linie gesetzt theName = myCB.OLEFormat.Object.Name und Stellen Sie sicher, dass es zum Testen mit einer MsgBox eingestellt ist MsgBox theName Diese Nachricht funktioniert einwandfrei. Jetzt ist das Problem, wenn es die Funktion erzeugt, die die Variable leer ist. Irgendwelche Ideen, warum die Variable theName nicht gesetzt bleibt?

+1

Ich habe das Gefühl, dass Ihr '&" uofForm.Tag = theName "&' nur eine gewundene Methode ist, '&" uofForm.Tag = "" "& myCB.OLEFormat.Object.Name &" "" " & '. (Meine Vermutung, warum Ihre Variable nicht gesetzt ist, ist, dass einige Änderungen an Code-Reset-Variablen, so dass Ihre Code-Addition wahrscheinlich die Ursache ist. Sie könnten versuchen, die 'theName = myCB.OLEFormat.Object.Name'-Zeile nach Ihnen zu verschieben Aktualisieren Sie den Code und sehen Sie, was passiert.) – YowE3K

Antwort

2

Sie fügen dem Modul selbe zur Laufzeit eine Subroutine dynamisch hinzu. Dadurch wird ein Zurücksetzen des Projekts ausgelöst - Beenden des Programms und Löschen aller Variablen.

Wenn Sie versuchen, manuell eine Prozedur zu einem laufenden Modul (im Debug-Modus) hinzufügen, werden Sie diese Warnung erhalten:

enter image description here

Aber bekommt man nicht diese Warnung, wenn Sie den Code programmatisch Hinzufügen .

In jedem Fall fügen Sie dem Modul ThisWorkbook das Verfahren hinzu, wenn Sie es wahrscheinlich dem Modul des Arbeitsblatts hinzufügen möchten, auf dem das Steuerelement gehostet wird.

+0

Wie können Sie dann Daten speichern, wenn Sie die Prozedur zur Laufzeit hinzufügen? –

Verwandte Themen