我正在尝试构建一个基于excel的输入表单,我在网上找到了一些东西,我正在尝试理解这些代码:
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
答案 0 :(得分:4)
我可以解释一下代码的作用,但我想提及的内容很少:)
<强> A 强>
Dim Hsheet,Isheet As Worksheet
Dim NextRow, oCol As Long
Dim MyRng, MyCell As Range
Dim MyCopy, ClearCells As String
这不是声明变量/对象的正确方法例如,如果您认为此行是
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
这段代码的作用是它试图在Col A中找到包含数据的最后一行,然后向下偏移一行以获得下一个空行,以便你可以写入它。
提到写同一件事的另一种方法是here所以上面的代码也可以写成
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中的下一个可用单元格中,然后将工作表Isheet
中的范围Hsheet
中的Range MyRng中的值存储在<{1}}
HTH
答案 1 :(得分:0)
您的代码似乎从一张表到另一张表进行了一些复制,在一个范围之上添加了用户名
但是,字符串变量MyCopy
似乎没有初始化,因此我不认为按原样运行此宏会产生任何所需的结果(除非Range
函数在使用空字符串调用时返回一些单元格?我不知道它的规格)。
我完全不记得Excel VBA,但我认为:
Cells(.Rows.Count, "A")
选择位于最后一行的单元格“A”列
End(xlUp)
将选择移动到连续的非空单元格范围的顶部(例如,在Excel中按CTRL + UP
)。
Offset(1, 0)
将选择移动到底部的一个单元格。
Row
返回该单元格的行号。
因此,您的第一个代码块将A列中最后一系列非空单元格的第二行的行号设置为变量nextRow
。
您可以按照相同的推理来理解所有其他代码块的用途。我建议您搜索MSDN的VBA for Excel文档网站,以获取有关您尚不了解的每个功能的含义的更多信息。