【问题标题】:Excel 2016 copy range of cells - range determined by cell results on another sheetExcel 2016 复制单元格范围 - 范围由另一张工作表上的单元格结果确定
【发布时间】:2016-08-19 03:10:09
【问题描述】:

我一直在寻找答案,但找不到合适的答案。

我有一个两页的 Excel 电子表格,我希望在其中添加一个 VBA 宏。第二张表的第 1 列有许多技能,第 2 到 13 列有这些技能的“分数”,每列代表一个月。表 1 有一个表格,其中从下拉列表中选择以下内容:被评分的技能、该人最后一次评估的月份和该人正在接受评估的月份。我已设法显示正在评估的技能的相关“上个月”分数,但现在希望将所有技能的分数从该月的列复制到代表该人正在接受评估的月份的列中。然后,我将用新数据覆盖特定的技能分数。 这是我迄今为止尝试过的......

With Worksheets("Sheet2")
  Range(Cells(2,Sheet1!D17),Cells(Sheet1!D19,Sheet1!D17).Copy Range(Cells(2,Sheet1!D20),Cells(Sheet1!D19,Sheet1!D20)
End With

其中D17包含要复制的列的列号,D19包含计算出来的该列的最后一行,D20包含需要粘贴数据的列的列号。我尝试使用 Sheet2 上的单元格来包含这些值,以防引用 Sheet1 时出现问题但遇到同样的问题。如果我用数字替换变量,它会起作用。

这似乎是在 Cells() 构造中使用变量的问题。请大家指点一下?

我已经尝试了以下方法:

With Worksheets("Sheet1")
  oldMonthCol = Range("D17").Value
  newMonthCol = Range("D20").Value
  lastRow = Range("D19").Value
End With

这些变量在此代码块之前被定义为 Long。然后在前面给出的表达式中使用它们来替换 Sheet1!D17 等。代码可以编译,但是当我查看 oldMonthCol 等的值时,它应该是非零数字时为 0。请问有什么想法吗?

刚刚发现它正在修改 Sheet1,尽管将 Worksheets 设置为 Sheet2...

使用以下方法解决了这个问题:

With Worksheets("Sheet2").Select
  Range(Cells(2,oldMonthCol),Cells(lastRow,oldMonthCol).Copy Range(Cells(2,newMonthCol),Cells(lastRow,newMonthCol)
End With

这仅适用于我在单元格中输入的值,而不是公式的结果。

解决了! 子Button2_Click()

Dim skillName As String
Dim newScore As Long
Dim skillNameRow As Long
Dim oldMonth As String
Dim newMonth As String
Dim oldMonthCol As Integer
Dim newMonthCol As Integer
Dim lastRow As Integer
Dim oldMonthCol2 As Integer
Dim newMonthCol2 As Integer
Dim lastRow2 As Integer
Dim skillNameRow2 As Integer
Dim newSkillValue As Integer


With Worksheets("Sheet1")
  skillName = Range("D3").Value
  skillNameRow = Range("D16").Value
  skillNameRow2 = skillNameRow + 1
  oldMonth = Range("G3").Value
  newMonth = Range("G5").Value
  oldMonthCol = Range("F17").Value
  oldMonthCol2 = oldMonthCol + 1
  newMonthCol = Range("F20").Value
  newMonthCol2 = newMonthCol + 1
  lastRow = Range("F19").Value
  lastRow2 = lastRow + 1
  newSkillValue = Range("F21").Value
End With

With Worksheets("Sheet2").Select

  Range(Cells(2, oldMonthCol2), Cells(lastRow, oldMonthCol2)).Copy     Range(Cells(2, newMonthCol2), Cells(lastRow, newMonthCol2))
  Worksheets("Sheet2").Activate
  Cells(skillNameRow2, newMonthCol2).Select
  ActiveCell.Value = newSkillValue

End With

End Sub

不优雅,但它有效。有一些变量尚未使用,但它们是为将来的添加而设计的......

【问题讨论】:

  • 欢迎来到 SO。到目前为止,您尝试了什么,是什么导致了问题?我鼓励您阅读以下帖子:How do I ask a good question.
  • 请编辑您的帖子,而不是在 cmets 中发布长代码。
  • 很抱歉违反了礼仪。我现在在问题中添加了文本和代码段。谢谢你对我的耐心。问候。
  • 在您的 With 块内,您需要限定像 .Range("D17").Value 这样的范围,否则它假定 ActiveSheet 上的范围可能不是 Sheet1。

标签: excel vba macros


【解决方案1】:

With statement 要求您限定范围/子对象,否则它们不是“与”父对象,在RangeCells 等情况下,将默认为ActiveSheet

您可以看到它的实际效果:

Worksheets("Sheet2").Activate
With Worksheets("Sheet1")
    Debug.Print Range("A1").Parent.Name   '## This will print "Sheet2"
    Debug.Print .Range("A1").Parent.Name  '## This will print "Sheet1"
End With

在您的代码中,然后:

With Worksheets("Sheet1")
  oldMonthCol = .Range("D17").Value
  newMonthCol = .Range("D20").Value
  lastRow = .Range("D19").Value
End With

而且可能:

With Worksheets("Sheet2")
  .Range(.Cells(2,oldMonthCol),.Cells(lastRow,oldMonthCol).Copy .Range(Cells(2,newMonthCol),.Cells(lastRow,newMonthCol)
End With

【讨论】:

  • 谢谢。在我发布我现在工作的代码后,我刚刚看到了你的回复。不像你的那么优雅,但它暂时有效。当我有空的时候,我会用你的解决方案修改它。再次感谢。
  • 干杯,我会修改它,这样你就不需要跟踪哪个工作表是活动的 (which can lead to tons of problems & frustration when trying to debug...) 并且因为你的 With 块没有任何效果,除非你使用范围的. 限定:) 如果这有帮助,请考虑accepting 的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多