【问题标题】:Excel VBA: how to reference a worksheet from a form method's code?Excel VBA:如何从表单方法的代码中引用工作表?
【发布时间】:2018-12-04 13:56:12
【问题描述】:

我有一个包含 3 个文本框和一个按钮的表单。 Button 有一个“Click”事件处理程序,代码如下:

编辑:按照 Darren Bartrup-Cook 的建议,我删除了所有 Select 和 Active 调用,但这没有帮助。

Sheets("__TEMPLATE").Copy After:=Sheets(Sheets.Count)

Dim ws As Worksheet
Dim size As Integer

Set ws = Sheets(Sheets.Count)

ws.Range("B1:B1").FormulaR1C1 = Me.tbName
size = Me.tbSize

Dim cSize As Range
Set cSize = ws.Range("B2:B2")

cSize.Formula = Me.tbSize

cSize.NumberFormat = "General"
cSize.Value = cSize.Value

If Me.tbIndex.TextLength > 0 Then

    ws.Range("B3:B3").FormulaR1C1 = Me.tbIndex

End If

ActiveWindow.ScrollRow = 1
ws.Name = Me.tbName

ws.Range("A" & (size + 6) & ":G1005").Delete

Unload Me

预期的操作是复制模板表并使用第二个文本框中的数字调整表格大小(没有真正的表格,只有一系列类似表格的格式化行)。它还将文本框的值复制到单元格 B2 和 B3。

问题在于它并非每次都有效;有时它只是复制模板并停止;其他时候它可能会抛出指出 Worksheets().Select 方法的错误消息;

Sheets().Select 和 Workbook().Worksheets().Select 符号产生相同的结果。

谁能告诉我从表单方法的代码中引用工作表的正确方法是什么?

谢谢!

【问题讨论】:

  • 避免使用Select、Active 和所有这些口香糖。我认为这是您可以通过阅读得到的答案:how-to-avoid-using-select-in-excel-vba。我冒险的主要问题是您假设在运行代码之前选择了正确的单元格、工作表和工作簿。
  • 我已将工作表分配给一个变量,结果成功了;但是,对于范围而言,情况并非如此。请问对此有什么建议吗?谢谢。
  • 您是否收到任何错误消息?文本框中的值是什么(tbSize、tbIndex 和 tbName)?

标签: excel vba


【解决方案1】:

我可能会这样做:

Private Sub CommandButton1_Click()

    Dim ws As Worksheet

    With ThisWorkbook
        .Sheets("__TEMPLATE").Copy After:=.Sheets(.Sheets.Count)
        Set ws = .Sheets(.Sheets.Count)
    End With

    With ws
        .Name = Me.tbName
        .Range("B1") = Me.tbName
        .Range("B2") = CLng(Me.tbSize)
        .Range("B3") = CLng(Me.tbIndex)
        .Range(.Cells(CLng(Me.tbSize) + 6, 1), .Cells(1005, 7)).Delete Shift:=xlUp
    End With

    Unload Me

End Sub  

您应该检查tbName 是否包含可用作sheet name 的值,并且该名称尚未被使用。还要检查其他两个文本框是否有 numeric values。

如果您只是向单元格添加值,则可以使用wd.Range("A1") = Me.tbName。添加公式类似于ws.Range("B4").Formula = "=SUM(B2:B3)"。

文本框中的值只是文本,但您可以在放置到工作表之前更改它们的type。

您可以使用Cells 代替Range 来使用行号和列号标识单个单元格(如果您要计算范围,则更容易)。所以Cells(1005, 7) 与Range("G1005") 相同。如果您将两个Cells 放在Range 中,您将引用开始和结束单元格之间的所有单元格-.Range(.Cells(CLng(Me.tbSize) + 6, 1), .Cells(1005, 7)) 与.Range("A" & (size + 6) & ":G1005") 相同。

我还添加了With...End With,它减少了我必须输入的工作表引用的数量。

【讨论】:

  • 您好,Darren,它确实复制了 __TEMPLATE 表,仅此而已。没有错误消息,什么都没有。这些值都很好,它们实际上是由文本框自己的事件处理程序过滤的。我开始相信引用不是这种行为的根本原因。
  • 那我不确定。代码中的Sheets(Sheets.Count) 之类的代码只会查看活动工作簿,但如果它正在复制工作表,则正确的工作簿处于活动状态。如果您使用 F8 单步执行代码会怎样?
猜你喜欢
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多