Excel VBA代码理解
我试图build立一个基于Excel的input表单,我发现了一些在线,我试图了解这些代码:
Dim Hsheet,Isheet As Worksheet Dim NextRow, oCol As Long Dim MyRng, MyCell As Range Dim MyCopy, ClearCells As String Set Hsheet = Worksheet("InputForm") Set ISheet = Worksheet("Database")
这是我不明白的部分,有人可以向我解释一下吗?
With Hsheet nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row End With
With Isheet Set myRng = .Range(MyCopy) If Application.CountA(myRng) <> myRng.Cells.Count Then MsgBox "Please fill in all the cells!" Exit Sub End If End With
还有这个部分,有人可以向我解释一下吗?
With Hsheet .Cells(nextRow, "a").Value = Application.UserName oCol = 1 For Each myCell In MyRng.Cells Hsheet.Cells(NextRow, oCol).Value = myCell.Value oCol = oCol + 1 Next myCell End With
提前致谢 :)
With Isheet On Error Resume Next With .Range(ClearCells).Cells.SpecialCells(xlCellTypeConstants) .ClearContents Application.Goto .Cells(1) ', Scroll:=True End With On Error GoTo 0 End With
你的一段代码似乎做了从一张到另一张的一些副本,在一个范围之上添加用户名。
然而,stringvariablesMyCopy
似乎没有被初始化,因此我不认为运行这个macros会产生任何想要的结果(除非Range
函数返回一些空string调用的单元格吗?我不知道它的规格)。
我不完全记得Excel VBA,但我认为:
Cells(.Rows.Count, "A")
select位于最后一行“A”列的单元格。
End(xlUp)
将select移动到连续的非空单元格范围的顶部(例如,按下Excel中的CTRL + UP
,我想)。
Offset(1, 0)
将选区移动到一个单元格的底部。 Row
返回单元格的行号。
因此,您的第一个代码块将列A中非空单元格的最后一个范围的第二行的行号设置为variablesnextRow
。
你可以遵循相同的推理来理解所有其他代码块的目的。 我build议您searchMSDN的VBA for Excel文档网站,以获取有关您不了解的每个function的含义的更多信息。
我可以解释一下代码的function,但是我想提到的东西有几个:)
一个
Dim Hsheet,Isheet As Worksheet Dim NextRow, oCol As Long Dim MyRng, MyCell As Range Dim MyCopy, ClearCells As String
这不是正确的方法来声明variables/对象例如,如果你考虑这一行是
Dim Hsheet,Isheet As Worksheet
在这里,只有Isheet
被声明为工作表而不是Hsheet
。 Hsheet
自动变成一个变体 。 正确的方法是
Dim Hsheet As Worksheet, Isheet As Worksheet Dim NextRow As Long, oCol As Long Dim MyRng As Range, MyCell As Range Dim MyCopy As String, ClearCells As String
乙
With Hsheet nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row End With
这段代码所做的是试图find列A中有数据的最后一行,然后向下偏移一行,以获得下一个空行,以便写入它。
这里提到了另一种写同样的东西的方法所以上面的代码也可以写成
With Hsheet nextRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1 End With
C
With Isheet Set myRng = .Range(MyCopy) If Application.CountA(myRng) <> myRng.Cells.Count Then MsgBox "Please fill in all the cells!" Exit Sub End If End With
我相信MyCopy
应该具有一些我在代码中看不到的价值。 假设它拥有一个有效的单元格地址,代码要做的是确保通过比较单元格数量和填满的单元格数量来填满所有的单元格。
d
With Hsheet .Cells(NextRow, "a").Value = Application.UserName oCol = 1 For Each myCell In MyRng.Cells Hsheet.Cells(NextRow, oCol).Value = myCell.Value oCol = oCol + 1 Next myCell End With
这也很简单。 该代码将UserName
存储在Col A中的下一个可用单元格中,然后将Range MyRng中的值存储在表格Isheet
A中的表格中
HTH