我一直在为我的客户做一个独立的项目。他们希望生成一个按钮,用户点击后,它会打开一个用户表单并提供各种与宏相关的选项:下拉列表,复选框,选项选择按钮等。 / p>
我创建了一个测试公式并将其提交给客户端;他们彻底享受了它,并决定给我发送一份文件'copy& amp;将我的原始代码粘贴到他们的Excel文件中。
问题是;因为我对VBA缺乏经验我遇到了一个问题,一旦我点击按钮 - 用户表单就不显示了。
下面是我创建的原始文件的Dropbox链接及其原始代码;以及我想要复制的文件。
任何帮助都会受到欢迎和赞赏。
链接到Dropbox:https://www.dropbox.com/sh/l1t37lz8uritrua/AAAdWPGvw0GDZ6hW4SwmbBdRa?dl=0
答案 0 :(得分:0)
OriginalProject.xlsm有一个名为 honor_roll_form 的表单,其中包含100行代码。
CopyOfOriginal.xlsm有一个名为 UserForm1 的表单,其中不包含任何有用的代码。
我不相信有任何方法可以将用户表单从一个工作簿直接复制到另一个工作簿。代替
当我尝试点击“Honor Roll”按钮时,我得到了project1Box的“找不到方法或数据成员”。我将在晚餐后(18:57在这里)进行调查,除非你告诉我你已经知道我为什么会收到这个错误。
响应OP的请求的额外评论
现在已经很晚了,但我已经开始在第二个CopyOfOriginal.xlsm中向下查看sub execute_button_Click。即使它与宏的不执行没有直接关系,我也会评论我所看到的内容。
如果打开VB编辑器并在左侧看,您将看到Project Explorer。在顶部附近你会看到:
Microsoft Excel Objects
Sheet1 (Sheet1)
我总是发现这令人困惑。第一个“Sheet1”是Excel的工作表ID,无法更改。第二个“Sheet1”是可以更改的工作表的默认名称。您可以撰写Sheet1.Range("A1")
或Worksheets("Sheet1").Range("A1")
。即:您可以通过其ID或其名称引用工作表。您已将Worksheet类型的变量命名为Sheet1。使用Excel的名称作为变量名称会导致奇怪的错误,因此避免做这样的事情很重要。
最好始终使用有意义的名称。目前,您知道Sheet1的含义,但如果您在六到十二个月内回到此宏,您会记得吗?我会像你一样使用变量,但我会把它命名为WshtCis208或WshtVBAProg或类似的东西。
Set ID = Range(Sheet1.Cells(2, 1), Sheet1.Cells(52, 1))
可以写成:
With WshtCis208
Set ID = Range(.Cells(2, 1), .Cells(52, 1))
End With
使用With statements
会产生更快的代码,而且几乎总是代码更容易阅读。
“52”是此表的当前底行。你每次添加或删除学生时都会为他们修改宏吗?有几种技术可以找到最后一行,在任何情况下都不是完美的。大多数时候最方便的技术是:
Const ColCis208Id as Long = 1
Const ColCis208MidTermExam as Long = 5
Dim RowCis208Last as Long
RowCis208Last = .Cells(.Rows.Count, ColCis208Id).End(xlUp).Row
目前,第1列是Id列。 Id列可能不会移动,但当某些新列被识别为有用时,其他一些列很可能会移动。在添加Project3列时,是否要扫描代码以尝试确定哪些5引用MidtermExam列?
常量允许您命名可能更改的文字。它使您的代码更易于阅读,并在值发生变化时节省太多痛苦。
.Rows.Count
为当前版本的Excel提供工作表中的行数,因此.Cells(.Rows.Count, ColCis208Id)
标识第1列的底部单元格。End(xlUp).Row
表示直到您点击一个单元格为止一个值并返回其行号。 VBA相当于 Ctrl + Up 。
下一个语句subjectCount = …
失败,因为表单上不存在projectBox。您已更改了标题,但未更改名称。
据我所知,表单无法执行,因为您已经开始更新但尚未完成。