VBA导致键入的信息转到不正确的工作表

时间:2015-12-17 09:47:09

标签: excel vba excel-vba

我正在创建一个电子表格,在第一张工作表上创建一个参考号(称为数据库,与数据库类似),并生成一个新的工作表。然后,它会在新工作表上提供一个参考编号,以便它们链接在一起。这是通过按下" New Idea"在UserForm上。

一旦完成,它应该转到新创建的工作表并突出显示单元格C7。一旦完成,它应该关闭UserForm并允许用户在新工作表上键入单元格C7,而无需进一步的步骤。

如果我使用F8来完成整个过程,这样可以正常工作,但如果我关闭代码窗口并按用户运行整个过程,它将无法正常工作。

C7会突出显示,但是一旦输入并按下回车键进入下面的单元格,您输入的内容就会完全消失,而您在新生成的工作表上键入的内容实际上是在另一个工作表中输入的。< / p>

我有一个单独的工作表,其中包含一个用于打开UserForm的按钮,并且在新生成的工作表上输入的所有数据都不正确地转到此工作表。

我的代码如下,并且都在UserForm的代码中。我在下面留下了ComboBox代码,但这与新工作表的生成无关。所有这一切都是列出创建的选项卡,以便用户可以从UserForm中选择一个工作表,然后直接转到那里,而不必向侧面滚动。

我正在使用Excel 2013.我绝不是VBA的老手,所以任何帮助都将不胜感激!

谢谢!

Private Sub UserForm_Initialize()
  Me.ComboBox1.List = Worksheets("Database").Range("A2:A10000").Value
End Sub

Private Sub CreateNewIdea_Click()
  CopySheet
End Sub

Sub CopySheet()
  Dim LastRow As Long
  NewReference
  LastRow = Sheets("Database").Range("A" & Rows.Count).End(xlUp).Row - 1
  ReturnValue = LastRow
  Sheets("Idea Template").Copy After:=Sheets(Sheets.Count)
  ActiveSheet.Name = LastRow
  Range("C3").Value = LastRow
  Me.ComboBox1.List = Worksheets("Database").Range("A2:A10000").Value
  Range("C7").Select
  Unload Home
End Sub

Sub NewReference()
  Dim LastRow As Long
  LastRow = Sheets("Database").Range("A" & Rows.Count).End(xlUp).Row
  Sheets("Database").Cells(LastRow + 1, "A").Value = Sheets("Database").Cells(LastRow, "A").Value + 1
End Sub

Private Sub ComboBox1_Change()
  Worksheets(ComboBox1.Text).Select
End Sub

1 个答案:

答案 0 :(得分:1)

我已经冒昧地编辑和重写您编写的代码,以获得更大的灵活性。

Get-SPWeb -Site http://sitename/sites/site1

修订答案

在查看@tomjo提供的文档并尝试重新解决问题之后,我发现问题是由工作表上的按钮引起的。使用的按钮是表单控件而不是ActiveX控件。

将宏指定给表单控件宏已在模块中定义为您所期望的。宏仅调用以显示相关表单。看起来所选的工作表,无论是通过表单上的菜单还是从表单创建新工作表后都没有被正确激活,并且显示的工作表中输入的信息实际上是以上次手动的形式输入的选择。单步执行代码后,通过Option Explicit 'Forces the variable to be declared, undeclared variables are not allowed Dim DatabaseTable As ListObject 'Makes the variable usable for the entire module Dim Lastrow As Long Private Sub UserForm_Initialize() Set DatabaseTable = ThisWorkbook.Worksheets("Database").ListObjects("References") 'I'm assuming you've formatted the data on the worksheet as a table and named the table "References" Dim i As Long Dim DatabaseRows As Long DatabaseRows = DatabaseTable.ListRows.Count With Me.ComboBox1 .Value = Empty .Clear For i = 1 To DatabaseRows .AddItem DatabaseTable.DataBodyRange(i, 1) Next i End With End Sub Private Sub CreateNewIdea_Click() Set DatabaseTable = ThisWorkbook.Worksheets("Database").ListObjects("References") Call CopySheet End Sub Sub CopySheet() 'Are you calling Sub CopySheet() from other subs besides Private Sub CreateNewIdea_Click()? Call NewReference Dim ReturnValue As Long 'I'm declaring this variable because I'm using the option explicit and that doesn't allow undeclared variables ReturnValue = Lastrow 'Unless ReturnValue is a public variable, it's not doing much here. ThisWorkbook.Worksheets("Idea Template").Copy After:=ThisWorkbook.Worksheets(Worksheets.Count) ThisWorkbook.Worksheets("Idea Template (2)").name = Lastrow ThisWorkbook.Worksheets(CStr(Lastrow)).Cells(1, 3).Value = Lastrow 'Cstr(lastrow) is needed because we want the sheet with the name of the last row, not the nth sheet which is what happens with WorkSheets(Lastrow) as lastrow is a number Call UserForm_Initialize 'Calls the procedure which fills ComboBox1, if the unload home refers to this form, then this line is redundant since the combobox is filled again when the form is initialized. ThisWorkbook.Worksheets(CStr(Lastrow)).Cells(7, 3).Select Unload Home 'If the name of this form is home, you can just 'Unload Me' End Sub Sub NewReference() 'Are you calling Sub NewReference from other subs besides Sub CopySheet()? DatabaseTable.ListRows.Add AlwaysInsert:=False 'Adds a new row to the table on the worksheet "Database" Lastrow = DatabaseTable.ListRows.Count If Lastrow = 2 And IsEmpty(DatabaseTable.DataBodyRange(1, 1)) Then 'This if determines if a row was added while the first row does not contain a reference DatabaseTable.DataBodyRange(Lastrow, 1).Value = 1 'First reference, can be anything you want really DatabaseTable.ListRows(1).Delete 'First row is deleted, otherwise you'd have an empty first row Lastrow = Lastrow - 1 Else DatabaseTable.DataBodyRange(Lastrow, 1).Value = DatabaseTable.DataBodyRange(Lastrow - 1, 1) + 1 End If End Sub Private Sub ComboBox1_Change() If Not Me.ComboBox1 = Empty Then Worksheets(CStr(Me.ComboBox1)).Select End If End Sub 通过表单选择后,我发现正确的工作表和单元格处于活动状态。我没有发现原因,当正确的工作表和单元格处于活动状态时,信息输入到上一个手动选择的工作表和单元格中。

要验证问题不是由文件引起的,我试图用一个全新的文件重现问题。同样出现问题的是,当屏幕显示正确的纸张和单元格时(通过表单选择,由模块中的子程序调用,由表单控件调用),信息实际上输入到最后一个手动选择的工作表和单元格中

---- ----编辑

从功能区的开发人员选项卡下的“宏”按钮运行Showform宏(调用要显示的表单),而不是单击分配了ShowForm宏的“表单”控件按钮,不会创建问题。

----编辑结束----

然后我只删除了Form控件,并调用模块中的sub来显示表单,并在工作表和相关的Sheet模块上创建了一个ActiveX控件(CommandButton):

Debug.Print ThisWorkbook.ActiveSheet.Name, ThisWorkbook.ActiveSheet.ActiveCell.Address

不再进一步编辑代码,在最后一个手动选择的工作表和单元格中输入的信息没有进一步的问题,而不是屏幕显示为选中的工作表和单元格。

Edited file(该链接将在限定时间内有效)