VBA-从文本框中自动保存文本

时间:2018-07-30 14:53:23

标签: vba excel-vba textbox

我的工作簿中有一个工作表,将更改记录到另一个工作表中。它不会将更改记录到工作表上的文本框中。我正在尝试添加将在保存时将信息简单保存在文本框中的代码。我尝试使用用于记录其他更改的代码,但是该代码不起作用。我没有任何错误,但是文本也没有保存在单元格中。有人可以让我知道我在做什么错吗?

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim sSheetName As String
Dim Narrative As Object
sSheetName = "1107"
If ActiveSheet.Name <> "LogDetails" Then
    Sheets("LogDetails").Unprotect
    Application.EnableEvents = False
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = "Narraive Box"
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 1).Value = Sheets("1107").Narrative.Text
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 2).Value = Environ("username")
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 3).Value = Now

 Sheets("LogDetails").Columns("A:D").AutoFit
 Application.EnableEvents = True


  End If
End Sub

** edit-该文本框不是ActiveX文本框。只是一个普通的文本框。

**因此,我现在了解为什么没有发生该事件,这是因为“ If ActiveSheet.Name <>“ LogDetails” Then”。当我删除if语句时,大多数代码都可以使用,但是它不会从Narrative文本框中复制文本。当前代码更改如下。一旦我复制了文本框中的东西,我将担心触发事件。

Dim sSheetName As String
Dim logSheet As Worksheet
Dim logRow As Range
Set logSheet = Sheets("LogDetails")
Dim Narrative As Object
sSheetName = "1107"

    logSheet.Unprotect
    Application.EnableEvents = False
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = "Narrative Box"
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 1).Value = Sheets("1107").Shapes("Narrative").TextFrame.Characters.Text
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 2).Value = Environ("username")
    Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 3).Value = Now

 Sheets("LogDetails").Columns("A:D").AutoFit
 Application.EnableEvents = True



End Sub

我的主要问题是我使用的脚本调用的是对象而不是形状。最终的答案很令人困惑,因为其他问题在不同的时间也混在一起(例如,由于文本框中没有信息,所以没有复制信息...对不起)

2 个答案:

答案 0 :(得分:1)

如果您的TextBox是经典的Shape,则可能需要使用Shapes("Narrative").TextFrame.Characters.Text

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim logSheet as Worksheet
    Dim logRow as Range
    Set logSheet = Sheets("LogDetails")
    If ActiveSheet.Name <> "LogDetails" Then
        logSheet.Unprotect
        Application.EnableEvents = False
        Set logRow = Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
        logRow.Value = "Narrative Box"
        logRow.Offset(0, 1).Value = Sheets("1107").Shapes("Narrative").TextFrame.Characters.Text
        logRow.Offset(0, 2).Value = Environ("username")
        logRow.Offset(0, 3).Value = Now
        logSheet.Columns("A:D").AutoFit
        Application.EnableEvents = True
    End If
End Sub

答案 1 :(得分:1)

您是否尝试过使用ActiveX文本框?

您可以尝试这个

Sheets("LogDetails").Range("A" & Rows.Count).End(xlUp).Offset(0, 1).Value = ThisWorkbook.Sheets("1107").TextBox1.Text