使用工作表似乎不会更改不同工作表上的单元格值

With Worksheets does not seem to change cell values on different sheets

我有在模块中编写的宏。我还有用户表单来收集用户输入并在同一工作簿的两个不同工作表上填充某些单元格。

在我声明的模块中的一个潜艇中:

Dim wsAssemblyBOM As Worksheet
Set wsAssemblyBOM = Worksheets("Assembly BOM")

Dim wsDocuments As Worksheet
Set wsDocuments = Worksheets("Documents")

HeaderInfoUserForm.Show

这将打开我的用户表单,一切似乎都按计划进行,直到我们使用“确定”按钮功能:

Private Sub OK_Button_Click()

With wsAssemblyBOM
   Cells(2, 3) = Author.Value
   Cells(2, 5) = Title.Value
   Cells(2, 7) = SubCode.Value
   Cells(2, 6) = DateText.Value

   Version = BOMVersion.Value
End With

With wsDocuments
   Cells(2, 3) = Author.Value
   Cells(2, 5) = Title.Value
   Cells(2, 7) = SubCode.Value
   Cells(2, 6) = DateText.Value
End With

End Sub

这只会填充活动表中的单元格。我在这里有点困惑,因为网络中的所有示例都表明这应该有效。我也尝试在 "Cells" 前面添加点,但它只给出错误。

我做错了什么?

我也对何时以点开头或不以点开头感到困惑。例如:

With wsDocuments
   .Cells(2, 3) = Author.Value
   .Cells(2, 5) = Title.Value
   .Cells(2, 7) = SubCode.Value
   .Cells(2, 6) = DateText.Value
End With

这会报错"Object Required"。 Cells 是工作表的一个对象,但错误在于我试图为 .cells 赋值,这实际上不是单元格内容的位置?没有点是指单元格的实际内容吗?只是猜测..

类似的地方多次使用点。我不清楚逻辑。 工作代码示例:

 With FormatRange.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .ColorIndex = xlAutomatic
    .TintAndShade = 0
    .Weight = xlMedium
End With

你写了,

With wsAssemblyBOM
   Cells(2, 3) = Author.Value
   Cells(2, 5) = Title.Value
   Cells(2, 7) = SubCode.Value
   Cells(2, 6) = DateText.Value

   Version = BOMVersion.Value
End With

应该是,

With wsAssemblyBOM
   .Cells(2, 3) = Author.Value
   .Cells(2, 5) = Title.Value
   .Cells(2, 7) = SubCode.Value
   .Cells(2, 6) = DateText.Value

   Version = BOMVersion.Value
End With

请注意将 wsAssemblyBOM 父引用传递到每个 .Cell 的前缀 .。假设 wsAssemblyBOM 和 wsDocuments 已被声明并设置为工作 sheet 并且它们可用于 OK_Button_Click private sub 那么你应该没有问题。

你的最后一个例子,

With FormatRange.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .ColorIndex = xlAutomatic
    .TintAndShade = 0
    .Weight = xlMedium
End With

...等同于说,

FormatRange.Borders(xlEdgeTop).LineStyle = xlContinuous
FormatRange.Borders(xlEdgeTop).ColorIndex = xlAutomatic
FormatRange.Borders(xlEdgeTop).TintAndShade = 0
FormatRange.Borders(xlEdgeTop).Weight = xlMedium

冗长的方法也较慢,因为 FormatRange.Borders(xlEdgeTop) 必须解析四次。

将 Option Explicit 放在每个代码的顶部 sheet。

在你的问题中,你说 在我声明的模块中的一个子项中: 然后你为你的工作表声明了 2 个变量:

Dim wsAssemblyBOM As Worksheet
Set wsAssemblyBOM = Worksheets("Assembly BOM")

Dim wsDocuments As Worksheet
Set wsDocuments = Worksheets("Documents"

这些变量仅在该子程序中可用。如果你想在多个潜艇上使用它们(比如 Private Sub OK_Button_Click()),你必须在模块中将变量定义为 Public。

所以在你的模块中,在顶部,你必须有:

Option Explicit

Public wsAssemblyBOM As Worksheet
Public wsDocuments As Worksheet

像这样:

现在这两个变量都可以在您项目的任何子项目中使用,因此您的代码应该可以正常工作。确保将它们分配给正确的工作表。一旦你设置了它们,你不需要再做一次,除非你用 Set MyVariable = Nothing.

清空它们

所以你的代码应该是这样的:

Private Sub OK_Button_Click()

Set wsAssemblyBOM = Worksheets("Assembly BOM")
Set wsDocuments = Worksheets("Documents")

With wsAssemblyBOM
   .Cells(2, 3) = Author.Value
   .Cells(2, 5) = Title.Value
   .Cells(2, 7) = SubCode.Value
   .Cells(2, 6) = DateText.Value
   Version = BOMVersion.Value
End With

With wsDocuments
   .Cells(2, 3) = Author.Value
   .Cells(2, 5) = Title.Value
   .Cells(2, 7) = SubCode.Value
   .Cells(2, 6) = DateText.Value
End With

Set wsAssemblyBOM = Nothing
Set wsDocuments = Nothing

End Sub

根据您的需要进行调整