Excel VBA代码理解

时间:2013-01-01 19:06:32

标签: forms excel vba excel-vba

我正在尝试构建一个基于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

2 个答案:

答案 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被声明为工作表,而不是HsheetHsheet自动成为变体。正确的方法是

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文档网站,以获取有关您尚不了解的每个功能的含义的更多信息。