我需要查看一个工作表,该工作表的 X 列中的任何值的行数都是可变的。如果 X 列中有一个值,Y 列中应该有一个值。如果 Y 列为空,我需要将 N 列中同一行的值复制到 Y 列中的空白处。然后我需要从 Z 列中的日期减去 Y 列中的日期以获得以月数为单位的术语。我一直在努力解决这个问题的语法,甚至无法接近。非常感谢您的帮助。
Sub Test()
Dim i As Integer
NumRows = Range("N2", Range("N2").End(xlDown)).Rows.Count
Range("X2").Select
For i = 1 To NumRows
If Cells(1 + X, 1) <> "" Then
Cells(1 + n, 1).Select
Selection.Copy
Range("Y").PasteSpecial Paste:=xlPasteValues
ActiveCell.Offset(1, 0).Select
Next
End If
End Sub
** 我希望将 N 列中的值复制到 Y 列,其中 X 列中有一个值
If Cells(1 + X, 1) <> "" Then
您正在引用一个名为
X
的变量,而不是工作簿中的列。由于您尚未设置 X
,该值只是 0
,因此这本质上是在说 Cells(1, 1)
,即工作表中的 A1
。
此外,当您使用
For i = 1 To NumRows
创建循环时,您会为循环的每次迭代分配变量 i
来保存 1
和 NumRows
之间的数字,但您没有在中使用变量 i
你的代码。
此外,你在
If
循环内启动了一个 For
块,这是 100% 的光明正大;但是,您在 If
循环之外结束了 For
块。这没有道理。 For
循环内部的代码一遍又一遍地运行,因此End If
必须位于导致Next
循环的For
行的“内部”(物理上位于上方)。正确缩进代码将有助于在编写代码时揭示这些问题。
最后(虽然这可能不会导致问题,但这是一种代码味道),您正在使用
.Select
物理选择正在运行代码的单元格。人类的.Select
,但你的代码不需要。如果您有兴趣阅读更多相关内容,请查看 this stackoverflow Q&A
考虑一下:
Sub Test()
Dim i As Integer
NumRows = Range("N2", Range("N2").End(xlDown)).Rows.Count
For i = 1 To NumRows
'Using `Range()` object instead of `Cells` so we can refer to the column letter directly
If Range("Y" & i) <> "" Then
#copy the cell from column `N` for this `i` row to column `Y`
Range("N" & i).Copy
Range("Y" & i).PasteSpecial Paste:=xlPasteValues
End If
Next
End Sub