Excel 2016复制单元格范围 - 范围由另一个工作表上的单元格结果确定

时间:2016-08-18 13:07:09

标签: excel vba macros

我已经找到了答案,但找不到合适的答案。

我有一个两张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,尽管将工作表设置为Sheet2 ...

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

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

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

解决!     Sub 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

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

1 个答案:

答案 0 :(得分:0)

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